Skip to content

Commit 20cd429

Browse files
authored
fix(compiler-vapor): once modifier work with component event (#12606)
1 parent 58b4974 commit 20cd429

File tree

6 files changed

+52
-4
lines changed

6 files changed

+52
-4
lines changed

packages/compiler-vapor/__tests__/transforms/__snapshots__/transformElement.spec.ts.snap

+22
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,28 @@ export function render(_ctx) {
212212
}"
213213
`;
214214

215+
exports[`compiler: element transform > component dynamic event with once modifier 1`] = `
216+
"import { resolveComponent as _resolveComponent, toHandlerKey as _toHandlerKey, createComponentWithFallback as _createComponentWithFallback } from 'vue';
217+
218+
export function render(_ctx) {
219+
const _component_Foo = _resolveComponent("Foo")
220+
const n0 = _createComponentWithFallback(_component_Foo, { $: [
221+
() => ({ [_toHandlerKey(_ctx.foo) + "Once"]: () => _ctx.bar })
222+
] }, null, true)
223+
return n0
224+
}"
225+
`;
226+
227+
exports[`compiler: element transform > component event with once modifier 1`] = `
228+
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
229+
230+
export function render(_ctx) {
231+
const _component_Foo = _resolveComponent("Foo")
232+
const n0 = _createComponentWithFallback(_component_Foo, { onFooOnce: () => _ctx.bar }, null, true)
233+
return n0
234+
}"
235+
`;
236+
215237
exports[`compiler: element transform > component with dynamic event arguments 1`] = `
216238
"import { resolveComponent as _resolveComponent, toHandlerKey as _toHandlerKey, createComponentWithFallback as _createComponentWithFallback } from 'vue';
217239

packages/compiler-vapor/__tests__/transforms/transformElement.spec.ts

+10
Original file line numberDiff line numberDiff line change
@@ -940,6 +940,16 @@ describe('compiler: element transform', () => {
940940
])
941941
})
942942

943+
test('component event with once modifier', () => {
944+
const { code } = compileWithElementTransform(`<Foo @foo.once="bar" />`)
945+
expect(code).toMatchSnapshot()
946+
})
947+
948+
test('component dynamic event with once modifier', () => {
949+
const { code } = compileWithElementTransform(`<Foo @[foo].once="bar" />`)
950+
expect(code).toMatchSnapshot()
951+
})
952+
943953
test('invalid html nesting', () => {
944954
const { code, ir } = compileWithElementTransform(
945955
`<p><div>123</div></p>

packages/compiler-vapor/src/generators/prop.ts

+17-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
} from './utils'
2323
import {
2424
canSetValueDirectly,
25+
capitalize,
2526
isSVGTag,
2627
shouldSetAsAttr,
2728
toHandlerKey,
@@ -108,15 +109,20 @@ function genLiteralObjectProps(
108109
}
109110

110111
export function genPropKey(
111-
{ key: node, modifier, runtimeCamelize, handler }: IRProp,
112+
{ key: node, modifier, runtimeCamelize, handler, handlerModifiers }: IRProp,
112113
context: CodegenContext,
113114
): CodeFragment[] {
114115
const { helper } = context
115116

117+
const handlerModifierPostfix = handlerModifiers
118+
? handlerModifiers.map(capitalize).join('')
119+
: ''
116120
// static arg was transformed by v-bind transformer
117121
if (node.isStatic) {
118122
// only quote keys if necessary
119-
const keyName = handler ? toHandlerKey(node.content) : node.content
123+
const keyName =
124+
(handler ? toHandlerKey(node.content) : node.content) +
125+
handlerModifierPostfix
120126
return [
121127
[
122128
isSimpleIdentifier(keyName) ? keyName : JSON.stringify(keyName),
@@ -133,7 +139,15 @@ export function genPropKey(
133139
if (handler) {
134140
key = genCall(helper('toHandlerKey'), key)
135141
}
136-
return ['[', modifier && `${JSON.stringify(modifier)} + `, ...key, ']']
142+
return [
143+
'[',
144+
modifier && `${JSON.stringify(modifier)} + `,
145+
...key,
146+
handlerModifierPostfix
147+
? ` + ${JSON.stringify(handlerModifierPostfix)}`
148+
: undefined,
149+
']',
150+
]
137151
}
138152

139153
export function genPropValue(

packages/compiler-vapor/src/transform.ts

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ export interface DirectiveTransformResult {
4747
modifier?: '.' | '^'
4848
runtimeCamelize?: boolean
4949
handler?: boolean
50+
handlerModifiers?: string[]
5051
model?: boolean
5152
modelModifiers?: string[]
5253
}

packages/compiler-vapor/src/transforms/vOn.ts

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ export const transformVOn: DirectiveTransform = (dir, node, context) => {
6767
key: arg,
6868
value: handler,
6969
handler: true,
70+
handlerModifiers: eventOptionModifiers,
7071
}
7172
}
7273

packages/runtime-vapor/src/componentEmits.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ function propGetter(rawProps: Record<string, any>, key: string) {
4646
let i = dynamicSources.length
4747
while (i--) {
4848
const source = resolveSource(dynamicSources[i])
49-
if (hasOwn(source, key)) return source[key]
49+
if (hasOwn(source, key)) return resolveSource(source[key])
5050
}
5151
}
5252
return rawProps[key] && resolveSource(rawProps[key])

0 commit comments

Comments
 (0)