Skip to content

Commit f7add52

Browse files
author
samxchen
committed
fix(core/instance/render): inherit instance listeners to rendered vnode
fix vuejs#12781
1 parent 49b6bd4 commit f7add52

File tree

1 file changed

+22
-0
lines changed

1 file changed

+22
-0
lines changed

src/core/instance/render.ts

+22
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,28 @@ export function renderMixin(Vue: typeof Component) {
128128
setCurrentInstance(vm)
129129
currentRenderingInstance = vm
130130
vnode = render.call(vm._renderProxy, vm.$createElement)
131+
// merge vnode hook listeners, example: vnode.data.on.click.fns = [fn1, fn2, fn3], vm.$vnode.data.on.click.fns = [fn4, fn5, fn6], then vnode.data.on.click.fns = [fn1, fn2, fn3, fn4, fn5, fn6]
132+
if (vnode?.data?.on && vm?.$vnode?.data?.on) {
133+
Object.keys(vm.$vnode.data.on).forEach((key) => {
134+
if (vnode.data.on[key]) {
135+
let fnsOnVnode = vnode.data.on[key];
136+
if (typeof fnsOnVnode === 'function') {
137+
fnsOnVnode = [fnsOnVnode];
138+
}
139+
let fnsOnVm = vm.$vnode?.data?.on?.[key];
140+
if (typeof fnsOnVm === 'function') {
141+
fnsOnVm = [fnsOnVm];
142+
}
143+
vnode.data.on[key] = [
144+
...fnsOnVnode,
145+
...(fnsOnVm || []),
146+
]
147+
if (vm.$vnode?.data?.on?.[key]) {
148+
delete vm.$vnode.data.on[key];
149+
}
150+
}
151+
})
152+
}
131153
} catch (e: any) {
132154
handleError(e, vm, `render`)
133155
// return error render result,

0 commit comments

Comments
 (0)