Skip to content

Commit 028f748

Browse files
committed
fix(v-on): transform click.right and click.middle modifiers
fix #735
1 parent 583f946 commit 028f748

File tree

3 files changed

+84
-1
lines changed

3 files changed

+84
-1
lines changed

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

+3
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ export const transformOn: DirectiveTransform = (
5656

5757
// handler processing
5858
let exp: ExpressionNode | undefined = dir.exp
59+
if (exp && !exp.content.trim()) {
60+
exp = undefined
61+
}
5962
let isCacheable: boolean = !exp
6063
if (exp) {
6164
const isMemberExp = isMemberExpression(exp.content)

packages/compiler-dom/__tests__/transforms/vOn.spec.ts

+52
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,58 @@ describe('compiler-dom: transform v-on', () => {
152152
})
153153
})
154154

155+
test('should transform click.right', () => {
156+
const {
157+
props: [prop]
158+
} = parseWithVOn(`<div @click.right="test"/>`)
159+
expect(prop.key).toMatchObject({
160+
type: NodeTypes.SIMPLE_EXPRESSION,
161+
content: `onContextmenu`
162+
})
163+
164+
// dynamic
165+
const {
166+
props: [prop2]
167+
} = parseWithVOn(`<div @[event].right="test"/>`)
168+
// ("on" + (event)).toLowerCase() === "onclick" ? "onContextmenu" : ("on" + (event))
169+
expect(prop2.key).toMatchObject({
170+
type: NodeTypes.COMPOUND_EXPRESSION,
171+
children: [
172+
`(`,
173+
{ children: [`"on" + (`, { content: 'event' }, `)`] },
174+
`).toLowerCase() === "onclick" ? "onContextmenu" : (`,
175+
{ children: [`"on" + (`, { content: 'event' }, `)`] },
176+
`)`
177+
]
178+
})
179+
})
180+
181+
test('should transform click.middle', () => {
182+
const {
183+
props: [prop]
184+
} = parseWithVOn(`<div @click.middle="test"/>`)
185+
expect(prop.key).toMatchObject({
186+
type: NodeTypes.SIMPLE_EXPRESSION,
187+
content: `onMouseup`
188+
})
189+
190+
// dynamic
191+
const {
192+
props: [prop2]
193+
} = parseWithVOn(`<div @[event].middle="test"/>`)
194+
// ("on" + (event)).toLowerCase() === "onclick" ? "onMouseup" : ("on" + (event))
195+
expect(prop2.key).toMatchObject({
196+
type: NodeTypes.COMPOUND_EXPRESSION,
197+
children: [
198+
`(`,
199+
{ children: [`"on" + (`, { content: 'event' }, `)`] },
200+
`).toLowerCase() === "onclick" ? "onMouseup" : (`,
201+
{ children: [`"on" + (`, { content: 'event' }, `)`] },
202+
`)`
203+
]
204+
})
205+
})
206+
155207
test('cache handler w/ modifiers', () => {
156208
const {
157209
root,

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

+29-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import {
55
createCallExpression,
66
createObjectExpression,
77
createSimpleExpression,
8-
NodeTypes
8+
NodeTypes,
9+
createCompoundExpression,
10+
ExpressionNode
911
} from '@vue/compiler-core'
1012
import { V_ON_WITH_MODIFIERS, V_ON_WITH_KEYS } from '../runtimeHelpers'
1113
import { makeMap } from '@vue/shared'
@@ -52,6 +54,24 @@ const generateModifiers = (modifiers: string[]) => {
5254
}
5355
}
5456

57+
const transformClick = (key: ExpressionNode, event: string) => {
58+
const isStaticClick =
59+
key.type === NodeTypes.SIMPLE_EXPRESSION &&
60+
key.isStatic &&
61+
key.content.toLowerCase() === 'onclick'
62+
return isStaticClick
63+
? createSimpleExpression(event, true)
64+
: key.type !== NodeTypes.SIMPLE_EXPRESSION
65+
? createCompoundExpression([
66+
`(`,
67+
key,
68+
`).toLowerCase() === "onclick" ? "${event}" : (`,
69+
key,
70+
`)`
71+
])
72+
: key
73+
}
74+
5575
export const transformOn: DirectiveTransform = (dir, node, context) => {
5676
return baseTransform(dir, node, context, baseResult => {
5777
const { modifiers } = dir
@@ -64,6 +84,14 @@ export const transformOn: DirectiveTransform = (dir, node, context) => {
6484
eventOptionModifiers
6585
} = generateModifiers(modifiers)
6686

87+
// normalize click.right and click.middle since they don't actually fire
88+
if (nonKeyModifiers.includes('right')) {
89+
key = transformClick(key, `onContextmenu`)
90+
}
91+
if (nonKeyModifiers.includes('middle')) {
92+
key = transformClick(key, `onMouseup`)
93+
}
94+
6795
if (nonKeyModifiers.length) {
6896
handlerExp = createCallExpression(context.helper(V_ON_WITH_MODIFIERS), [
6997
handlerExp,

0 commit comments

Comments
 (0)