mirror of https://github.com/vuejs/core.git
fix(watch): handle errors in computed used as watch source (#11626)
close #11624
This commit is contained in:
parent
c42919a0f6
commit
8bcaad4a32
|
@ -670,5 +670,42 @@ describe('error handling', () => {
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// #11624
|
||||||
|
test('in computed that is used as key for watch', async () => {
|
||||||
|
const err = new Error('foo')
|
||||||
|
const fn = vi.fn()
|
||||||
|
const trigger = ref(false)
|
||||||
|
|
||||||
|
const Comp = {
|
||||||
|
setup() {
|
||||||
|
onErrorCaptured((err, instance, info) => {
|
||||||
|
fn(err, info)
|
||||||
|
return false
|
||||||
|
})
|
||||||
|
return () => h(Child)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const Child = {
|
||||||
|
setup() {
|
||||||
|
const foo = computed(() => {
|
||||||
|
if (trigger.value) throw err
|
||||||
|
return 1
|
||||||
|
})
|
||||||
|
watch(foo, () => {})
|
||||||
|
return () => null
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
render(h(Comp), nodeOps.createElement('div'))
|
||||||
|
|
||||||
|
trigger.value = true
|
||||||
|
await nextTick()
|
||||||
|
expect(fn).toHaveBeenCalledWith(
|
||||||
|
err,
|
||||||
|
ErrorTypeStrings[ErrorCodes.COMPONENT_UPDATE],
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
// native event handler handling should be tested in respective renderers
|
// native event handler handling should be tested in respective renderers
|
||||||
})
|
})
|
||||||
|
|
|
@ -400,7 +400,10 @@ function doWatch(
|
||||||
} else {
|
} else {
|
||||||
// default: 'pre'
|
// default: 'pre'
|
||||||
job.flags! |= SchedulerJobFlags.PRE
|
job.flags! |= SchedulerJobFlags.PRE
|
||||||
if (instance) job.id = instance.uid
|
if (instance) {
|
||||||
|
job.id = instance.uid
|
||||||
|
job.i = instance
|
||||||
|
}
|
||||||
scheduler = () => queueJob(job)
|
scheduler = () => queueJob(job)
|
||||||
}
|
}
|
||||||
effect.scheduler = scheduler
|
effect.scheduler = scheduler
|
||||||
|
|
Loading…
Reference in New Issue