HcySunYang / vue-design

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

【渲染器之patch】两处示例代码考虑不周全 #255

Open changzhiwin opened 5 years ago

changzhiwin commented 5 years ago

1,更新 Fragment里面,NO_CHILDREN时直接nextVNode.el = prevVNode.el是不对的,因为prevVNode.childFlags也有三种情况,当prevVNode.childFlags也是NO_CHILDREN才能直接赋值

switch (nextVNode.childFlags) {
    case ChildrenFlags.SINGLE_VNODE:
      nextVNode.el = nextVNode.children.el
      break
    case ChildrenFlags.NO_CHILDREN:
      nextVNode.el = prevVNode.el // 这句有问题
      break
    default:
      nextVNode.el = nextVNode.children[0].el
  }

2,更新 Portal里面,直接传的containerprevVNode.tag也是不严格的,因为有是string的情况

patchPortal (prevVNode, nextVNode){
  patchChildren(
    prevVNode.childFlags,
    nextVNode.childFlags,
    prevVNode.children,
    nextVNode.children,
    prevVNode.tag // 这句有问题
  )
LhrAlander commented 4 years ago

1,更新 Fragment里面,NO_CHILDREN时直接nextVNode.el = prevVNode.el是不对的,因为prevVNode.childFlags也有三种情况,当prevVNode.childFlags也是NO_CHILDREN才能直接赋值

switch (nextVNode.childFlags) {
    case ChildrenFlags.SINGLE_VNODE:
      nextVNode.el = nextVNode.children.el
      break
    case ChildrenFlags.NO_CHILDREN:
      nextVNode.el = prevVNode.el // 这句有问题
      break
    default:
      nextVNode.el = nextVNode.children[0].el
  }

2,更新 Portal里面,直接传的containerprevVNode.tag也是不严格的,因为有是string的情况

patchPortal (prevVNode, nextVNode){
  patchChildren(
    prevVNode.childFlags,
    nextVNode.childFlags,
    prevVNode.children,
    nextVNode.children,
    prevVNode.tag // 这句有问题
  )

我看到Fragment中也发现了这个问题,好像确实是有点问题的获取引用时,不知道楼主是否补丁了这个问题?