博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JS每日一题:Vue中的diff算法?
阅读量:5904 次
发布时间:2019-06-19

本文共 1536 字,大约阅读时间需要 5 分钟。

20190125

Vue中的diff算法?

概念: diff算法是一种优化手段,将前后两个模块进行差异对比,修补(更新)差异的过程叫做patch(打补丁)

为什么vue,react这些框架中都会有diff算法呢? 我们都知道渲染真实dom的开销是很大的,这个跟性能优化中的重绘重排意义类似, 回到正题来, 有时候我们修改了页面中的某个数据,如果直接渲染到真实DOM中会引起整棵数的重绘重排, 那么我们能不能只让我们修改的数据映射到真实DOM, 做一个最少化重绘重排呢,说到这里你应该对为什么使用diff算法有一个简单的概念了

virtual DOM和真实DOM的区别

一句话概括吧,virtual DOM是将真实的DOM的数据抽取出来,以对象的形式模拟树形结构, diff 算法比较的也是virtual DOM

代码理解

JS每日一题

// 转换成VNode 类似于下面这种const Vnode = { tag: 'div', children: [ { tag: 'p', text: 'JS每日一题' } ]};
diff 是如何比较的?
源码太多了,就不贴了, 有兴趣的可以自己看看

简单的说就是新旧虚拟dom 的比较,如果有差异就以新的为准,然后再插入的真实的dom中,重新渲染

特点

  • 只会做同级比较,不做跨级比较
  • 比较后几种情况

    • if (oldVnode === vnode),他们的引用一致,可以认为没有变化。
    • if(oldVnode.text !== null && vnode.text !== null && oldVnode.text !== vnode.text),文本节点的比较,需要修改,则会调用Node.textContent = vnode.text
    • if( oldCh && ch && oldCh !== ch ), 两个节点都有子节点,而且它们不一样,这样我们会调用updateChildren函数比较子节点,这是diff的核心
    • else if (ch),只有新的节点有子节点,调用createEle(vnode)vnode.el已经引用了老的dom节点,createEle函数会在老dom节点上添加子节点。
    • else if (oldCh),新节点没有子节点,老节点有子节点,直接删除老节点。
key的作用

设置key和不设置key的区别:

不设key,newCh和oldCh只会进行头尾两端的相互比较,设key后,除了头尾两端的比较外,还会从用key生成的对象oldKeyToIdx中查找匹配的节点,所以为节点设置key可以更高效的利用dom

如我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的:

即把C更新成F,D更新成C,E更新成D,最后再插入E,是不是很没有效率?

所以我们需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

所以一句话,key的作用主要是为了高效的更新虚拟DOM。另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果

总结

  • 尽量不要跨层级的修改dom
  • 在开发组件时,保持稳定的 DOM 结构会有助于性能的提升
  • 设置key可以让diff更高效

关于JS每日一题

JS每日一题可以看成是一个语音答题社区

每天利用碎片时间采用60秒内的语音形式来完成当天的考题
群主在次日0点推送当天的参考答案

  • 注 绝不仅限于完成当天任务,更多是查漏补缺,学习群内其它同学优秀的答题思路

转载地址:http://kuupx.baihongyu.com/

你可能感兴趣的文章
一种新的移动APP保持登陆的实现机制介绍
查看>>
《Oracle高性能自动化运维》一一3.5 小结
查看>>
预告:第50期:硬创公开课特别版! 语音识别建模技术解析:AI浪潮下的技术演进...
查看>>
网站内容防盗服务商Distil 获2100万美元C轮融资
查看>>
Sprint携手三星测试全新LTE技术 下行速度理论峰值6Gbps
查看>>
DeepMind新动向所带来的A.I.创业启示
查看>>
Shell爬取知乎某问题下所有图片
查看>>
深度:机器如何模仿人类的学习方式?
查看>>
思博伦全面测试解决方案:助推新一代网络加速部署
查看>>
AIR 055|机器人抓取操作专家孙宇教授专访
查看>>
曲线免费升级Windows 10方式将遭微软封杀
查看>>
国外信息通信立法和政策最新趋势及分析
查看>>
《云计算:原理与范式》一3.5 走近SaaS集成之谜
查看>>
【波士顿动力中国版】拿到 1 亿美金融资后,ROOBO 用“达萌”和“X-DOG”定义宠物机器人...
查看>>
《云计算:原理与范式》一2.2 迁移到云的主要途径
查看>>
网络安全与执法专业引入大数据相关课程体系的研究
查看>>
物联网行业4大潜在突破领域浅析
查看>>
【视点】说好的光伏政策严肃性呢?
查看>>
阿里云助力网络安全社区MMBEST,书写云上新面貌
查看>>
如何让门店员工积极参与RFID项目
查看>>