fix(compiler-core/v-on): only apply case preservation on native elements (#6902)
fix #6900
This commit is contained in:
parent
910fa7677f
commit
5bfe438ef3
|
@ -11,7 +11,8 @@ import {
|
||||||
VNodeCall,
|
VNodeCall,
|
||||||
SlotsExpression,
|
SlotsExpression,
|
||||||
ObjectExpression,
|
ObjectExpression,
|
||||||
SimpleExpressionNode
|
SimpleExpressionNode,
|
||||||
|
RenderSlotCall
|
||||||
} from '../../src'
|
} from '../../src'
|
||||||
import { transformElement } from '../../src/transforms/transformElement'
|
import { transformElement } from '../../src/transforms/transformElement'
|
||||||
import { transformOn } from '../../src/transforms/vOn'
|
import { transformOn } from '../../src/transforms/vOn'
|
||||||
|
@ -788,6 +789,56 @@ describe('compiler: transform component slots', () => {
|
||||||
const { slots } = parseWithSlots(`<Comp><Comp><slot/></Comp></Comp>`)
|
const { slots } = parseWithSlots(`<Comp><Comp><slot/></Comp></Comp>`)
|
||||||
expect(slots).toMatchObject(toMatch)
|
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', () => {
|
describe('errors', () => {
|
||||||
|
|
|
@ -48,10 +48,10 @@ export const transformOn: DirectiveTransform = (
|
||||||
rawName = `vnode-${rawName.slice(4)}`
|
rawName = `vnode-${rawName.slice(4)}`
|
||||||
}
|
}
|
||||||
const eventString =
|
const eventString =
|
||||||
node.tagType === ElementTypes.COMPONENT ||
|
node.tagType !== ElementTypes.ELEMENT ||
|
||||||
rawName.startsWith('vnode') ||
|
rawName.startsWith('vnode') ||
|
||||||
!/[A-Z]/.test(rawName)
|
!/[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
|
// it to camelCase. See issue #2249
|
||||||
toHandlerKey(camelize(rawName))
|
toHandlerKey(camelize(rawName))
|
||||||
: // preserve case for plain element listeners that have uppercase
|
: // preserve case for plain element listeners that have uppercase
|
||||||
|
|
Loading…
Reference in New Issue