vue和react的异同

react和vue大体上是相同的,比如都使用虚拟DOM高效的更新视图,都提倡组件化,都实现了数据驱动视图,都使用diff算法,也都对diff算法进行了优化,都有router库实现url到组件的映射,都有状态管理等等.....


1.组件化的异同

相同点:react和vue都推崇组件化,通过将页面拆分成一个一个小的可复用单元来提高代码的复用率和开发效率。在开发时react和vue有相同的套路,比如都有父子组件传参,都有数据状态管理,都有前端路由等。

差异:

React推荐的做法是JSX + inline style, 也就是把 HTML 和 CSS 全都写进 JavaScript 中,即 all in js;

Vue 推荐的做法是 template 的单文件组件格式(简单易懂,从传统前端转过来易于理解),即 html,css,JS 写在同一个文件(vue也支持JSX写法)


2.虚拟DOM异同

相同点:

Vue与React都使用了 Virtual DOM + Diff算法, 不管是Vue的Template模板+options api 写法, 还是React的Class或者Function写法,最后都是生成render函数,而render函数执行返回VNode(虚拟DOM的数据结构,本质上是棵树)。

当每一次UI更新时,总会根据render重新生成最新的VNode,然后跟以前缓存起来老的VNode进行比对,再使用Diff算法(框架核心)去真正更新真实DOM(虚拟DOM是JS对象结构,同样在JS引擎中,而真实DOM在浏览器渲染引擎中,所以操作虚拟DOM比操作真实DOM开销要小的多)

diff算法源码异同

在处理老节点部分,都需要把节点处理 key - value 的 Map 数据结构,方便在往后的比对中可以快速通过节点的 key 取到对应的节点。同样在比对两个新老节点是否相同时,key 是否相同也是非常重要的判断标准。所以不同是 React, 还是 Vue,在写动态列表的时候,都需要设置一个唯一值 key,这样在 diff 算法处理的时候性能才最大化。

不同点:react 会自顶向下全diff。vue会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树。

在react中,当状态发生改变时,组件树就会自顶向下的全diff, 重新render页面, 重新生成新的虚拟dom tree, 新旧dom tree进行比较, 进行patch打补丁方式,局部更新dom。所以react为了避免父组件更新而引起不必要的子组件更新, 可以在shouldComponentUpdate做逻辑判断,减少没必要的render, 以及重新生成虚拟dom,做差量对比过程。

在vue中, 通过Object.defineProperty 把 data 属性全部转为 getter/setter。同时watcher实例对象会在组件渲染时,将属性记录为dep, 当dep 项中的 setter被调用时,通知watch重新计算,使得关联组件更新。(vue中的diff是用双端比较的方式实现的,但是vue2与vue3有区别)


3.数据驱动视图

vue中的数据驱动视图

Vuejs的数据驱动是通过MVVM这种框架来实现的。MVVM框架主要包含3个部分:model、view和 viewModel。

  • Model:指的是数据部分,对应到前端就是javascript对象

  • View:指的是视图部分,对应前端就是dom

  • ViewModel:就是连接视图与数据的中间件

ViewModel是实现数据驱动视图的核心,当数据变化的时候,ViewModel能够监听到这种变化,并及时的通知view做出修改。同样的,当页面有事件触发时,ViewModel也能够监听到事件,并通知model进行响应。ViewModel就相当于一个观察者,监控着双方的动作,并及时通知对方进行相应的操作。

首先,vuejs在实例化的过程中,会对遍历传给实例化对象选项中的data 选项,遍历其所有属性并使用 Object.defineProperty 把这些属性全部转为 getter/setter。

同时每一个实例对象都有一个watcher实例对象,他会在模板编译的过程中,用getter去访问data的属性,watcher此时就会把用到的data属性记为依赖,这样就建立了视图与数据之间的联系。当之后我们渲染视图的数据依赖发生改变(即数据的setter被调用)的时候,watcher会对比前后两个的数值是否发生变化,然后确定是否通知视图进行重新渲染。这样就实现了所谓的数据对于视图的驱动。

react的数据驱动视图

首先了解一些列内容:

  • pending:当前所有等待更新的state队列

  • isBatchingUpdates:React中用于标识当前是否处理批量更新状态,默认false。

  • dirtyComponent:当前所有待更新state的组件队列

React通过setState实现数据驱动视图,通过setState来引发一次组件的更新过程从而实现页面的重新渲染(除非shouldComponentUpdate返回false)。

  • setState()首先将接收的第一个参数state存储在pending队列中;(state)

  • 判断当前React是否处于批量更新状态,是的话就将需要更新state的组件添加到dirtyComponents中;(组件)

  • 不是的话,它会遍历dirtyComponents的所有组件,调用updateComponent方法更新每个dirty组件(开启批量更新事务)

