File tree 3 files changed +42
-7
lines changed
compiler-core/src/transforms
3 files changed +42
-7
lines changed Original file line number Diff line number Diff line change @@ -42,10 +42,8 @@ export const transformOn: DirectiveTransform = (
42
42
if ( arg . type === NodeTypes . SIMPLE_EXPRESSION ) {
43
43
if ( arg . isStatic ) {
44
44
const rawName = arg . content
45
- // for @vnode -xxx event listeners, auto convert it to camelCase
46
- const normalizedName = rawName . startsWith ( `vnode` )
47
- ? capitalize ( camelize ( rawName ) )
48
- : capitalize ( rawName )
45
+ // for all event listeners, auto convert it to camelCase. See issue #2249
46
+ const normalizedName = capitalize ( camelize ( rawName ) )
49
47
eventName = createSimpleExpression ( `on${ normalizedName } ` , true , arg . loc )
50
48
} else {
51
49
eventName = createCompoundExpression ( [
Original file line number Diff line number Diff line change @@ -28,6 +28,24 @@ describe('component: emit', () => {
28
28
expect ( onBaz ) . toHaveBeenCalled ( )
29
29
} )
30
30
31
+ test ( 'trigger camelize event' , ( ) => {
32
+ const Foo = defineComponent ( {
33
+ render ( ) { } ,
34
+ created ( ) {
35
+ this . $emit ( 'test-event' )
36
+ }
37
+ } )
38
+
39
+ const fooSpy = jest . fn ( )
40
+ const Comp = ( ) =>
41
+ h ( Foo , {
42
+ onTestEvent : fooSpy
43
+ } )
44
+ render ( h ( Comp ) , nodeOps . createElement ( 'div' ) )
45
+
46
+ expect ( fooSpy ) . toHaveBeenCalled ( )
47
+ } )
48
+
31
49
// for v-model:foo-bar usage in DOM templates
32
50
test ( 'trigger hyphenated events for update:xxx events' , ( ) => {
33
51
const Foo = defineComponent ( {
Original file line number Diff line number Diff line change @@ -6,12 +6,14 @@ import {
6
6
capitalize ,
7
7
hyphenate ,
8
8
isFunction ,
9
- extend
9
+ extend ,
10
+ camelize
10
11
} from '@vue/shared'
11
12
import {
12
13
ComponentInternalInstance ,
13
14
ComponentOptions ,
14
- ConcreteComponent
15
+ ConcreteComponent ,
16
+ formatComponentName
15
17
} from './component'
16
18
import { callWithAsyncErrorHandling , ErrorCodes } from './errorHandling'
17
19
import { warn } from './warning'
@@ -78,7 +80,24 @@ export function emit(
78
80
devtoolsComponentEmit ( instance , event , args )
79
81
}
80
82
81
- let handlerName = `on${ capitalize ( event ) } `
83
+ if ( __DEV__ ) {
84
+ const lowerCaseEvent = event . toLowerCase ( )
85
+ if ( lowerCaseEvent !== event && props [ `on` + capitalize ( lowerCaseEvent ) ] ) {
86
+ warn (
87
+ `Event "${ lowerCaseEvent } " is emitted in component ` +
88
+ `${ formatComponentName (
89
+ instance ,
90
+ instance . type
91
+ ) } but the handler is registered for "${ event } ". ` +
92
+ `Note that HTML attributes are case-insensitive and you cannot use ` +
93
+ `v-on to listen to camelCase events when using in-DOM templates. ` +
94
+ `You should probably use "${ hyphenate ( event ) } " instead of "${ event } ".`
95
+ )
96
+ }
97
+ }
98
+
99
+ // convert handler name to camelCase. See issue #2249
100
+ let handlerName = `on${ capitalize ( camelize ( event ) ) } `
82
101
let handler = props [ handlerName ]
83
102
// for v-model update:xxx events, also trigger kebab-case equivalent
84
103
// for props passed via kebab-case
You can’t perform that action at this time.
0 commit comments