installComponentHooks的疑问

来源:3-2 createComponent

qq_飞越疯人院_1

2019-04-27

function installComponentHooks (data: VNodeData) {
  const hooks = data.hook || (data.hook = {})
  for (let i = 0; i < hooksToMerge.length; i++) { //["init", "prepatch", "insert", "destroy"]
    const key = hooksToMerge[i]
    const existing = hooks[key]
    const toMerge = componentVNodeHooks[key]
    if (existing !== toMerge && !(existing && existing._merged)) {
      hooks[key] = existing ? mergeHook(toMerge, existing) : toMerge
    }
  }
}
正常来说toMerge变量是一直为undefined的,什么情况下会走到有值的逻辑了?
function mergeHook (f1: any, f2: any): Function {
  const merged = (a, b) => {
    // 这里可能出现两个init钩子函数,为什么都运行一次就算合并了呢?
    f1(a, b) 
    f2(a, b)
  }
  merged._merged = true
  return merged
}
写回答

1回答

ustbhuangyi

2019-04-28

1.toMerge 肯定是有值的啊,你说的是 existing 吧?但是你可以手写 render 函数,给 data 添加 hook。
2. 这是函数合并的策略,2个函数合并后的结果就是依次执行这俩函数的新函数。

0
5
ustbhuangyi
回复
_AA啊啊
这个和 mixin 无关啊
2020-01-13
共5条回复

Vue.js 源码深入解析 深入理解Vue实现原理

全方位讲解 Vue.js 源码,进阶高级工程师

4995 学习 · 1038 问题

查看课程