baseModule
ref
export default {
create(_,vnode){
registerRef(vnode)
},
update(oldVnode,vnode){
if(oldVnode.data.ref !== vnode.data.ref){
registerRef(oldVnode,true)
registerRef(vnode)
}
},
destroy(vnode){
registerRef(vnode,true)
}
}
function registerRef(vnode,isRemoval){
const key = vnode.data.ref
if(!isDef(key)) return
const vm = vnode.context
const ref = vnode.componentInstance || vnode.elm
const refs = vm.$refs
if(isRemoval){
if(Array.isArray(refs[key])){
remove(refs[key],ref)
}else if(refs[key] === ref){
refs[key] = undefined
}
}else{
if(vnode.data.refInFor){
if(!Array.isArray(refs[key])){
refs[key] = ref
}else if(refs[key].indexOf(ref) < 0){
refs[key].push(ref)
}
}else{
refs[key] = ref
}
}
}
directives
export default{
create:updateDirectives,
update:updateDirectives,
destroy:function unbindDirectives(vnode){
updateDirectives(vnode,emptyNode)
}
}
function updateDirectives(oldVnode,vnode){
if(oldVnode.data.directives || vnode.data.directives){
_update(oldVnode,vnode)
}
}
function _update(oldVnode,vnode){
const isCreate = oldVnode === emptyNode
const isDestroy = vnode === emptyNode
const oldDirs = normalizeDirectives(oldVnode.data.directives,oldVnode.context)
const newDirs = normalizeDirectives(vnode.data.directives,vnode.context)
const dirsWithInsert = []
const dirsWithPostpatch = []
let key,oldDir,dir
for(key in newDirs){
oldDir = oldDirs[key]
dir = newDirs[key]
if(!oldDir){
callHook(dir,'bind',vnode,oldVnode)
if(dir.def && dir.def.inserted){
dirsWithInsert.push(dir)
}
}else{
dir.oldValue = oldDir.value
dir.oldArg = oldDir.arg
callHook(dir,'update',vnode,oldVnode)
if(dir.def && dir.def.componentUpdated){
dirsWithPostpatch.push(dir)
}
}
}
if(dirsWithInsert.length){
const callInsert = () => {
for(let i = 0;i < dirsWithInsert.length; i++){
callHook(dirsWithInsert[i],'inserted',vnode,oldVnode)
}
}
if(isCreate){
mergeVnodeHook(vnode,'insert',callInsert)
}else{
callInsert()
}
}
if(dirsWithPostpatch.length){
mergeVnodeHook(vnode,'postpatch',() => {
for(let i = 0; i < dirsWithPostpatch.length; i ++){
callHook(dirsWithPostpatch[i],'componentUpdated',vnode,oldVnode)
}
})
}
if(!isCreate){
for(key in oldDirs){
if(!newDirs[key]){
callHook(oldDirs[key],'unbind',oldVnode,oldVnode,isDestroy)
}
}
}
}