虚拟Dom,假的Dom,本质就是js对象 用来描述真正的Dom 真实的dom操作起来 性能慢,并且会导致重绘和回流 频繁操作真实dom性能会很差 虚拟dom是一个js对象,操作起来很快
二
当数据更新是重新渲染的流程
页面初始化的时候 会根据代码生成一个新的dom树
三
diff算法规则
2 节点没有变,只是属性变了,就不动了,认为节点还是之前那个,这个称之为就地复用,改属性就行了
四
上面的对比有时候会有问题,所以为了在节点一样的时候让vue知道他们不是同一个节点,所以要加Key
1什么是虚拟dom
虚拟dom是对真实dom的映射 她是一个普通的js对象
2为什么要有虚拟dom
真实的dom身上有很多属性和方法 操作起来性能慢 每次操作真实的dom都会导致重绘和回流 所以不太好 频繁操作虚拟dom不存在性能问题 等数据全部更新完之后,只会更新真实dom中,dom树中需要改变的地方,而且渲染真实的dom,只会有一次重绘和回流
3 页面初始化得时候beaforemounted 的时候生成虚拟dom树,当数据更新得时候会在beforeupdata 的时候生成新的虚拟dom树,接下来会对新旧dom树进行对比(广度优先同层比较,时间复杂度是o(n)线性复杂)
情况1 节点,标签,元素变了 直接销毁重建
情况2 元素没有变 属性或内容变了 修改属性和内容就行了
情况3 存在两种情况 key是索引index的时候会采用就地复用得原则 在顺序上位置是同一个索引就会被认为是同一个元素,正常情况下效率确实会很高 但是当你采用 unshift,sort,reverse这些破坏顺序得时候,就会出现不必要更新的元素也被更新了的错乱情况,key就是一个唯一标识,就像人得身份证号一样,有了这个之后,就算顺序被打乱了,但是vue知道只要key一样就是同一个元素,就不会出现区更新就得原色的情况
虚拟dom除了可以高效更新,还可以实现跨平台,一套代码可以生成不同平台的相应代码