fix(compile-sfc): register props destructure rest id as setup bindings (#10888)

close #10885
This commit is contained in:
edison 2024-05-09 07:43:17 +08:00 committed by GitHub
parent 461946175d
commit b2b5f57c2c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 44 additions and 1 deletions

View File

@ -304,3 +304,19 @@ return () => {}
}"
`;
exports[`sfc reactive props destructure > rest spread non-inline 1`] = `
"import { createPropsRestProxy as _createPropsRestProxy } from 'vue'
export default {
props: ['foo', 'bar'],
setup(__props, { expose: __expose }) {
__expose();
const rest = _createPropsRestProxy(__props, ["foo"])
return { rest }
}
}"
`;

View File

@ -265,6 +265,27 @@ describe('sfc reactive props destructure', () => {
})
})
test('rest spread non-inline', () => {
const { content, bindings } = compile(
`
<script setup>
const { foo, ...rest } = defineProps(['foo', 'bar'])
</script>
<template>{{ rest.bar }}</template>
`,
{ inlineTemplate: false },
)
expect(content).toMatch(
`const rest = _createPropsRestProxy(__props, ["foo"])`,
)
assertCode(content)
expect(bindings).toStrictEqual({
foo: BindingTypes.PROPS,
bar: BindingTypes.PROPS,
rest: BindingTypes.SETUP_REACTIVE_CONST,
})
})
// #6960
test('computed static key', () => {
const { content, bindings } = compile(`

View File

@ -523,8 +523,14 @@ export function compileScript(
)
}
// defineProps / defineEmits
// defineProps
const isDefineProps = processDefineProps(ctx, init, decl.id)
if (ctx.propsDestructureRestId) {
setupBindings[ctx.propsDestructureRestId] =
BindingTypes.SETUP_REACTIVE_CONST
}
// defineEmits
const isDefineEmits =
!isDefineProps && processDefineEmits(ctx, init, decl.id)
!isDefineEmits &&