Skip to content

Commit

Permalink
fix(watch): handle errors in computed used as watch source (#11626)
Browse files Browse the repository at this point in the history
close #11624
  • Loading branch information
Jak-Ch-ll authored Aug 16, 2024
1 parent c42919a commit 8bcaad4
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 1 deletion.
37 changes: 37 additions & 0 deletions packages/runtime-core/__tests__/errorHandling.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
})
5 changes: 4 additions & 1 deletion packages/runtime-core/src/apiWatch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 8bcaad4

Please sign in to comment.