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

fix(watch): `once` option should be ignored by watchEffect (#11884)

Yang Mingshan 1 год назад
Родитель
Сommit
49fa673493
2 измененных файлов с 21 добавлено и 13 удалено
  1. 16 0
      packages/reactivity/__tests__/watch.spec.ts
  2. 5 13
      packages/reactivity/src/watch.ts

+ 16 - 0
packages/reactivity/__tests__/watch.spec.ts

@@ -193,4 +193,20 @@ describe('watch', () => {
     scope.stop()
     expect(calls).toEqual(['sync 2', 'post 2'])
   })
+
+  test('once option should be ignored by simple watch', async () => {
+    let dummy: any
+    const source = ref(0)
+    watch(
+      () => {
+        dummy = source.value
+      },
+      null,
+      { once: true },
+    )
+    expect(dummy).toBe(0)
+
+    source.value++
+    expect(dummy).toBe(1)
+  })
 })

+ 5 - 13
packages/reactivity/src/watch.ts

@@ -218,19 +218,11 @@ export function watch(
     }
   }
 
-  if (once) {
-    if (cb) {
-      const _cb = cb
-      cb = (...args) => {
-        _cb(...args)
-        watchHandle()
-      }
-    } else {
-      const _getter = getter
-      getter = () => {
-        _getter()
-        watchHandle()
-      }
+  if (once && cb) {
+    const _cb = cb
+    cb = (...args) => {
+      _cb(...args)
+      watchHandle()
     }
   }