Преглед изворни кода

fix(watch): update `oldValue` before running `cb` to prevent stale value (#12296)

close #12294
Tycho пре 11 месеци
родитељ
комит
c69c4bb59c
2 измењених фајлова са 13 додато и 1 уклоњено
  1. 12 0
      packages/reactivity/__tests__/watch.spec.ts
  2. 1 1
      packages/reactivity/src/watch.ts

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

@@ -277,4 +277,16 @@ describe('watch', () => {
 
     expect(dummy).toEqual([1, 2, 3])
   })
+
+  test('watch with immediate reset and sync flush', () => {
+    const value = ref(false)
+
+    watch(value, () => {
+      value.value = false
+    })
+
+    value.value = true
+    value.value = true
+    expect(value.value).toBe(false)
+  })
 })

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

@@ -264,11 +264,11 @@ export function watch(
                 : oldValue,
             boundCleanup,
           ]
+          oldValue = newValue
           call
             ? call(cb!, WatchErrorCodes.WATCH_CALLBACK, args)
             : // @ts-expect-error
               cb!(...args)
-          oldValue = newValue
         } finally {
           activeWatcher = currentWatcher
         }