HcySunYang / vue-design

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

patch一章中的 patchChildren。旧VNode只有一个节点,新的有多个。旧的节点是不是可以复用的,不用删除? #284

Open cn1001wang opened 4 years ago

cn1001wang commented 4 years ago

可以给网站加个评论功能吗,我在patch一章中的 patchChildren 一节 ,有个不同意见。 image

旧的 VNode 是一个只有一个子节点的 div 标签,而新的 VNode 是一个拥有多个子节点的 div 标签。最终的效果是旧的单个子节点被移除,新的多个子节点全都被添加上去。

这个旧的节点是不是可以复用的,不用删除。假设现在v-for渲染一个数组,开始只有一个子元素,后来push一个新的。这时候无需删除旧的子节点,而是应该只添加一个新增节点。

源码部分我还在阅读,如有理解方面问题,请指出

AmJunh commented 4 years ago

image 先更新自身, 然后更新子节点 子节点时会判断,

  1. 都存在; updateChildren更新, 在这个函数里进行子节点的比对和更新, 也包括你说的节点是否可重用的判断;
  2. 新的存在, 老的不存在, 重置当前dom内容为空字符串, 调用addVnodes;
  3. 新的不存在, 删除老的 等等