Browse Source
fix(ssr): reset current instance if setting up options component errors (#7743)
close #7733
pull/8392/head
Simon Johansson
2 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
50 additions and
3 deletions
-
packages/runtime-core/src/component.ts
-
packages/server-renderer/__tests__/render.spec.ts
|
|
@ -903,9 +903,12 @@ export function finishComponentSetup( |
|
|
|
if (__FEATURE_OPTIONS_API__ && !(__COMPAT__ && skipOptions)) { |
|
|
|
setCurrentInstance(instance) |
|
|
|
pauseTracking() |
|
|
|
applyOptions(instance) |
|
|
|
resetTracking() |
|
|
|
unsetCurrentInstance() |
|
|
|
try { |
|
|
|
applyOptions(instance) |
|
|
|
} finally { |
|
|
|
resetTracking() |
|
|
|
unsetCurrentInstance() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// warn missing template/render
|
|
|
|
|
|
@ -793,6 +793,50 @@ function testRender(type: string, render: typeof renderToString) { |
|
|
|
} catch {} |
|
|
|
expect(getCurrentInstance()).toBe(prev) |
|
|
|
}) |
|
|
|
|
|
|
|
// #7733
|
|
|
|
test('reset current instance after error in data', async () => { |
|
|
|
const prev = getCurrentInstance() |
|
|
|
expect(prev).toBe(null) |
|
|
|
try { |
|
|
|
await render( |
|
|
|
createApp({ |
|
|
|
data() { |
|
|
|
throw new Error() |
|
|
|
}, |
|
|
|
template: `<div>hello</div>` |
|
|
|
}) |
|
|
|
) |
|
|
|
} catch {} |
|
|
|
expect(getCurrentInstance()).toBe(null) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|
|
|
|
// #7733
|
|
|
|
test('reset current instance after error in errorCaptured', async () => { |
|
|
|
const prev = getCurrentInstance() |
|
|
|
|
|
|
|
expect(prev).toBe(null) |
|
|
|
|
|
|
|
const Child = { |
|
|
|
created() { |
|
|
|
throw new Error() |
|
|
|
} |
|
|
|
} |
|
|
|
try { |
|
|
|
await render( |
|
|
|
createApp({ |
|
|
|
errorCaptured() { |
|
|
|
throw new Error() |
|
|
|
}, |
|
|
|
render: () => h(Child) |
|
|
|
}) |
|
|
|
) |
|
|
|
} catch {} |
|
|
|
expect( |
|
|
|
'Unhandled error during execution of errorCaptured hook' |
|
|
|
).toHaveBeenWarned() |
|
|
|
expect(getCurrentInstance()).toBe(null) |
|
|
|
}) |
|
|
|
|
|
|
|
test('serverPrefetch', async () => { |
|
|
|