normalizeChildren 与 createChildren 函数之间的关联

来源:2-7 createElement

aznmoe

2019-12-31

在 render 阶段 进入 normalizeChildren 函数的时候 是将 children 整理成 vnode[]
也既是 function normalizeChildren (children: any): ?Array<VNode>

在 update 阶段当 传入的 vnode 定义了 tag,那么 将会 进入
createChildren(vnode, children, insertedVnodeQueue); 这个函数,也就是 对 children 进行整理。 在 createChildren 函数中 有 个 判断条件

function createChildren(vnode, children, insertedVnodeQueue) {
	// children 不应该 一直都是一个数组么,什么条件 会进入 else if 语句
    if (Array.isArray(children)) {
        for (let i = 0; i < children.length; ++i) {
            createElm(children[i], insertedVnodeQueue, vnode.elm, null, true, children, i);
        }
    } else if (isPrimitive(vnode.text)) {
        nodeOps.appendChild(vnode.elm, nodeOps.createTextNode(String(vnode.text)));
    }
}

由于 normalizeChildren 函数 一直 都是 返回一个 数组的,那么 什么条件情况下 createChildren 会进入 isPrimitive(vnode.text) 这个 条件里面

写回答

1回答

ustbhuangyi

2020-01-01

createChildren 函数中的 children 还可能是 undefined,考虑到 createElm 函数就是递归执行 createChildren,vnode.chiddren 可能是 undefined ,就走到了 else if 逻辑了

0
4
ustbhuangyi
回复
月上云流
嗯,是的
2020-01-14
共4条回复

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

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

4989 学习 · 1038 问题

查看课程