第一条线:初始化 patch (container,vnode)
生成虚拟dom
function createElement(vnode) {
let tag = vnode.tag;
let attrs = vnode.attrs || {};
let children = vnode.children || [];
if (!tag) {
return null;
}
let elem = document.createElement(tag);
let attrName;
for (attrName in attrs) {
if (attrs.hasOwnProperty(attrName)) {
elem.setAttribute(attrName, attrs[attrName]);
}
}
children.forEach(function (childVnode) {
elem.appendChild(createElement(childVnode));
});
return elem;
}
第二条线 更新 update(vnode,newVnode)
更新节点
function updateChildren(vnode, newVnode) {
let children = vnode.children || [];
let newChildren = newVnode.children || [];
children.forEach(function (childrenVnode, index) {
let newChildrenVnode = newChildren[index];
if (childrenVnode.tag === newChildrenVnode.tag) {
updateChildren(childrenVnode, newChildrenVnode);
} else {
replaceNode(childrenVnode, newChildrenVnode);
}
});
}