当前位置: 首页 > Web前端 > vue.js

对比一下vue和react的工作原理

时间:2023-03-31 19:56:37 vue.js

问题,vue很好用,但是如果vue实现了双向数据绑定,最后怎么渲染到dom上呢?vue1.在初始化vue的时候,在dom处理方面,vue会将template转化为render方法。拿到render方法后,会转成虚拟dom。在数据方面,它将数据中的数据变成响应式数据。每个节点都是响应式的。2.对于普通对象的更新:Object.defineProperty({get:()=>{/***1.依赖集合,*2.集合在watch中完成,newWatch时会触发get被启动*3.在watch构造函数中,一个全局目标对象将指向this,它是一个watch实例*4.将watch放入dep队列*5.Puttarget=undefined*/},set:()=>{/***1.当数据发生变化时,触发这个hook*2.遍历当前dep队列中的watch对象,执行watch.update,更新对象存放在process.nextTick中,所以是批量更新*3,在更新过程中,Vue根据这些数据生成虚拟dom,将新的虚拟dom与旧的虚拟dom进行比较,将差异更新到真实的dom树中*4.直接diff比较算法virtualdom的,vue参考了linux文件系统的文件比较算法*/}})3.数组的更新依赖于集合:collectchangesinget和普通对象一样,把watcher放在dep中,发送update:vue劫持了原数组push、slice、splice、shift、unshift等引起数组变化的方法,在高版本浏览器中,指向Array.protype通过数组实例的__proto__,劫持,低版本浏览器直接获取实例,array.push=Array.prototype.push;然后发送更新;4、patch1)、发送update,vue会遍历dep中的watch,watch会执行update方法2)、为什么要引入virtualdom,在vue1.0时代还没有引入virtualdom。Vue通过watch准确知道每个节点的变化,并及时更新。但是这种方式对每个数据节点的更新粒度是精确的,在大型项目中内存消耗比较严重。在vue2.0时代,vue只对应每个组件一个watch。组件中的数据变化只会进入一个watch。executiondep中的watch本身在process.nextTick中,会批量更新操作,最后更新数据会形成一个虚拟dom,然后和老树对比,得到的差值会更新到真实的dom中.react1和react是单向数据流。react在初始化的时候,也会把真实的dom转成虚拟的dom,vnode是一个fiber对象节点。2、react的setState是通过setState完成的。setState的更新机制离不开react的事务机制。Traction对象是react的事务。Traction使用AOP(装饰器模式)Traction.before(()=>{isBatchingUpdate=true})Traction.after(()=>{isBatchingUpdate=false})Traction执行时,中间的setState在isBatchingUpdate=true,所以批量更新阶段的状态不能立即打补丁,会放在任务队列中,执行完成后,触发after,然后,dom3和react的视图更新才能真正更新,这在事务结束时触发。如果更新是同步过程,会影响渲染,造成卡顿(放到异步队列中,同样会卡顿),react在16版本之后模拟浏览器的requestIdlecallback,做任务调度,这样它不会对渲染产生任何影响。每一帧渲染完之后,如果还有时间做数据计算和更新。综上所述,Vue可以更新更小的粒度,而React不行。这是由数据驱动器决定的。Vue底层的diff算法参考了Linux的文件比较算法,效率上比React的diff要好,但是React实现了requsetIdleCallback,这样计算不影响渲染。更流畅。