fix(watch): handle errors in computed used as watch source (#11626)

close #11624
This commit is contained in:
Jakob 2024-08-16 10:14:08 +02:00 committed by GitHub
parent c42919a0f6
commit 8bcaad4a32
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 41 additions and 1 deletions

View File

@ -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
})

View File

@ -400,7 +400,10 @@ function doWatch(
} else {
// default: 'pre'
job.flags! |= SchedulerJobFlags.PRE
if (instance) job.id = instance.uid
if (instance) {
job.id = instance.uid
job.i = instance
}
scheduler = () => queueJob(job)
}
effect.scheduler = scheduler