我正在参加「掘金·启航计划」
面试的时候是否被经常问道虚拟DOM?但是知识储备是否能经得起推敲呢?今天用自己的话来总结一下方便以后回顾。。。。。
为什么要有虚拟DOM?
总结来说:DOM操作很消耗性能
当我们用jQuery或者原生来开发项目的时候,所有的DOM操作都是需要开发者来决定时机,需要我们不断地操作获取DOM节点
当我们用Vue/React开发项目的时候都是通过数据来驱动视图,当数据发生改变会导致视图的重新渲染,此时操作DOM的时机就由Vue/React库来触发
什么是虚拟DOM
虚拟DOM实际上是一个对象,他其实是一个轻量的一个对象,他不像真事DOM上有特别多的属性和方法,他触发的条件是当数据发生改变的时候,两个对象进行比较,只更新发生改变的那组数据
diff算法
虚拟DOM是基于diff算法来计算数据的最小变动
通过diff算法来计算树的变动 增加H,修改G为I
diff算法采取的策略
虚拟DOM的结构
- 通过elm属性来将虚拟DOM和真实DOM关联起来
- sel是选择器的意思,意思是id为list的ul标签
- data的意思是可以在对象中设置事件处理函数,样式等
- children可以设置对象的子元素
- key指的是比如我们在Vue中V-for循环中的key
key的作用
为了更好的复用,提高性能
需要用唯一的key值,方便复用,不使用唯一的key跟不使用的效果是一样的,他找不到对应的更新,只能全部销毁,全部更新
如果单纯的元素的删除和添加可以使用index索引,但是涉及到排序的话使用索引就会造成类似扑克牌洗牌的效果