<think>好的,我现在需要帮助用户比较VueReact中的diff算法原理。首先,我得回忆一下这两个框架的diff算法各自的特点。 根据用户提供的引用资料,React的diff算法主要采用同层级比较,也就是不会跨层级去对比节点。它在列表处理中使用key属性来识别稳定元素,这样可以减少不必要的重新渲染。而Vue的diff算法则是双端比较,从新旧节点的两端开始向中间收拢,这样可能更高效一些。此外,Vue在比较时会移动节点到正确的位置,而不是像React那样直接按顺序遍历。 需要确认这些信息是否正确。比如,React确实是采用递归的同级比较,而Vue3可能优化了双端对比的策略。另外,用户提到的引用5中说Vue的diff更优,这可能是因为双端对比减少了移动次数,但具体情况还要看实现细节。 接下来,我需要组织回答的结构。先分别讲ReactVue的原理,然后比较它们的异同点。可能还需要提到时间复杂度,比如React的O(n^3)到优化后的O(n),但实际中因为同层比较所以是O(n)。Vue的双端对比可能在某些情况下更高效,比如列表中间插入的情况。 还要注意用户提到的引用4中的内容,同层比较、深度优先、循环从两边向中间比较。需要将这些点整合到回答中。同时,用户可能希望了解两者的优缺点,比如性能差异应用场景。 需要确保回答使用正确的中文术语,并按照系统指令,行内数学公式用$...$,独立公式用$$...$$,但这里可能数学公式较少,主要侧重文字描述。此外,生成相关问题,比如优化方法、性能比较等。 检查是否有遗漏的关键点,比如key的作用,移动策略的不同,以及框架如何应用这些算法到虚拟DOM更新中。确保回答引用正确的来源,比如引用1到5中的内容,并在适当的位置添加引用标识。 最后,生成的相关问题需要与主题相关,帮助用户进一步深入,比如比较Vue3React的diff算法,或者实际应用中的差异。这样用户可以得到全面的信息,满足他们的需求。</think>### VueReact Diff算法原理对比 #### 一、React Diff算法原理 1. **分层比较策略** React采用**同层级比较**策略,仅对比同级节点,不会跨层级递归。若节点层级发生变化,则直接销毁旧节点并创建新节点[^1][^4]。 $$ \text{复杂度:} O(n) \quad \text{(通过分层优化,避免全树遍历)} $$ 2. **列表对比优化** - 使用`key`属性标记节点唯一性,通过新旧列表的`key`匹配判断节点是否可复用[^1]。 - 若列表顺序变化,React会按**顺序遍历**更新,可能导致不必要的移动操作。例如: ```javascript // 旧列表:A-B-C-D,新列表:A-C-B-D // React会将C移动到B前,B移动到C后 ``` 3. **递归深度优先遍历** 从根节点开始逐层递归比较,若父节点类型不同,则直接替换整个子树[^4]。 #### 二、Vue Diff算法原理 1. **双端对比策略** Vue采用**双端指针(Four Pointers)**,同时从新旧列表的**头尾向中间**比较,优先处理以下四种情况[^2][^5]: - 新旧头节点相同 - 新旧尾节点相同 - 旧头与新尾相同 - 旧尾与新头相同 $$ \text{复杂度:} O(n) \quad \text{(但实际移动次数更少)} $$ 2. **最长递增子序列优化(Vue3)** Vue3引入**最长递增子序列(LIS)**算法,减少节点移动次数。例如: ```javascript // 旧列表:A-B-C-D,新列表:A-D-B-C // Vue3会找到稳定序列B-C,仅移动D到A后 ``` 3. **节点复用规则** 若节点类型相同且`key`匹配,则直接复用DOM元素,仅更新属性。 #### 三、核心差异对比 | **对比维度** | **React** | **Vue** | |--------------------|------------------------------------|----------------------------------| | 比较策略 | 顺序遍历同级节点 | 双端指针向中间收敛 | | 列表更新效率 | 可能因顺序变化产生更多移动 | 通过双端对比减少移动次数 | | 节点复用规则 | 依赖`key`类型匹配 | 同React,但结合双端策略优化 | | 跨层级处理 | 直接销毁重建 | 同React | | 框架版本差异 | React 16后引入Fiber优化遍历中断 | Vue3引入LIS优化列表移动效率 | #### 四、性能与应用场景 - **React适用场景**:适合层级稳定、列表顺序变化较少的场景(如后台管理系统)[^4]。 - **Vue适用场景**:适合高频列表操作(如拖拽排序),双端对比减少DOM移动次数[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值