]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(watch): should trigger watcher callback on triggerRef when watching ref source
authorEvan You <yyx990803@gmail.com>
Thu, 30 Jul 2020 22:29:38 +0000 (18:29 -0400)
committerEvan You <yyx990803@gmail.com>
Thu, 30 Jul 2020 22:29:38 +0000 (18:29 -0400)
fix #1736

packages/runtime-core/__tests__/apiWatch.spec.ts
packages/runtime-core/src/apiWatch.ts

index 951f2ba0ab56d7dc55bcb0b9a6bb13f9e94f3829..97f686ad995a567ad6ff5e2befe272fa75cd7b81 100644 (file)
@@ -12,7 +12,8 @@ import {
   ITERATE_KEY,
   DebuggerEvent,
   TrackOpTypes,
-  TriggerOpTypes
+  TriggerOpTypes,
+  triggerRef
 } from '@vue/reactivity'
 
 // reference: https://vue-composition-api-rfc.netlify.com/api.html#watch
@@ -637,4 +638,27 @@ describe('api: watch', () => {
     v.value++
     expect(calls).toBe(1)
   })
+
+  test('should force trigger on triggerRef when watching a ref', async () => {
+    const v = ref({ a: 1 })
+    let sideEffect = 0
+    watch(v, obj => {
+      sideEffect = obj.a
+    })
+
+    v.value = v.value
+    await nextTick()
+    // should not trigger
+    expect(sideEffect).toBe(0)
+
+    v.value.a++
+    await nextTick()
+    // should not trigger
+    expect(sideEffect).toBe(0)
+
+    triggerRef(v)
+    await nextTick()
+    // should trigger now
+    expect(sideEffect).toBe(2)
+  })
 })
index 15c9e3e50006853b9edd34901944e10c8ac5f284..1e639d25b89ff9538fbc62df7283d3be16a8e4f9 100644 (file)
@@ -159,8 +159,9 @@ function doWatch(
   }
 
   let getter: () => any
-  if (isRef(source)) {
-    getter = () => source.value
+  const isRefSource = isRef(source)
+  if (isRefSource) {
+    getter = () => (source as Ref).value
   } else if (isReactive(source)) {
     getter = () => source
     deep = true
@@ -239,7 +240,7 @@ function doWatch(
     if (cb) {
       // watch(source, cb)
       const newValue = runner()
-      if (deep || hasChanged(newValue, oldValue)) {
+      if (deep || isRefSource || hasChanged(newValue, oldValue)) {
         // cleanup before running cb again
         if (cleanup) {
           cleanup()