perf(compiler-dom): generate modifiers in a function (#459)

This commit is contained in:
Gabriel Loiácono 2019-11-15 17:37:02 -03:00 committed by Evan You
parent 159d58f09b
commit 96623d0d52
2 changed files with 59 additions and 8 deletions

View File

@ -45,6 +45,32 @@ describe('compiler-dom: transform v-on', () => {
}) })
}) })
it('should support multiple events and modifiers options w/ prefixIdentifiers: true', () => {
const { props } = parseWithVOn(
`<div @click.stop="test" @keyup.enter="test" />`,
{
prefixIdentifiers: true
}
)
const [clickProp, keyUpProp] = props
expect(props).toHaveLength(2)
expect(clickProp).toMatchObject({
type: NodeTypes.JS_PROPERTY,
value: {
callee: V_ON_WITH_MODIFIERS,
arguments: [{ content: '_ctx.test' }, '["stop"]']
}
})
expect(keyUpProp).toMatchObject({
type: NodeTypes.JS_PROPERTY,
value: {
callee: V_ON_WITH_KEYS,
arguments: [{ content: '_ctx.test' }, '["enter"]']
}
})
})
it('should support multiple modifiers and event options w/ prefixIdentifiers: true', () => { it('should support multiple modifiers and event options w/ prefixIdentifiers: true', () => {
const { const {
props: [prop] props: [prop]

View File

@ -24,20 +24,46 @@ const isKeyboardEvent = /*#__PURE__*/ makeMap(
true true
) )
const generateModifiers = (modifiers: string[]) => {
const keyModifiers = []
const nonKeyModifiers = []
const eventOptionModifiers = []
for (let i = 0; i < modifiers.length; i++) {
const modifier = modifiers[i]
if (isEventOptionModifier(modifier)) {
// eventOptionModifiers: modifiers for addEventListener() options, e.g. .passive & .capture
eventOptionModifiers.push(modifier)
} else {
// runtimeModifiers: modifiers that needs runtime guards
if (isNonKeyModifier(modifier)) {
nonKeyModifiers.push(modifier)
} else {
keyModifiers.push(modifier)
}
}
}
return {
keyModifiers,
nonKeyModifiers,
eventOptionModifiers
}
}
export const transformOn: DirectiveTransform = (dir, node, context) => { export const transformOn: DirectiveTransform = (dir, node, context) => {
return baseTransform(dir, node, context, baseResult => { return baseTransform(dir, node, context, baseResult => {
const { modifiers } = dir const { modifiers } = dir
if (!modifiers.length) return baseResult if (!modifiers.length) return baseResult
let { key, value: handlerExp } = baseResult.props[0] let { key, value: handlerExp } = baseResult.props[0]
const {
keyModifiers,
nonKeyModifiers,
eventOptionModifiers
} = generateModifiers(modifiers)
// modifiers for addEventListener() options, e.g. .passive & .capture
const eventOptionModifiers = modifiers.filter(isEventOptionModifier)
// modifiers that needs runtime guards
const runtimeModifiers = modifiers.filter(m => !isEventOptionModifier(m))
// built-in modifiers that are not keys
const nonKeyModifiers = runtimeModifiers.filter(isNonKeyModifier)
if (nonKeyModifiers.length) { if (nonKeyModifiers.length) {
handlerExp = createCallExpression(context.helper(V_ON_WITH_MODIFIERS), [ handlerExp = createCallExpression(context.helper(V_ON_WITH_MODIFIERS), [
handlerExp, handlerExp,
@ -45,7 +71,6 @@ export const transformOn: DirectiveTransform = (dir, node, context) => {
]) ])
} }
const keyModifiers = runtimeModifiers.filter(m => !isNonKeyModifier(m))
if ( if (
keyModifiers.length && keyModifiers.length &&
// if event name is dynamic, always wrap with keys guard // if event name is dynamic, always wrap with keys guard