HcySunYang / vue-design

📖 master分支:《渲染器》
http://hcysun.me/vue-design/zh/
6k stars 916 forks source link

patchPortal 中,prevVNode.tag不是一个 dom 元素,应该改为document.querySelector(prevVNode.tag) #273

Open moonlight718 opened 4 years ago

moonlight718 commented 4 years ago

如注释所示:

function patchPortal(prevVNode, nextVNode) {
  patchChildren(
    prevVNode.childFlags,
    nextVNode.childFlags,
    prevVNode.children,
    nextVNode.children,
    prevVNode.tag // prevVNode.tag 只是一个字符串,不是一个dom,此处应该改为 document.querySelector(prevVNode.tag)
// 否则当 prevVNode 有一个子节点,nextVNode 有多个子节点时,涉及到 removeChild,代码会报错
  );
  nextVNode.el = prevVNode.el;

  if (nextVNode.tag !== prevVNode.tag) {
    const container =
      typeof nextVNode.tag === "string"
        ? document.querySelector(nextVNode.tag)
        : nextVNode.tag;

    switch (nextVNode.childFlags) {
      case ChildrenFlags.SINGLE_VNODE:
        container.appendChild(nextVNode.children.el);
        break;
      case ChildrenFlags.NO_CHILDREN:
        break;
      default:
        for (let i = 0; i < nextVNode.children.length; i++) {
          container.appendChild(nextVNode.children[i].el);
        }
        break;
    }
  }
}