diff --git a/src/core/instance/render.js b/src/core/instance/render.js index cea8e51bd28..cf2e8fe89a4 100644 --- a/src/core/instance/render.js +++ b/src/core/instance/render.js @@ -54,12 +54,12 @@ export function initRender (vm: Component) { defineReactive(vm, '$attrs', parentData && parentData.attrs, () => { !isUpdatingChildComponent && warn(`$attrs is readonly.`, vm) }, true) - defineReactive(vm, '$listeners', parentData && parentData.on, () => { + defineReactive(vm, '$listeners', vm.$options._parentListeners, () => { !isUpdatingChildComponent && warn(`$listeners is readonly.`, vm) }, true) } else { defineReactive(vm, '$attrs', parentData && parentData.attrs, null, true) - defineReactive(vm, '$listeners', parentData && parentData.on, null, true) + defineReactive(vm, '$listeners', vm.$options._parentListeners, null, true) } } diff --git a/src/core/vdom/create-component.js b/src/core/vdom/create-component.js index 162e3725bc9..d3de4fb4c20 100644 --- a/src/core/vdom/create-component.js +++ b/src/core/vdom/create-component.js @@ -161,8 +161,12 @@ export function createComponent ( return createFunctionalComponent(Ctor, propsData, data, context, children) } - // keep listeners + // extract listeners, since these needs to be treated as + // child component listeners instead of DOM listeners const listeners = data.on + // replace with listeners with .native modifier + // so it gets processed during parent component patch. + data.on = data.nativeOn if (isTrue(Ctor.options.abstract)) { // abstract components do not keep anything diff --git a/src/platforms/web/runtime/modules/events.js b/src/platforms/web/runtime/modules/events.js index 8a1c1aea68b..104ef12ccf8 100644 --- a/src/platforms/web/runtime/modules/events.js +++ b/src/platforms/web/runtime/modules/events.js @@ -66,14 +66,11 @@ function remove ( } function updateDOMListeners (oldVnode: VNodeWithData, vnode: VNodeWithData) { - const isComponentRoot = isDef(vnode.componentOptions) - let oldOn = isComponentRoot ? oldVnode.data.nativeOn : oldVnode.data.on - let on = isComponentRoot ? vnode.data.nativeOn : vnode.data.on - if (isUndef(oldOn) && isUndef(on)) { + if (isUndef(oldVnode.data.on) && isUndef(vnode.data.on)) { return } - on = on || {} - oldOn = oldOn || {} + const on = vnode.data.on || {} + const oldOn = oldVnode.data.on || {} target = vnode.elm normalizeEvents(on) updateListeners(on, oldOn, add, remove, vnode.context) diff --git a/src/platforms/weex/runtime/modules/events.js b/src/platforms/weex/runtime/modules/events.js index 3b49d1747c5..824f08e6154 100755 --- a/src/platforms/weex/runtime/modules/events.js +++ b/src/platforms/weex/runtime/modules/events.js @@ -39,14 +39,11 @@ function remove ( } function updateDOMListeners (oldVnode: VNodeWithData, vnode: VNodeWithData) { - const isComponentRoot = !!vnode.componentOptions - let oldOn = isComponentRoot ? oldVnode.data.nativeOn : oldVnode.data.on - let on = isComponentRoot ? vnode.data.nativeOn : vnode.data.on - if (!oldOn && !on) { + if (!oldVnode.data.on && !vnode.data.on) { return } - on = on || {} - oldOn = oldOn || {} + const on = vnode.data.on || {} + const oldOn = oldVnode.data.on || {} target = vnode.elm updateListeners(on, oldOn, add, remove, vnode.context) }