Skip to content

Commit 4964b25

Browse files
Kingwlyyx990803
authored andcommitted
fix wrong order of generate modifier code (vuejs#5147)
* fix wrong order of generate modifier code * add unit test of vuejs#5146 * Update events.js
1 parent f9706dc commit 4964b25

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

src/compiler/codegen/events.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,11 @@ function genHandler (
6363
: `function($event){${handler.value}}` // inline statement
6464
} else {
6565
let code = ''
66+
let genModifierCode = ''
6667
const keys = []
6768
for (const key in handler.modifiers) {
6869
if (modifierCode[key]) {
69-
code += modifierCode[key]
70+
genModifierCode += modifierCode[key]
7071
// left/right
7172
if (keyCodes[key]) {
7273
keys.push(key)
@@ -78,6 +79,10 @@ function genHandler (
7879
if (keys.length) {
7980
code += genKeyFilter(keys)
8081
}
82+
// Make sure modifiers like prevent and stop get executed after key filtering
83+
if (genModifierCode) {
84+
code += genModifierCode
85+
}
8186
const handlerCode = isMethodPath
8287
? handler.value + '($event)'
8388
: isFunctionExpression

test/unit/features/directives/on.spec.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -527,4 +527,25 @@ describe('Directive v-on', () => {
527527
expect(spyUp.calls.count()).toBe(1)
528528
expect(spyDown.calls.count()).toBe(1)
529529
})
530+
531+
// Github Issues #5146
532+
it('should only prevent when match keycode', () => {
533+
let prevented = false
534+
vm = new Vue({
535+
el,
536+
template: `
537+
<input ref="input" @keydown.enter.prevent="foo">
538+
`,
539+
methods: {
540+
foo ($event) {
541+
prevented = $event.defaultPrevented
542+
}
543+
}
544+
})
545+
546+
triggerEvent(vm.$refs.input, 'keydown', e => { e.keyCode = 32 })
547+
expect(prevented).toBe(false)
548+
triggerEvent(vm.$refs.input, 'keydown', e => { e.keyCode = 13 })
549+
expect(prevented).toBe(true)
550+
})
530551
})

test/unit/modules/compiler/codegen.spec.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,19 @@ describe('codegen', () => {
268268
)
269269
})
270270

271+
// Github Issues #5146
272+
it('generate events with generic modifiers and keycode correct order', () => {
273+
assertCodegen(
274+
'<input @keydown.enter.prevent="onInput">',
275+
`with(this){return _c('input',{on:{"keydown":function($event){if(!('button' in $event)&&_k($event.keyCode,"enter",13))return null;$event.preventDefault();onInput($event)}}})}`
276+
)
277+
278+
assertCodegen(
279+
'<input @keydown.enter.stop="onInput">',
280+
`with(this){return _c('input',{on:{"keydown":function($event){if(!('button' in $event)&&_k($event.keyCode,"enter",13))return null;$event.stopPropagation();onInput($event)}}})}`
281+
)
282+
})
283+
271284
it('generate events with mouse event modifiers', () => {
272285
assertCodegen(
273286
'<input @click.ctrl="onClick">',

0 commit comments

Comments
 (0)