DOMErrorCodes,
DOMErrorMessages,
} from './errors'
-export { resolveModifiers } from './transforms/vOn'
+export { resolveModifiers, isKeyboardEvent } from './transforms/vOn'
export { isValidHTMLNesting } from './htmlNesting'
export { postTransformTransition } from './transforms/Transition'
export * from '@vue/compiler-core'
)
// left & right could be mouse or key modifiers based on event type
const maybeKeyModifier = /*@__PURE__*/ makeMap('left,right')
-const isKeyboardEvent = /*@__PURE__*/ makeMap(`onkeyup,onkeydown,onkeypress`)
+export const isKeyboardEvent: (key: string) => boolean = /*@__PURE__*/ makeMap(
+ `onkeyup,onkeydown,onkeypress`,
+)
export const resolveModifiers = (
key: ExpressionNode | string,
`;
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';
+"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, { onFooCaptureOnce: () => _withKeys(_withModifiers(_ctx.bar, ["stop","prevent"]), ["enter"]) }, null, true)
+ const n0 = _createComponentWithFallback(_component_Foo, { onFooCaptureOnce: () => _withModifiers(_ctx.bar, ["stop","prevent"]) }, null, true)
return n0
}"
`;
`;
exports[`compiler: element transform > props merging: event handlers 1`] = `
-"import { createInvoker as _createInvoker, withKeys as _withKeys, delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue';
+"import { createInvoker as _createInvoker, delegate as _delegate, delegateEvents as _delegateEvents, template as _template } from 'vue';
const t0 = _template("<div></div>", true)
_delegateEvents("click")
export function render(_ctx) {
const n0 = t0()
- _delegate(n0, "click", _createInvoker(_withKeys(e => _ctx.a(e), ["foo"])))
- _delegate(n0, "click", _createInvoker(_withKeys(e => _ctx.b(e), ["bar"])))
+ _delegate(n0, "click", _createInvoker(e => _ctx.a(e)))
+ _delegate(n0, "click", _createInvoker(e => _ctx.b(e)))
return n0
}"
`;
n7.$evtcontextmenu = _createInvoker(_withModifiers(_ctx.handleEvent, ["right"]))
n8.$evtclick = _createInvoker(_withModifiers(_ctx.handleEvent, ["left"]))
n9.$evtmouseup = _createInvoker(_withModifiers(_ctx.handleEvent, ["middle"]))
- n10.$evtcontextmenu = _createInvoker(_withKeys(_withModifiers(_ctx.handleEvent, ["right"]), ["enter"]))
+ n10.$evtcontextmenu = _createInvoker(_withModifiers(_ctx.handleEvent, ["right"]))
n11.$evtkeyup = _createInvoker(_withKeys(_ctx.handleEvent, ["enter"]))
n12.$evtkeyup = _createInvoker(_withKeys(_ctx.handleEvent, ["tab"]))
n13.$evtkeyup = _createInvoker(_withKeys(_ctx.handleEvent, ["delete"]))
key: { content: 'foo' },
handler: true,
handlerModifiers: {
- keys: ['enter'],
+ keys: [],
nonKeys: ['stop', 'prevent'],
options: ['capture', 'once'],
},
ElementTypes,
ErrorCodes,
createCompilerError,
+ isKeyboardEvent,
+ isStaticExp,
} from '@vue/compiler-dom'
import type { DirectiveTransform } from '../transform'
import { IRNodeTypes, type KeyOverride, type SetEventIRNode } from '../ir'
}
}
+ // don't gen keys guard for non-keyboard events
+ // if event name is dynamic, always wrap with keys guard
+ if (
+ keyModifiers.length &&
+ isStaticExp(arg) &&
+ !isKeyboardEvent(`on${arg.content.toLowerCase()}`)
+ ) {
+ keyModifiers.length = 0
+ }
+
if (isComponent || isSlotOutlet) {
const handler = exp || EMPTY_EXPRESSION
return {