Skip to content

Commit 2837ce8

Browse files
committed
fix(v-model/emit): update:camelCase events should trigger kebab case equivalent
close #656
1 parent 48152bc commit 2837ce8

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

packages/runtime-core/__tests__/component.spec.ts

+26
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,42 @@ describe('renderer: component', () => {
7878
setup() {
7979
return () =>
8080
h(Child, {
81+
// emit triggering single handler
8182
onBar: () => 1,
83+
// emit triggering multiple handlers
8284
onBaz: [() => Promise.resolve(2), () => Promise.resolve(3)]
8385
})
8486
}
8587
}
8688

8789
render(h(App), nodeOps.createElement('div'))
8890

91+
// assert return values from emit
8992
expect(noMatchEmitResult).toMatchObject([])
9093
expect(singleEmitResult).toMatchObject([1])
9194
expect(await Promise.all(multiEmitResult)).toMatchObject([2, 3])
9295
})
96+
97+
// for v-model:foo-bar usage in DOM templates
98+
test('emit update:xxx events should trigger kebab-case equivalent', () => {
99+
const Child = defineComponent({
100+
setup(_, { emit }) {
101+
emit('update:fooBar', 1)
102+
return () => h('div')
103+
}
104+
})
105+
106+
const handler = jest.fn()
107+
const App = {
108+
setup() {
109+
return () =>
110+
h(Child, {
111+
'onUpdate:foo-bar': handler
112+
})
113+
}
114+
}
115+
116+
render(h(App), nodeOps.createElement('div'))
117+
expect(handler).toHaveBeenCalled()
118+
})
93119
})

packages/runtime-core/src/component.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ import {
2525
NO,
2626
makeMap,
2727
isPromise,
28-
isArray
28+
isArray,
29+
hyphenate
2930
} from '@vue/shared'
3031
import { SuspenseBoundary } from './components/Suspense'
3132
import { CompilerOptions } from '@vue/compiler-core'
@@ -221,7 +222,11 @@ export function defineComponentInstance(
221222

222223
emit: (event, ...args): any[] => {
223224
const props = instance.vnode.props || EMPTY_OBJ
224-
const handler = props[`on${event}`] || props[`on${capitalize(event)}`]
225+
let handler = props[`on${event}`] || props[`on${capitalize(event)}`]
226+
if (!handler && event.indexOf('update:') === 0) {
227+
event = hyphenate(event)
228+
handler = props[`on${event}`] || props[`on${capitalize(event)}`]
229+
}
225230
if (handler) {
226231
const res = callWithAsyncErrorHandling(
227232
handler,

0 commit comments

Comments
 (0)