}"
`;
+exports[`compiler: element transform > component event with keys modifier 1`] = `
+"import { resolveComponent as _resolveComponent, withKeys as _withKeys, createComponentWithFallback as _createComponentWithFallback } from 'vue';
+
+export function render(_ctx) {
+ const _component_Foo = _resolveComponent("Foo")
+ const n0 = _createComponentWithFallback(_component_Foo, { onKeyup: () => _withKeys(_ctx.bar, ["enter"]) }, null, true)
+ return n0
+}"
+`;
+
+exports[`compiler: element transform > component event with multiple modifiers and event options 1`] = `
+"import { resolveComponent as _resolveComponent, withModifiers as _withModifiers, withKeys as _withKeys, createComponentWithFallback as _createComponentWithFallback } from 'vue';
+
+export function render(_ctx) {
+ const _component_Foo = _resolveComponent("Foo")
+ const n0 = _createComponentWithFallback(_component_Foo, { onFooCaptureOnce: () => _withKeys(_withModifiers(_ctx.bar, ["stop","prevent"]), ["enter"]) }, null, true)
+ return n0
+}"
+`;
+
+exports[`compiler: element transform > component event with nonKeys modifier 1`] = `
+"import { resolveComponent as _resolveComponent, withModifiers as _withModifiers, createComponentWithFallback as _createComponentWithFallback } from 'vue';
+
+export function render(_ctx) {
+ const _component_Foo = _resolveComponent("Foo")
+ const n0 = _createComponentWithFallback(_component_Foo, { onFoo: () => _withModifiers(_ctx.bar, ["stop","prevent"]) }, null, true)
+ return n0
+}"
+`;
+
exports[`compiler: element transform > component event with once modifier 1`] = `
"import { resolveComponent as _resolveComponent, createComponentWithFallback as _createComponentWithFallback } from 'vue';
})
})
+ test('component event with keys modifier', () => {
+ const { code, ir } = compileWithElementTransform(
+ `<Foo @keyup.enter="bar" />`,
+ )
+ expect(code).toMatchSnapshot()
+ expect(ir.block.dynamic.children[0].operation).toMatchObject({
+ type: IRNodeTypes.CREATE_COMPONENT_NODE,
+ tag: 'Foo',
+ props: [
+ [
+ {
+ key: { content: 'keyup' },
+ handler: true,
+ handlerModifiers: {
+ keys: ['enter'],
+ nonKeys: [],
+ options: [],
+ },
+ },
+ ],
+ ],
+ })
+ })
+
+ test('component event with nonKeys modifier', () => {
+ const { code, ir } = compileWithElementTransform(
+ `<Foo @foo.stop.prevent="bar" />`,
+ )
+ expect(code).toMatchSnapshot()
+ expect(ir.block.dynamic.children[0].operation).toMatchObject({
+ type: IRNodeTypes.CREATE_COMPONENT_NODE,
+ tag: 'Foo',
+ props: [
+ [
+ {
+ key: { content: 'foo' },
+ handler: true,
+ handlerModifiers: {
+ keys: [],
+ nonKeys: ['stop', 'prevent'],
+ options: [],
+ },
+ },
+ ],
+ ],
+ })
+ })
+
+ test('component event with multiple modifiers and event options', () => {
+ const { code, ir } = compileWithElementTransform(
+ `<Foo @foo.enter.stop.prevent.capture.once="bar" />`,
+ )
+ expect(code).toMatchSnapshot()
+ expect(ir.block.dynamic.children[0].operation).toMatchObject({
+ type: IRNodeTypes.CREATE_COMPONENT_NODE,
+ tag: 'Foo',
+ props: [
+ [
+ {
+ key: { content: 'foo' },
+ handler: true,
+ handlerModifiers: {
+ keys: ['enter'],
+ nonKeys: ['stop', 'prevent'],
+ options: ['capture', 'once'],
+ },
+ },
+ ],
+ ],
+ })
+ })
+
test('component with dynamic event arguments', () => {
const { code, ir } = compileWithElementTransform(
`<Foo @[foo-bar]="bar" @[baz]="qux" />`,
? genEventHandler(
context,
prop.values[0],
- undefined,
+ prop.handlerModifiers,
true /* wrap handlers passed to components */,
)
: isStatic
): CodeFragment[] {
const { helper } = context
- const handlerModifierPostfix = handlerModifiers
- ? handlerModifiers.map(capitalize).join('')
- : ''
+ const handlerModifierPostfix =
+ handlerModifiers && handlerModifiers.options
+ ? handlerModifiers.options.map(capitalize).join('')
+ : ''
// static arg was transformed by v-bind transformer
if (node.isStatic) {
// only quote keys if necessary
type IRSlots,
type OperationNode,
type RootIRNode,
+ type SetEventIRNode,
type VaporDirectiveNode,
} from './ir'
import { isConstantExpression, isStaticExpression } from './utils'
modifier?: '.' | '^'
runtimeCamelize?: boolean
handler?: boolean
- handlerModifiers?: string[]
+ handlerModifiers?: SetEventIRNode['modifiers']
model?: boolean
modelModifiers?: string[]
}
key: arg,
value: handler,
handler: true,
- handlerModifiers: eventOptionModifiers,
+ handlerModifiers: {
+ keys: keyModifiers,
+ nonKeys: nonKeyModifiers,
+ options: eventOptionModifiers,
+ },
}
}