Przeglądaj źródła

fix(watch): fix watchers triggered in mounted hook

fix #12624
Evan You 3 lat temu
rodzic
commit
8904ca77c2
2 zmienionych plików z 22 dodań i 2 usunięć
  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 {
   } else {
     // pre
     // pre
     watcher.update = () => {
     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 = [])
         const buffer = instance._preWatchers || (instance._preWatchers = [])
         if (buffer.indexOf(watcher) < 0) buffer.push(watcher)
         if (buffer.indexOf(watcher) < 0) buffer.push(watcher)
       } else {
       } else {

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

@@ -1116,4 +1116,24 @@ describe('api: watch', () => {
     await nextTick()
     await nextTick()
     expect(order).toMatchObject([`mounted`, `watcher`])
     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)
+  })
 })
 })