mirror of
https://gitee.com/vuejs/vue.git
synced 2024-12-04 21:17:55 +08:00
improve mergeVNodeHook logic
This commit is contained in:
parent
e9bf5d1cd9
commit
4a74883864
@ -65,19 +65,19 @@ export function getFirstComponentChild (children: ?Array<any>) {
|
||||
return children && children.filter(c => c && c.componentOptions)[0]
|
||||
}
|
||||
|
||||
export function mergeVNodeHook (def: Object, key: string, hook: Function) {
|
||||
const oldHook = def[key]
|
||||
export function mergeVNodeHook (def: Object, hookKey: string, hook: Function, key: string) {
|
||||
key = key + hookKey
|
||||
const injectedHash = def.__injected || (def.__injected = {})
|
||||
if (injectedHash[key]) return
|
||||
injectedHash[key] = true
|
||||
const oldHook = def[hookKey]
|
||||
if (oldHook) {
|
||||
const injectedHash = def.__injected || (def.__injected = {})
|
||||
if (!injectedHash[key]) {
|
||||
injectedHash[key] = true
|
||||
def[key] = function () {
|
||||
oldHook.apply(this, arguments)
|
||||
hook.apply(this, arguments)
|
||||
}
|
||||
def[hookKey] = function () {
|
||||
oldHook.apply(this, arguments)
|
||||
hook.apply(this, arguments)
|
||||
}
|
||||
} else {
|
||||
def[key] = hook
|
||||
def[hookKey] = hook
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@ export default {
|
||||
if (hasInsert) {
|
||||
mergeVNodeHook(vnode.data.hook || (vnode.data.hook = {}), 'insert', () => {
|
||||
applyDirectives(oldVnode, vnode, 'inserted')
|
||||
})
|
||||
}, 'dir-insert')
|
||||
}
|
||||
},
|
||||
update: function updateDirectives (oldVnode: VNodeWithData, vnode: VNodeWithData) {
|
||||
|
@ -119,7 +119,7 @@ export default {
|
||||
return placeholder(h, rawChild)
|
||||
}
|
||||
|
||||
child.key = child.key == null || child.isStatic
|
||||
const key = child.key = child.key == null || child.isStatic
|
||||
? `__v${child.tag + this._uid}__`
|
||||
: child.key
|
||||
const data = (child.data || (child.data = {})).transition = extractTransitionData(this)
|
||||
@ -132,7 +132,7 @@ export default {
|
||||
child.data.show = true
|
||||
}
|
||||
|
||||
if (oldChild && oldChild.data && oldChild.key !== child.key) {
|
||||
if (oldChild && oldChild.data && oldChild.key !== key) {
|
||||
// replace old child transition data with fresh one
|
||||
// important for dynamic transitions!
|
||||
const oldData = oldChild.data.transition = extend({}, data)
|
||||
@ -144,16 +144,16 @@ export default {
|
||||
mergeVNodeHook(oldData, 'afterLeave', () => {
|
||||
this._leaving = false
|
||||
this.$forceUpdate()
|
||||
})
|
||||
}, key)
|
||||
return placeholder(h, rawChild)
|
||||
} else if (mode === 'in-out') {
|
||||
var delayedLeave
|
||||
var performLeave = () => { delayedLeave() }
|
||||
mergeVNodeHook(data, 'afterEnter', performLeave)
|
||||
mergeVNodeHook(data, 'enterCancelled', performLeave)
|
||||
mergeVNodeHook(data, 'afterEnter', performLeave, key)
|
||||
mergeVNodeHook(data, 'enterCancelled', performLeave, key)
|
||||
mergeVNodeHook(oldData, 'delayLeave', leave => {
|
||||
delayedLeave = leave
|
||||
})
|
||||
}, key)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -100,7 +100,7 @@ export function enter (vnode: VNodeWithData) {
|
||||
pendingNode.elm._leaveCb()
|
||||
}
|
||||
enterHook && enterHook(el, cb)
|
||||
})
|
||||
}, 'transition-insert')
|
||||
}
|
||||
|
||||
// start enter transition
|
||||
|
Loading…
Reference in New Issue
Block a user