vue2和vue3实现上区别

80 阅读2分钟

Object.defineProperty和Proxy区别

vue2使用Object.defineProperty劫持每个属性,生成getter和setter,属性下还有属性的会递归操作,读取数据的时候调用属性的getter,设置属性的时候调用setter,会有一个缺陷就是值是引用类型时候,改变数据不能及时更新到视图上,所以vue2开放了 set,set,delete两个解决这问题

vue3使用es6的proxy,proxy本身效率上就比Object.defineProperty要快,不用递归遍历所有的属性,而且代理是动态的读取数据,当访问某个属性的时候,动态的读取和设置,所以速度非常快。同时Proxy可以监测到成员的新增和删除,所以新增删除成员都可以重新渲染

for循环key的作用

key的作用是更高效的更新虚拟dom

比如当前有[a,b,c,d,e]五个虚拟dom,要更新成[a,b,f,c,d,e]

无论有没有key,前面渲染a,b节点是一样的,没有key的情况下,见到元素就渲染,用f覆盖c渲染出来,最后没有e,会追加创建一个e渲染出来,

有key的情况下,会对比更新,发现新数组突然多出来一个f,(就会判断尾部新老数组同时存在的元素,然后将它们更新出来),就会更新e,之后更新d,c,此时老数组已经空了,就会创建一个f,然后把他插入到指定的位置

使用key虽然执行次数是一样的,但是算法其实是没有执行的,时间和空间的效率更高

v-for和v-if

vue2中,v-for优先级比v-if高, vue3中,v-if优先级比v-for高,所以能一起用