diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 892eef10..61894ebc 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -45,7 +45,7 @@ export type DebuggerEventExtraInfo = { oldTarget?: Map | Set } -let activeEffect: ReactiveEffect | undefined +export let activeEffect: ReactiveEffect | undefined export const ITERATE_KEY = Symbol(__DEV__ ? 'iterate' : '') export const MAP_KEY_ITERATE_KEY = Symbol(__DEV__ ? 'Map key iterate' : '') @@ -181,7 +181,7 @@ export function stop(runner: ReactiveEffectRunner) { runner.effect.stop() } -let shouldTrack = true +export let shouldTrack = true const trackStack: boolean[] = [] export function pauseTracking() { @@ -200,27 +200,22 @@ export function resetTracking() { } export function track(target: object, type: TrackOpTypes, key: unknown) { - if (!isTracking()) { - return - } - let depsMap = targetMap.get(target) - if (!depsMap) { - targetMap.set(target, (depsMap = new Map())) - } - let dep = depsMap.get(key) - if (!dep) { - depsMap.set(key, (dep = createDep())) - } + if (shouldTrack && activeEffect) { + let depsMap = targetMap.get(target) + if (!depsMap) { + targetMap.set(target, (depsMap = new Map())) + } + let dep = depsMap.get(key) + if (!dep) { + depsMap.set(key, (dep = createDep())) + } - const eventInfo = __DEV__ - ? { effect: activeEffect, target, type, key } - : undefined + const eventInfo = __DEV__ + ? { effect: activeEffect, target, type, key } + : undefined - trackEffects(dep, eventInfo) -} - -export function isTracking() { - return shouldTrack && !!activeEffect + trackEffects(dep, eventInfo) + } } export function trackEffects( diff --git a/packages/reactivity/src/ref.ts b/packages/reactivity/src/ref.ts index d9ff17ac..22dd432b 100644 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@ -1,4 +1,9 @@ -import { isTracking, trackEffects, triggerEffects } from './effect' +import { + activeEffect, + shouldTrack, + trackEffects, + triggerEffects +} from './effect' import { TrackOpTypes, TriggerOpTypes } from './operations' import { isArray, hasChanged, IfAny } from '@vue/shared' import { isProxy, toRaw, isReactive, toReactive } from './reactive' @@ -24,19 +29,16 @@ type RefBase = { } export function trackRefValue(ref: RefBase) { - if (isTracking()) { + if (shouldTrack && activeEffect) { ref = toRaw(ref) - if (!ref.dep) { - ref.dep = createDep() - } if (__DEV__) { - trackEffects(ref.dep, { + trackEffects(ref.dep || (ref.dep = createDep()), { target: ref, type: TrackOpTypes.GET, key: 'value' }) } else { - trackEffects(ref.dep) + trackEffects(ref.dep || (ref.dep = createDep())) } } }