瀏覽代碼

fix(watch): fix watchers triggered in mounted hook

fix #12624
Evan You 3 年之前
父節點
當前提交
8904ca77c2
共有 2 個文件被更改,包括 22 次插入2 次删除
  1. 2 2
      src/v3/apiWatch.ts
  2. 20 0
      test/unit/features/v3/apiWatch.spec.ts

+ 2 - 2
src/v3/apiWatch.ts

@@ -320,8 +320,8 @@ function doWatch(
   } else {
     // pre
     watcher.update = () => {
-      if (instance && instance === currentInstance) {
-        // pre-watcher triggered inside setup()
+      if (instance && instance === currentInstance && !instance._isMounted) {
+        // pre-watcher triggered before
         const buffer = instance._preWatchers || (instance._preWatchers = [])
         if (buffer.indexOf(watcher) < 0) buffer.push(watcher)
       } else {

+ 20 - 0
test/unit/features/v3/apiWatch.spec.ts

@@ -1116,4 +1116,24 @@ describe('api: watch', () => {
     await nextTick()
     expect(order).toMatchObject([`mounted`, `watcher`])
   })
+
+  // #12624
+  test('pre watch triggered in mounted hook', async () => {
+    const spy = vi.fn()
+    new Vue({
+      setup() {
+        const c = ref(0)
+
+        onMounted(() => {
+          c.value++
+        })
+
+        watchEffect(() => spy(c.value))
+        return () => {}
+      }
+    }).$mount()
+    expect(spy).toHaveBeenCalledTimes(1)
+    await nextTick()
+    expect(spy).toHaveBeenCalledTimes(2)
+  })
 })