Vue和react的异同

7 篇文章 1 订阅

共同点

Vue和React存在着很多的共同点:

  • 数据驱动视图

  • 组件化

  • 都使用 Virtual DOM

1. 数据驱动视图

在jquery时代,我们需要频繁的操作DOM来实现页面效果与交互;而Vue和React 解决了这一痛点,采用数据驱动视图方式,隐藏操作DOM的频繁操作。所以我们在开发时,只需要关注数据变化即可,但是二者实现方式不尽相同。

2. 组件化

React与Vue都遵循组件化思想,它们把注意力放在UI层,将页面分成一些细块,这些块就是组件,组件之间的组合嵌套就形成最后的网页界面。

所以在开发时都有相同的套路,比如都有父子组件传递, 都有数据状态管理、前端路由、插槽等。

3. Virtual 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开销要小的多)

4.Vue和React通用流程:

在这里插入图片描述

不同点

组件写法差异

React推荐的做法是JSX + inline style, 也就是把 HTML 和 CSS 全都写进 JavaScript 中,即 all in js;
Vue 推荐的做法是 template 的单文件组件格式(简单易懂,从传统前端转过来易于理解),即 html,css,JS 写在同一个文件(vue也支持JSX写法)

这个差异一定程度上也是由于二者核心思想不同而导致的。

diff算法不同

传统Diff算法是循环递归每一个节点:

在这里插入图片描述
传统diff
如上图所示,从左侧a节点依次进行对比:a->d、a->e、a->b、a->a、a->c, 剩下的其他节点也是与右侧树每个节点进行对比。

将两颗树中所有的节点一一对比需要O(n²)的复杂度,在对比过程中发现旧节点在新的树中未找到,那么就需要把旧节点删除,删除一棵树的一个节点(找到一个合适的节点放到被删除的位置)的时间复杂度为O(n),同理添加新节点的复杂度也是O(n),合起来diff两个树的复杂度就是O(n³)

传统Diff算法复杂度太高, vue2.x加入了 Virtual Dom和react拥有相同的diff优化原则(将算法复杂度降为O(n))。

两者流程思路上是类似的:

  • 不同的组件产生不同的 DOM 结构。当type不相同时,对应DOM操作就是直接销毁老的DOM,创建新的DOM。

  • 同一层次的一组子节点,可以通过唯一的 key 区分。

React的Diff算法核心实现

在这里插入图片描述
1.react首先对新集合进行遍历,for( name in nextChildren)。

2.通过唯一key来判断老集合中是否存在相同的节点。如果没有的话创建

3.如果有的话,if (preChild === nextChild )

  • 会将节点在新集合中的位置和在老集合中lastIndex进行比较

  • 如果if (child._mountIndex < lastIndex) 进行移动操作,否则不进行移动操作。

  • 如果遍历的过程中,发现在新集合中没有,但在老集合中有的节点,会进行删除操作

Vue的Diff算法核心实现

updateChildren是vue diff的核心, 过程可以概括为:

  • 旧children和新children各有两个头尾的变量StartIdx和EndIdx,它们的2个变量相互比较,一共有4种比较方式。

  • 如果4种比较都没匹配,如果设置了key,就会用key进行比较,在比较的过程中,变量会往中间靠,一旦StartIdx>EndIdx表明旧children和新children至少有一个已经遍历完了,就会结束比较。

可以用下图来描述在一次比较过程中四个步骤:
在这里插入图片描述
Vue2的核心Diff算法采用了双端比较的算法,同时从新旧children的两端开始进行比较,借助key值找到可复用的节点,再进行相关操作。相比React的Diff算法,同样情况下可以减少移动节点次数,减少不必要的性能损耗,更加的优雅。

响应式原理不同

Vue

Vue依赖收集,自动优化,数据可变。
Vue递归监听data的所有属性,直接修改。
当数据改变时,自动找到引用 组件 重新渲染。

React

单项数据流
React基于状态机,手动优化,数据不可变,需要setState驱动新的state替换老的state。
当数据改变时,以组件为根目录,默认全部子组件重新渲染, 所以 React 中会需要 shouldComponentUpdate 这个生命周期函数方法来进行控制

其他不同点

除了上面的四个点外,细数还有很多不同点的, 比如api的差异也挺大的,Vue为了更加简单易用,引入了指令、filter等概念以及大量的option API,比如 watch、computed等都是非常好用的。

而React的API比较少, 如果你的JavaScript基础比较好,上手也是比较容易的

vue比较适用于小项目,大项目用react会比较好点,当项目大的时候,state特别多,订阅者watcher也会很多,所以会导致卡顿,所以react适用于大型项目,是因为比较可控一些

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值