From: edison Date: Mon, 16 Dec 2024 06:18:27 +0000 (+0800) Subject: fix(vapor/defineProps): register type bindings before compile template + props destru... X-Git-Tag: v3.6.0-alpha.1~16^2~144 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e79a6df093eafd673ddd5f1d1b008ee33d28f02f;p=thirdparty%2Fvuejs%2Fcore.git fix(vapor/defineProps): register type bindings before compile template + props destructure work with vapor (#12545) --- 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 1044b0e167..d8ce62ecd2 100644 --- a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/definePropsDestructure.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/definePropsDestructure.spec.ts.snap @@ -117,6 +117,8 @@ return () => {} exports[`sfc reactive props destructure > default values w/ type declaration & key is string 1`] = ` "import { defineComponent as _defineComponent } from 'vue' +import { toDisplayString as _toDisplayString } from "vue" + export default /*@__PURE__*/_defineComponent({ props: { @@ -129,7 +131,9 @@ export default /*@__PURE__*/_defineComponent({ -return () => {} +return (_ctx: any,_cache: any) => { + return _toDisplayString(__props.foo) +} } })" diff --git a/packages/compiler-sfc/__tests__/compileScript/definePropsDestructure.spec.ts b/packages/compiler-sfc/__tests__/compileScript/definePropsDestructure.spec.ts index 50602eb59b..e58aed1d3d 100644 --- a/packages/compiler-sfc/__tests__/compileScript/definePropsDestructure.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/definePropsDestructure.spec.ts @@ -155,6 +155,7 @@ describe('sfc reactive props destructure', () => { "onUpdate:modelValue": (val: number) => void // double-quoted string containing symbols }>() + `) expect(bindings).toStrictEqual({ __propsAliases: { @@ -173,6 +174,7 @@ describe('sfc reactive props destructure', () => { "foo:bar": { type: String, required: true, default: 'foo-bar' }, "onUpdate:modelValue": { type: Function, required: true } },`) + expect(content).toMatch(`__props.foo`) assertCode(content) }) diff --git a/packages/compiler-sfc/src/script/defineProps.ts b/packages/compiler-sfc/src/script/defineProps.ts index 9a4880a1a5..ac5226168e 100644 --- a/packages/compiler-sfc/src/script/defineProps.ts +++ b/packages/compiler-sfc/src/script/defineProps.ts @@ -79,6 +79,15 @@ export function processDefineProps( ) } ctx.propsTypeDecl = node.typeParameters.params[0] + // register bindings + const { props } = resolveTypeElements(ctx, ctx.propsTypeDecl) + if (props) { + for (const key in props) { + if (!(key in ctx.bindingMetadata)) { + ctx.bindingMetadata[key] = BindingTypes.PROPS + } + } + } } // handle props destructure @@ -190,10 +199,6 @@ export function extractRuntimeProps( for (const prop of props) { propStrings.push(genRuntimePropFromType(ctx, prop, hasStaticDefaults)) - // register bindings - if ('bindingMetadata' in ctx && !(prop.key in ctx.bindingMetadata)) { - ctx.bindingMetadata[prop.key] = BindingTypes.PROPS - } } let propsDecls = `{ diff --git a/packages/compiler-vapor/src/generators/expression.ts b/packages/compiler-vapor/src/generators/expression.ts index 69274aab56..990659b84e 100644 --- a/packages/compiler-vapor/src/generators/expression.ts +++ b/packages/compiler-vapor/src/generators/expression.ts @@ -1,4 +1,4 @@ -import { isGloballyAllowed } from '@vue/shared' +import { genPropsAccessExp, isGloballyAllowed } from '@vue/shared' import { BindingTypes, NewlineType, @@ -164,6 +164,12 @@ function genIdentifier( ? `${helper('isRef')}(${raw}) ? (${raw}.value = ${assignment}) : null` : unref() break + case BindingTypes.PROPS: + raw = genPropsAccessExp(raw) + break + case BindingTypes.PROPS_ALIASED: + raw = genPropsAccessExp(bindingMetadata.__propsAliases![raw]) + break default: raw = withAssignment(raw) }