Skip to content

Commit efaa5b1

Browse files
committed
feat(compiler-vapor): support keys and nonKeys modifier for component event
1 parent 2696f14 commit efaa5b1

File tree

6 files changed

+114
-6
lines changed

6 files changed

+114
-6
lines changed

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,36 @@ export function render(_ctx) {
224224
}"
225225
`;
226226

227+
exports[`compiler: element transform > component event with keys modifier 1`] = `
228+
"import { resolveComponent as _resolveComponent, withKeys as _withKeys, createComponentWithFallback as _createComponentWithFallback } from 'vue';
229+
230+
export function render(_ctx) {
231+
const _component_Foo = _resolveComponent("Foo")
232+
const n0 = _createComponentWithFallback(_component_Foo, { onKeyup: () => _withKeys(_ctx.bar, ["enter"]) }, null, true)
233+
return n0
234+
}"
235+
`;
236+
237+
exports[`compiler: element transform > component event with multiple modifiers and event options 1`] = `
238+
"import { resolveComponent as _resolveComponent, withModifiers as _withModifiers, withKeys as _withKeys, createComponentWithFallback as _createComponentWithFallback } from 'vue';
239+
240+
export function render(_ctx) {
241+
const _component_Foo = _resolveComponent("Foo")
242+
const n0 = _createComponentWithFallback(_component_Foo, { onFooCaptureOnce: () => _withKeys(_withModifiers(_ctx.bar, ["stop","prevent"]), ["enter"]) }, null, true)
243+
return n0
244+
}"
245+
`;
246+
247+
exports[`compiler: element transform > component event with nonKeys modifier 1`] = `
248+
"import { resolveComponent as _resolveComponent, withModifiers as _withModifiers, createComponentWithFallback as _createComponentWithFallback } from 'vue';
249+
250+
export function render(_ctx) {
251+
const _component_Foo = _resolveComponent("Foo")
252+
const n0 = _createComponentWithFallback(_component_Foo, { onFoo: () => _withModifiers(_ctx.bar, ["stop","prevent"]) }, null, true)
253+
return n0
254+
}"
255+
`;
256+
227257
exports[`compiler: element transform > component event with once modifier 1`] = `
228258
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
229259

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

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,78 @@ describe('compiler: element transform', () => {
878878
})
879879
})
880880

881+
test('component event with keys modifier', () => {
882+
const { code, ir } = compileWithElementTransform(
883+
`<Foo @keyup.enter="bar" />`,
884+
)
885+
expect(code).toMatchSnapshot()
886+
expect(ir.block.dynamic.children[0].operation).toMatchObject({
887+
type: IRNodeTypes.CREATE_COMPONENT_NODE,
888+
tag: 'Foo',
889+
props: [
890+
[
891+
{
892+
key: { content: 'keyup' },
893+
handler: true,
894+
handlerModifiers: {
895+
keys: ['enter'],
896+
nonKeys: [],
897+
options: [],
898+
},
899+
},
900+
],
901+
],
902+
})
903+
})
904+
905+
test('component event with nonKeys modifier', () => {
906+
const { code, ir } = compileWithElementTransform(
907+
`<Foo @foo.stop.prevent="bar" />`,
908+
)
909+
expect(code).toMatchSnapshot()
910+
expect(ir.block.dynamic.children[0].operation).toMatchObject({
911+
type: IRNodeTypes.CREATE_COMPONENT_NODE,
912+
tag: 'Foo',
913+
props: [
914+
[
915+
{
916+
key: { content: 'foo' },
917+
handler: true,
918+
handlerModifiers: {
919+
keys: [],
920+
nonKeys: ['stop', 'prevent'],
921+
options: [],
922+
},
923+
},
924+
],
925+
],
926+
})
927+
})
928+
929+
test('component event with multiple modifiers and event options', () => {
930+
const { code, ir } = compileWithElementTransform(
931+
`<Foo @foo.enter.stop.prevent.capture.once="bar" />`,
932+
)
933+
expect(code).toMatchSnapshot()
934+
expect(ir.block.dynamic.children[0].operation).toMatchObject({
935+
type: IRNodeTypes.CREATE_COMPONENT_NODE,
936+
tag: 'Foo',
937+
props: [
938+
[
939+
{
940+
key: { content: 'foo' },
941+
handler: true,
942+
handlerModifiers: {
943+
keys: ['enter'],
944+
nonKeys: ['stop', 'prevent'],
945+
options: ['capture', 'once'],
946+
},
947+
},
948+
],
949+
],
950+
})
951+
})
952+
881953
test('component with dynamic event arguments', () => {
882954
const { code, ir } = compileWithElementTransform(
883955
`<Foo @[foo-bar]="bar" @[baz]="qux" />`,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ function genProp(prop: IRProp, context: CodegenContext, isStatic?: boolean) {
211211
? genEventHandler(
212212
context,
213213
prop.values[0],
214-
undefined,
214+
prop.handlerModifiers,
215215
true /* wrap handlers passed to components */,
216216
)
217217
: isStatic

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,10 @@ export function genPropKey(
114114
): CodeFragment[] {
115115
const { helper } = context
116116

117-
const handlerModifierPostfix = handlerModifiers
118-
? handlerModifiers.map(capitalize).join('')
119-
: ''
117+
const handlerModifierPostfix =
118+
handlerModifiers && handlerModifiers.options
119+
? handlerModifiers.options.map(capitalize).join('')
120+
: ''
120121
// static arg was transformed by v-bind transformer
121122
if (node.isStatic) {
122123
// only quote keys if necessary

packages/compiler-vapor/src/transform.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
type IRSlots,
2424
type OperationNode,
2525
type RootIRNode,
26+
type SetEventIRNode,
2627
type VaporDirectiveNode,
2728
} from './ir'
2829
import { isConstantExpression, isStaticExpression } from './utils'
@@ -45,7 +46,7 @@ export interface DirectiveTransformResult {
4546
modifier?: '.' | '^'
4647
runtimeCamelize?: boolean
4748
handler?: boolean
48-
handlerModifiers?: string[]
49+
handlerModifiers?: SetEventIRNode['modifiers']
4950
model?: boolean
5051
modelModifiers?: string[]
5152
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ export const transformVOn: DirectiveTransform = (dir, node, context) => {
6565
key: arg,
6666
value: handler,
6767
handler: true,
68-
handlerModifiers: eventOptionModifiers,
68+
handlerModifiers: {
69+
keys: keyModifiers,
70+
nonKeys: nonKeyModifiers,
71+
options: eventOptionModifiers,
72+
},
6973
}
7074
}
7175

0 commit comments

Comments
 (0)