From f7add52afa83d0e033a1886f42c597d1ecba6e3c Mon Sep 17 00:00:00 2001 From: samxchen Date: Wed, 24 May 2023 16:31:40 +0800 Subject: [PATCH] fix(core/instance/render): inherit instance listeners to rendered vnode fix #12781 --- src/core/instance/render.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/core/instance/render.ts b/src/core/instance/render.ts index b71125b275d..0ce23f30b69 100644 --- a/src/core/instance/render.ts +++ b/src/core/instance/render.ts @@ -128,6 +128,28 @@ export function renderMixin(Vue: typeof Component) { setCurrentInstance(vm) currentRenderingInstance = vm vnode = render.call(vm._renderProxy, vm.$createElement) + // 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] + if (vnode?.data?.on && vm?.$vnode?.data?.on) { + Object.keys(vm.$vnode.data.on).forEach((key) => { + if (vnode.data.on[key]) { + let fnsOnVnode = vnode.data.on[key]; + if (typeof fnsOnVnode === 'function') { + fnsOnVnode = [fnsOnVnode]; + } + let fnsOnVm = vm.$vnode?.data?.on?.[key]; + if (typeof fnsOnVm === 'function') { + fnsOnVm = [fnsOnVm]; + } + vnode.data.on[key] = [ + ...fnsOnVnode, + ...(fnsOnVm || []), + ] + if (vm.$vnode?.data?.on?.[key]) { + delete vm.$vnode.data.on[key]; + } + } + }) + } } catch (e: any) { handleError(e, vm, `render`) // return error render result,