fix(compiler): avoid namespace collisions when transforming template refs in inline mode (#6975)

fix #6964
This commit is contained in:
白雾三语 2022-11-09 11:22:29 +08:00 committed by GitHub
parent 8a882ce0a1
commit 2c27556fe5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 12 deletions

View File

@ -1063,6 +1063,32 @@ describe('compiler: element transform', () => {
}) })
}) })
test('script setup inline mode template ref (binding does not exist but props with the same name exist)', () => {
const { node } = parseWithElementTransform(`<input ref="msg"/>`, {
inline: true,
bindingMetadata: {
msg: BindingTypes.PROPS,
ref: BindingTypes.SETUP_CONST
}
})
expect(node.props).toMatchObject({
type: NodeTypes.JS_OBJECT_EXPRESSION,
properties: [
{
type: NodeTypes.JS_PROPERTY,
key: {
content: 'ref',
isStatic: true
},
value: {
content: 'msg',
isStatic: true
}
}
]
})
})
test('HYDRATE_EVENTS', () => { test('HYDRATE_EVENTS', () => {
// ignore click events (has dedicated fast path) // ignore click events (has dedicated fast path)
const { node } = parseWithElementTransform(`<div @click="foo" />`, { const { node } = parseWithElementTransform(`<div @click="foo" />`, {

View File

@ -497,11 +497,12 @@ export function buildProps(
// in inline mode there is no setupState object, so we can't use string // in inline mode there is no setupState object, so we can't use string
// keys to set the ref. Instead, we need to transform it to pass the // keys to set the ref. Instead, we need to transform it to pass the
// actual ref instead. // actual ref instead.
if (!__BROWSER__ && value && context.inline) {
const binding = context.bindingMetadata[value.content]
if ( if (
!__BROWSER__ && binding === BindingTypes.SETUP_LET ||
value && binding === BindingTypes.SETUP_REF ||
context.inline && binding === BindingTypes.SETUP_MAYBE_REF
context.bindingMetadata[value.content]
) { ) {
isStatic = false isStatic = false
properties.push( properties.push(
@ -512,6 +513,7 @@ export function buildProps(
) )
} }
} }
}
// skip is on <component>, or is="vue:xxx" // skip is on <component>, or is="vue:xxx"
if ( if (
name === 'is' && name === 'is' &&