refactor: small bundle size / readability optimization
This commit is contained in:
parent
64310405ac
commit
b2554aefba
@ -1,5 +1,5 @@
|
|||||||
import { TrackOpTypes, TriggerOpTypes } from './operations'
|
import { TrackOpTypes, TriggerOpTypes } from './operations'
|
||||||
import { EMPTY_OBJ, isArray, isIntegerKey, isMap } from '@vue/shared'
|
import { EMPTY_OBJ, extend, isArray, isIntegerKey, isMap } from '@vue/shared'
|
||||||
|
|
||||||
// The main WeakMap that stores {target -> key -> dep} connections.
|
// The main WeakMap that stores {target -> key -> dep} connections.
|
||||||
// Conceptually, it's easier to think of a dependency as a Dep class
|
// Conceptually, it's easier to think of a dependency as a Dep class
|
||||||
@ -212,47 +212,47 @@ export function trigger(
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let sets: DepSets = []
|
let deps: (Dep | undefined)[] = []
|
||||||
if (type === TriggerOpTypes.CLEAR) {
|
if (type === TriggerOpTypes.CLEAR) {
|
||||||
// collection being cleared
|
// collection being cleared
|
||||||
// trigger all effects for target
|
// trigger all effects for target
|
||||||
sets = [...depsMap.values()]
|
deps = [...depsMap.values()]
|
||||||
} else if (key === 'length' && isArray(target)) {
|
} else if (key === 'length' && isArray(target)) {
|
||||||
depsMap.forEach((dep, key) => {
|
depsMap.forEach((dep, key) => {
|
||||||
if (key === 'length' || key >= (newValue as number)) {
|
if (key === 'length' || key >= (newValue as number)) {
|
||||||
sets.push(dep)
|
deps.push(dep)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// schedule runs for SET | ADD | DELETE
|
// schedule runs for SET | ADD | DELETE
|
||||||
if (key !== void 0) {
|
if (key !== void 0) {
|
||||||
sets.push(depsMap.get(key))
|
deps.push(depsMap.get(key))
|
||||||
}
|
}
|
||||||
|
|
||||||
// also run for iteration key on ADD | DELETE | Map.SET
|
// also run for iteration key on ADD | DELETE | Map.SET
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TriggerOpTypes.ADD:
|
case TriggerOpTypes.ADD:
|
||||||
if (!isArray(target)) {
|
if (!isArray(target)) {
|
||||||
sets.push(depsMap.get(ITERATE_KEY))
|
deps.push(depsMap.get(ITERATE_KEY))
|
||||||
if (isMap(target)) {
|
if (isMap(target)) {
|
||||||
sets.push(depsMap.get(MAP_KEY_ITERATE_KEY))
|
deps.push(depsMap.get(MAP_KEY_ITERATE_KEY))
|
||||||
}
|
}
|
||||||
} else if (isIntegerKey(key)) {
|
} else if (isIntegerKey(key)) {
|
||||||
// new index added to array -> length changes
|
// new index added to array -> length changes
|
||||||
sets.push(depsMap.get('length'))
|
deps.push(depsMap.get('length'))
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case TriggerOpTypes.DELETE:
|
case TriggerOpTypes.DELETE:
|
||||||
if (!isArray(target)) {
|
if (!isArray(target)) {
|
||||||
sets.push(depsMap.get(ITERATE_KEY))
|
deps.push(depsMap.get(ITERATE_KEY))
|
||||||
if (isMap(target)) {
|
if (isMap(target)) {
|
||||||
sets.push(depsMap.get(MAP_KEY_ITERATE_KEY))
|
deps.push(depsMap.get(MAP_KEY_ITERATE_KEY))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
case TriggerOpTypes.SET:
|
case TriggerOpTypes.SET:
|
||||||
if (isMap(target)) {
|
if (isMap(target)) {
|
||||||
sets.push(depsMap.get(ITERATE_KEY))
|
deps.push(depsMap.get(ITERATE_KEY))
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -261,51 +261,37 @@ export function trigger(
|
|||||||
const eventInfo = __DEV__
|
const eventInfo = __DEV__
|
||||||
? { target, type, key, newValue, oldValue, oldTarget }
|
? { target, type, key, newValue, oldValue, oldTarget }
|
||||||
: undefined
|
: undefined
|
||||||
triggerMultiEffects(sets, eventInfo)
|
|
||||||
}
|
|
||||||
|
|
||||||
type DepSets = (Dep | undefined)[]
|
if (deps.length === 1) {
|
||||||
|
if (deps[0]) {
|
||||||
export function triggerMultiEffects(
|
triggerEffects(deps[0], eventInfo)
|
||||||
depSets: DepSets,
|
|
||||||
debuggerEventExtraInfo?: DebuggerEventExtraInfo
|
|
||||||
) {
|
|
||||||
if (depSets.length === 1) {
|
|
||||||
if (depSets[0]) {
|
|
||||||
triggerEffects(depSets[0], debuggerEventExtraInfo)
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const sets = depSets.filter(s => !!s) as Dep[]
|
const effects: ReactiveEffect[] = []
|
||||||
triggerEffects(concatSets(sets), debuggerEventExtraInfo)
|
for (const dep of deps) {
|
||||||
|
if (dep) {
|
||||||
|
effects.push(...dep)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
triggerEffects(new Set(effects), eventInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function concatSets<T>(sets: Set<T>[]): Set<T> {
|
|
||||||
const all = ([] as T[]).concat(...sets.map(s => [...s!]))
|
|
||||||
return new Set(all)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function triggerEffects(
|
export function triggerEffects(
|
||||||
dep: Dep,
|
dep: Dep,
|
||||||
debuggerEventExtraInfo?: DebuggerEventExtraInfo
|
debuggerEventExtraInfo?: DebuggerEventExtraInfo
|
||||||
) {
|
) {
|
||||||
const run = (effect: ReactiveEffect) => {
|
// spread into array for stabilization
|
||||||
if (__DEV__ && effect.options.onTrigger) {
|
for (const effect of [...dep]) {
|
||||||
effect.options.onTrigger(
|
if (effect !== activeEffect || effect.allowRecurse) {
|
||||||
Object.assign({ effect }, debuggerEventExtraInfo)
|
if (__DEV__ && effect.options.onTrigger) {
|
||||||
)
|
effect.options.onTrigger(extend({ effect }, debuggerEventExtraInfo))
|
||||||
}
|
}
|
||||||
if (effect.options.scheduler) {
|
if (effect.options.scheduler) {
|
||||||
effect.options.scheduler(effect)
|
effect.options.scheduler(effect)
|
||||||
} else {
|
} else {
|
||||||
effect()
|
effect()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const immutableDeps = [...dep]
|
|
||||||
immutableDeps.forEach(effect => {
|
|
||||||
if (effect !== activeEffect || effect.allowRecurse) {
|
|
||||||
run(effect)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
@ -38,28 +38,34 @@ type RefBase<T> = {
|
|||||||
export function trackRefValue(ref: RefBase<any>) {
|
export function trackRefValue(ref: RefBase<any>) {
|
||||||
if (isTracking()) {
|
if (isTracking()) {
|
||||||
ref = toRaw(ref)
|
ref = toRaw(ref)
|
||||||
const eventInfo = __DEV__
|
|
||||||
? { target: ref, type: TrackOpTypes.GET, key: 'value' }
|
|
||||||
: undefined
|
|
||||||
if (!ref.dep) {
|
if (!ref.dep) {
|
||||||
ref.dep = new Set<ReactiveEffect>()
|
ref.dep = new Set<ReactiveEffect>()
|
||||||
}
|
}
|
||||||
trackEffects(ref.dep, eventInfo)
|
if (__DEV__) {
|
||||||
|
trackEffects(ref.dep, {
|
||||||
|
target: ref,
|
||||||
|
type: TrackOpTypes.GET,
|
||||||
|
key: 'value'
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
trackEffects(ref.dep)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function triggerRefValue(ref: RefBase<any>, newVal?: any) {
|
export function triggerRefValue(ref: RefBase<any>, newVal?: any) {
|
||||||
ref = toRaw(ref)
|
ref = toRaw(ref)
|
||||||
if (ref.dep) {
|
if (ref.dep) {
|
||||||
const eventInfo = __DEV__
|
if (__DEV__) {
|
||||||
? {
|
triggerEffects(ref.dep, {
|
||||||
target: ref,
|
target: ref,
|
||||||
type: TriggerOpTypes.SET,
|
type: TriggerOpTypes.SET,
|
||||||
key: 'value',
|
key: 'value',
|
||||||
newValue: newVal
|
newValue: newVal
|
||||||
}
|
})
|
||||||
: undefined
|
} else {
|
||||||
triggerEffects(ref.dep, eventInfo)
|
triggerEffects(ref.dep)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user