fix(reactivity-transform): fix props access codegen for non-identifier prop names (#5436)

fix #5425
This commit is contained in:
edison
2022-05-13 10:38:46 +08:00
committed by GitHub
parent 0c07f12541
commit 242914d938
6 changed files with 69 additions and 10 deletions

View File

@@ -134,6 +134,25 @@ return () => {}
}"
`;
exports[`sfc props transform non-identifier prop names 1`] = `
"import { toDisplayString as _toDisplayString } from \\"vue\\"
export default {
props: { 'foo.bar': Function },
setup(__props) {
let x = __props[\\"foo.bar\\"]
return (_ctx, _cache) => {
return _toDisplayString(__props[\\"foo.bar\\"])
}
}
}"
`;
exports[`sfc props transform rest spread 1`] = `
"import { createPropsRestProxy as _createPropsRestProxy } from 'vue'

View File

@@ -127,6 +127,28 @@ describe('sfc props transform', () => {
})
})
// #5425
test('non-identifier prop names', () => {
const { content, bindings } = compile(`
<script setup>
const { 'foo.bar': fooBar } = defineProps({ 'foo.bar': Function })
let x = fooBar
</script>
<template>{{ fooBar }}</template>
`)
expect(content).toMatch(`x = __props["foo.bar"]`)
expect(content).toMatch(`toDisplayString(__props["foo.bar"])`)
assertCode(content)
expect(bindings).toStrictEqual({
x: BindingTypes.SETUP_LET,
'foo.bar': BindingTypes.PROPS,
fooBar: BindingTypes.PROPS_ALIASED,
__propsAliases: {
fooBar: 'foo.bar'
}
})
})
test('rest spread', () => {
const { content, bindings } = compile(`
<script setup>

View File

@@ -431,7 +431,11 @@ export function compileScript(
prop.key
)
}
const propKey = (prop.key as Identifier).name
const propKey = prop.key.type === 'StringLiteral'
? prop.key.value
: (prop.key as Identifier).name
if (prop.value.type === 'AssignmentPattern') {
// default value { foo = 123 }
const { left, right } = prop.value