fix(compiler-core/v-on): only apply case preservation on native elements (#6902)

fix #6900
This commit is contained in:
白雾三语 2022-11-09 10:58:22 +08:00 committed by GitHub
parent 910fa7677f
commit 5bfe438ef3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 54 additions and 3 deletions

View File

@ -11,7 +11,8 @@ import {
VNodeCall,
SlotsExpression,
ObjectExpression,
SimpleExpressionNode
SimpleExpressionNode,
RenderSlotCall
} from '../../src'
import { transformElement } from '../../src/transforms/transformElement'
import { transformOn } from '../../src/transforms/vOn'
@ -788,6 +789,56 @@ describe('compiler: transform component slots', () => {
const { slots } = parseWithSlots(`<Comp><Comp><slot/></Comp></Comp>`)
expect(slots).toMatchObject(toMatch)
})
// # fix: #6900
test('consistent behavior of @xxx:modelValue and @xxx:model-value', () => {
const { root: rootUpper } = parseWithSlots(
`<div><slot @foo:modelValue="handler" /></div>`
)
const slotNodeUpper = (rootUpper.codegenNode! as VNodeCall)
.children as ElementNode[]
const propertiesObjUpper = (
slotNodeUpper[0].codegenNode! as RenderSlotCall
).arguments[2]
expect(propertiesObjUpper).toMatchObject({
properties: [
{
key: {
type: NodeTypes.SIMPLE_EXPRESSION,
content: 'onFoo:modelValue'
},
value: {
type: NodeTypes.SIMPLE_EXPRESSION,
content: `handler`,
isStatic: false
}
}
]
})
const { root } = parseWithSlots(
`<div><slot @foo:model-Value="handler" /></div>`
)
const slotNode = (root.codegenNode! as VNodeCall)
.children as ElementNode[]
const propertiesObj = (slotNode[0].codegenNode! as RenderSlotCall)
.arguments[2]
expect(propertiesObj).toMatchObject({
properties: [
{
key: {
type: NodeTypes.SIMPLE_EXPRESSION,
content: 'onFoo:modelValue'
},
value: {
type: NodeTypes.SIMPLE_EXPRESSION,
content: `handler`,
isStatic: false
}
}
]
})
})
})
describe('errors', () => {

View File

@ -48,10 +48,10 @@ export const transformOn: DirectiveTransform = (
rawName = `vnode-${rawName.slice(4)}`
}
const eventString =
node.tagType === ElementTypes.COMPONENT ||
node.tagType !== ElementTypes.ELEMENT ||
rawName.startsWith('vnode') ||
!/[A-Z]/.test(rawName)
? // for component and vnode lifecycle event listeners, auto convert
? // for non-element and vnode lifecycle event listeners, auto convert
// it to camelCase. See issue #2249
toHandlerKey(camelize(rawName))
: // preserve case for plain element listeners that have uppercase