Просмотр исходного кода

refactor: remove isTracking() method

Evan You 4 лет назад
Родитель
Сommit
a51f935b72
2 измененных файлов с 25 добавлено и 28 удалено
  1. 16 21
      packages/reactivity/src/effect.ts
  2. 9 7
      packages/reactivity/src/ref.ts

+ 16 - 21
packages/reactivity/src/effect.ts

@@ -45,7 +45,7 @@ export type DebuggerEventExtraInfo = {
   oldTarget?: Map<any, any> | Set<any>
 }
 
-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()))
-  }
-
-  const eventInfo = __DEV__
-    ? { effect: activeEffect, target, type, key }
-    : undefined
+  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()))
+    }
 
-  trackEffects(dep, eventInfo)
-}
+    const eventInfo = __DEV__
+      ? { effect: activeEffect, target, type, key }
+      : undefined
 
-export function isTracking() {
-  return shouldTrack && !!activeEffect
+    trackEffects(dep, eventInfo)
+  }
 }
 
 export function trackEffects(

+ 9 - 7
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<T> = {
 }
 
 export function trackRefValue(ref: RefBase<any>) {
-  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()))
     }
   }
 }