Skip to content

Commit 4d51702

Browse files
committed
fix: trigger when adding new property with Vue.seta and piWatch test
1 parent a9ca2d8 commit 4d51702

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

src/v3/apiWatch.ts

+11-2
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,17 @@ function doWatch(
218218
})
219219
} else if (isFunction(source)) {
220220
if (cb) {
221-
// getter with cb
222-
getter = () => call(source, WATCHER_GETTER)
221+
const ob = call(source, WATCHER_GETTER)
222+
if (isReactive(ob)){
223+
getter = () => {
224+
;(ob as any).__ob__.dep.depend()
225+
return ob
226+
}
227+
deep = true
228+
} else {
229+
// getter with cb
230+
getter = () => ob
231+
}
223232
} else {
224233
// no cb -> simple effect
225234
getter = () => {

test/unit/features/v3/apiWatch.spec.ts

+11
Original file line numberDiff line numberDiff line change
@@ -1200,4 +1200,15 @@ describe('api: watch', () => {
12001200
expect(parentSpy).toHaveBeenCalledTimes(1)
12011201
expect(childSpy).toHaveBeenCalledTimes(1)
12021202
})
1203+
1204+
// #12967
1205+
test('trigger when adding new property with Vue.set', async () => {
1206+
const spy = vi.fn()
1207+
const r = reactive({ exist: 5 })
1208+
watch(() => r, spy, { deep: true })
1209+
set(r, 'add', 1)
1210+
1211+
await nextTick()
1212+
expect(spy).toHaveBeenCalledTimes(1)
1213+
})
12031214
})

0 commit comments

Comments
 (0)