fix(compiler-vapor): once modifier work with component event (#12606)

This commit is contained in:
edison 2025-01-08 15:19:08 +08:00 committed by GitHub
parent 58b49749c7
commit 20cd429766
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 52 additions and 4 deletions

View File

@ -212,6 +212,28 @@ export function render(_ctx) {
}"
`;
exports[`compiler: element transform > component dynamic event with once modifier 1`] = `
"import { resolveComponent as _resolveComponent, toHandlerKey as _toHandlerKey, createComponentWithFallback as _createComponentWithFallback } from 'vue';
export function render(_ctx) {
const _component_Foo = _resolveComponent("Foo")
const n0 = _createComponentWithFallback(_component_Foo, { $: [
() => ({ [_toHandlerKey(_ctx.foo) + "Once"]: () => _ctx.bar })
] }, null, true)
return n0
}"
`;
exports[`compiler: element transform > component event with once modifier 1`] = `
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
export function render(_ctx) {
const _component_Foo = _resolveComponent("Foo")
const n0 = _createComponentWithFallback(_component_Foo, { onFooOnce: () => _ctx.bar }, null, true)
return n0
}"
`;
exports[`compiler: element transform > component with dynamic event arguments 1`] = `
"import { resolveComponent as _resolveComponent, toHandlerKey as _toHandlerKey, createComponentWithFallback as _createComponentWithFallback } from 'vue';

View File

@ -940,6 +940,16 @@ describe('compiler: element transform', () => {
])
})
test('component event with once modifier', () => {
const { code } = compileWithElementTransform(`<Foo @foo.once="bar" />`)
expect(code).toMatchSnapshot()
})
test('component dynamic event with once modifier', () => {
const { code } = compileWithElementTransform(`<Foo @[foo].once="bar" />`)
expect(code).toMatchSnapshot()
})
test('invalid html nesting', () => {
const { code, ir } = compileWithElementTransform(
`<p><div>123</div></p>

View File

@ -22,6 +22,7 @@ import {
} from './utils'
import {
canSetValueDirectly,
capitalize,
isSVGTag,
shouldSetAsAttr,
toHandlerKey,
@ -108,15 +109,20 @@ function genLiteralObjectProps(
}
export function genPropKey(
{ key: node, modifier, runtimeCamelize, handler }: IRProp,
{ key: node, modifier, runtimeCamelize, handler, handlerModifiers }: IRProp,
context: CodegenContext,
): CodeFragment[] {
const { helper } = context
const handlerModifierPostfix = handlerModifiers
? handlerModifiers.map(capitalize).join('')
: ''
// static arg was transformed by v-bind transformer
if (node.isStatic) {
// only quote keys if necessary
const keyName = handler ? toHandlerKey(node.content) : node.content
const keyName =
(handler ? toHandlerKey(node.content) : node.content) +
handlerModifierPostfix
return [
[
isSimpleIdentifier(keyName) ? keyName : JSON.stringify(keyName),
@ -133,7 +139,15 @@ export function genPropKey(
if (handler) {
key = genCall(helper('toHandlerKey'), key)
}
return ['[', modifier && `${JSON.stringify(modifier)} + `, ...key, ']']
return [
'[',
modifier && `${JSON.stringify(modifier)} + `,
...key,
handlerModifierPostfix
? ` + ${JSON.stringify(handlerModifierPostfix)}`
: undefined,
']',
]
}
export function genPropValue(

View File

@ -47,6 +47,7 @@ export interface DirectiveTransformResult {
modifier?: '.' | '^'
runtimeCamelize?: boolean
handler?: boolean
handlerModifiers?: string[]
model?: boolean
modelModifiers?: string[]
}

View File

@ -67,6 +67,7 @@ export const transformVOn: DirectiveTransform = (dir, node, context) => {
key: arg,
value: handler,
handler: true,
handlerModifiers: eventOptionModifiers,
}
}

View File

@ -46,7 +46,7 @@ function propGetter(rawProps: Record<string, any>, key: string) {
let i = dynamicSources.length
while (i--) {
const source = resolveSource(dynamicSources[i])
if (hasOwn(source, key)) return source[key]
if (hasOwn(source, key)) return resolveSource(source[key])
}
}
return rawProps[key] && resolveSource(rawProps[key])