From: edison Date: Wed, 8 May 2024 23:43:17 +0000 (+0800) Subject: fix(compile-sfc): register props destructure rest id as setup bindings (#10888) X-Git-Tag: v3.4.28~100 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b2b5f57c2c945edd0eebc1b545ec1b7568e51484;p=thirdparty%2Fvuejs%2Fcore.git fix(compile-sfc): register props destructure rest id as setup bindings (#10888) close #10885 --- diff --git a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/definePropsDestructure.spec.ts.snap b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/definePropsDestructure.spec.ts.snap index 8b5325cc3c..7bf0597cc3 100644 --- a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/definePropsDestructure.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/definePropsDestructure.spec.ts.snap @@ -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 } +} + +}" +`; diff --git a/packages/compiler-sfc/__tests__/compileScript/definePropsDestructure.spec.ts b/packages/compiler-sfc/__tests__/compileScript/definePropsDestructure.spec.ts index 3843ef9219..ecc7a09d01 100644 --- a/packages/compiler-sfc/__tests__/compileScript/definePropsDestructure.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/definePropsDestructure.spec.ts @@ -265,6 +265,27 @@ describe('sfc reactive props destructure', () => { }) }) + test('rest spread non-inline', () => { + const { content, bindings } = compile( + ` + + + `, + { 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(` diff --git a/packages/compiler-sfc/src/compileScript.ts b/packages/compiler-sfc/src/compileScript.ts index d4131d5c61..31bee3af74 100644 --- a/packages/compiler-sfc/src/compileScript.ts +++ b/packages/compiler-sfc/src/compileScript.ts @@ -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 &&