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

fix(reactivity): computed should not trigger scheduler if stopped

fix #4149
Evan You 4 лет назад
Родитель
Сommit
6eb47f000a

+ 20 - 0
packages/reactivity/__tests__/computed.spec.ts

@@ -466,5 +466,25 @@ describe('reactivity/computed', () => {
       await tick
       expect(effectSpy).toHaveBeenCalledTimes(2)
     })
+
+    test('should not compute if deactivated before scheduler is called', async () => {
+      const c1Spy = jest.fn()
+      const src = ref(0)
+      const c1 = computed(() => {
+        c1Spy()
+        return src.value % 2
+      })
+      effect(() => c1.value)
+      expect(c1Spy).toHaveBeenCalledTimes(1)
+
+      // schedule stop
+      schedule(() => {
+        c1.effect.stop()
+      })
+      // trigger
+      src.value++
+      await tick
+      expect(c1Spy).toHaveBeenCalledTimes(1)
+    })
   })
 })

+ 1 - 1
packages/reactivity/src/computed.ts

@@ -58,7 +58,7 @@ class ComputedRefImpl<T> {
           scheduled = true
           hasCompareTarget = false
           scheduler(() => {
-            if (this._get() !== valueToCompare) {
+            if (this.effect.active && this._get() !== valueToCompare) {
               triggerRefValue(this)
             }
             scheduled = false