Vue和React的区别?

news2024/12/22 3:28:13

目录

共同点

1. 数据驱动视图

2. 组件化

3. Virtual DOM

不同点

1. 核心思想不同

2. 组件写法差异

3. diff算法不同

4. 响应式原理不同

5. 其他不同点


首先找到 Vue 和 React 的共性,它们被用于解决什么问题, 然后再挖掘各自独特的个性、设计原理以及未来的趋势等。

vue和react区别

共同点

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

Vue和React通用流程:

 

 

不同点

Vue和React两者虽然都是用于构建用户界面的框架,但是也有很大的差异,首先二者核心的思想就不同。

1. 核心思想不同

Vue早期开发就尤雨溪大佬,所以定位就是尽可能的降低前端开发的门槛,让更多的人能够更快地上手开发。这就有了vue的主要特点:灵活易用的渐进式框架,进行数据拦截/代理,它对侦测数据的变化更敏感、更精确。

React 从一开始的定位就是提出 UI 开发的新思路。背靠大公司Facebook 的React,从开始起就不缺关注和用户,而且React想要做的是用更好的方式去颠覆前端开发方式。所以React推崇函数式编程(纯组件),数据不可变以及单向数据流,当然需要双向的地方也可以手动实现, 比如借助onChange和setState来实现。

由于两者核心思想的不同,所以导致Vue和React在后续设计产生了许多的差异。

2. 组件写法差异

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

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

3. diff算法不同

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

传统diff

如上图所示,从左侧a节点依次进行对比:a->da->ea->ba->aa->c, 剩下的其他节点也是与右侧树每个节点进行对比。

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

传统iff算法复杂度太高,vue2.x加入了 Virtual Dom和react拥有 相同的diff优化原则(将算法复杂度降为0(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算法,同样情况下可以减少移动节点次数,减少不必要的性能损耗,更加的优雅。

4. 响应式原理不同

Vue

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

React

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

5. 其他不同点

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

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

当然如果你看过二者的源码,也可以说说二者源码的不同点。这里抛出它们的源码编译过程图,方便你更好的阅读源码。

Vue源码编译过程图:

 React源码编译过程图:

 React源码编译过程图
以上就是关于Vue和React的区别讲解, 当面试官问到这个问题时,重点在于分析思路, 抓住要点去扩展。最后我们还可以谈谈未来发展趋势,其实随着Vue3的更新,和React在使用上相似度越来越高, 其实对于开发者来说挺好的, 上手一个框架后再学另一个,学习成本就会有所降低。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/722071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(6月 30 日论文合集)

文章目录 一、检测相关(8篇)1.1 Detect Any Deepfakes: Segment Anything Meets Face Forgery Detection and Localization1.2 Sustainable Palm Tree Farming: Leveraging IoT and Multi-Modal Data for Early Detection and Mapping of Red Palm Weevil1.3 Evaluation of Env…

【DP+博弈】ABC195 E

E - Lucky 7 Battle (atcoder.jp) 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>//#define int long longusing namespace std;const int mxn2e510; const int mxe1e610; const int mod1e97; const int Inf0x3f3f3f3f;string s,x;int N;…

【设计模式】第十九章:访问者模式详解及应用案例

系列文章 【设计模式】七大设计原则 【设计模式】第一章&#xff1a;单例模式 【设计模式】第二章&#xff1a;工厂模式 【设计模式】第三章&#xff1a;建造者模式 【设计模式】第四章&#xff1a;原型模式 【设计模式】第五章&#xff1a;适配器模式 【设计模式】第六章&…

VI-SLAM系统对比

任何类型的相机对运动物体&#xff0c;视线遮挡&#xff0c;光照剧烈变化等恶劣情况下都不够鲁棒&#xff0c;而惯性测量单元&#xff08;IMU&#xff09;对环境基本没有要求&#xff0c;并且IMU可以提供高频的位姿估计&#xff0c;视觉一般只能提供低频的位姿。依据视觉与IMU的…

前后端实现导出导入功能

目录 导出 1.后端代码 &#xff08;1&#xff09;相关依赖 &#xff08;2&#xff09;自定义实体类 &#xff08;3&#xff09;写一个查询方法list &#xff08;4&#xff09;写导出接口 2.前端代码 3.效果示例 导入 1.后端代码 &#xff08;1&#xff09;写导入接口 …

在SpringBoot中对es集群的基本操作

在创建SpringBoot项目之前要先把上一篇文档搭建的集群打开,然后再创建SpringBoot项目,不会创建的可以访问这里 快速创建SpringBoot项目 提前准备: 1.导入pom依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starte…

23西安电子科技大学光电工程学院851考研录取情况

01、光电工程学院各个方向 02、23光电工程学院一志愿考研录取情况总览、平均分 PS&#xff1a;在23年&#xff0c;西电物理与光电工程学院拆分为两个院&#xff0c;分别是&#xff1a;物理学院和光电工程学院。其中物理学院改考602高等数学872普通物理&#xff0c;光电学院专业…

六、盒子模型

盒子模型 1、元素分类 1、元素分类 行内元素&#xff08;内联元素&#xff09;inline 从左向右&#xff0c;从上到下&#xff0c;依次显示 一个挨着挨一个 以下属性无效&#xff1a;width、height、maring、pading 行内元素内部无法嵌套块级元素 行内元素列表 a strong span …

leetcode 160.链表相交

⭐️ 往期相关文章 &#x1f4ab;链接1&#xff1a;链表分割 &#x1f4ab;链接2&#xff1a;链表中倒数第k个结点(快慢指针问题) &#x1f4ab;链接3&#xff1a;leetcode 876.链表的中间结点(快慢指针问题) &#x1f4ab;链接4&#xff1a;leetcode 206.反转链表 &#x1f4…

Servlet 的常用 API + 综合运用【表白墙】

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启JavaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 前言 一、HttpServlet Servlet 的生…

医学图像分割的全卷积transformer

文章目录 The Fully Convolutional Transformer for Medical Image Segmentation摘要本文方法实验结果 The Fully Convolutional Transformer for Medical Image Segmentation 摘要 我们提出了一种新的Transformer &#xff0c;能够分割不同模式的医学图像。医学图像分析的细…

【机器学习核心总结】什么是EM(最大期望值算法)

什么是EM(最大期望值算法) 在现实生活中&#xff0c;苹果百分百是苹果&#xff0c;梨百分白是梨。 生活中还有很多事物是概率分布&#xff0c;比如有多少人结了婚&#xff0c;又有多少人有工作&#xff0c; 如果我们想要调查人群中吸大麻者的比例呢&#xff1f;敏感问题很难得…

FOF常用的七种投资策略全解析

从当前市场上的投资策略种类来看&#xff0c;大致有七种&#xff0c;包括核心*卫星投资策略、「杠铃」投资策略、反向投资策略、成本平均策略和时间分散化策略、买入并持有策略、美林投资时钟策略、Alpha/Beta投资策略。 投资策略一:美林投资时钟策略 美林投资时钟投资策略相信…

CAN(2)-GD32

CAN(2)-GD32 GD32中CAN的特征 结构框图 CNA总线的工作模式 睡眠工作模式 初始化工作模式 正常工作模式 CAN通信模式 静默通信模式 回环通信模式 回环静默通信模式

hadoop --- MapReduce

MapReduce定义&#xff1a; MapReduce可以分解为Map (映射) Reduce (规约) &#xff0c; 具体过程&#xff1a; Map : 输入数据集被切分成多个小块&#xff0c;并分配给不同的计算节点进行处理Shuffle and Sort&#xff1a;洗牌和排序&#xff0c;在 Map 阶段结束后&#xf…

CCF-CSP真题《202303-4 星际网络II》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202303-4试题名称&#xff1a;星际网络II时间限制&#xff1a;2.0s内存限制&#xff1a;1.0GB问题描述&#xff1a; 问题描述 随着星际网络的进一步建设和规模的增大&#x…

docker-compose部署BCH节点

BCH gitlab BCH github 1、下载BCH二进制文件 rootiZj6c076dm0c5n5b39lzlxZ:/data/docker-compose/bch# wget https://github.com/bitcoin-cash-node/bitcoin-cash-node/releases/download/v26.1.0/bitcoin-cash-node-26.1.0-x86_64-linux-gnu.tar.gz --2023-07-05 16:30:46--…

攻防世界-web-CAT

题目描述&#xff1a;抓住那只猫。界面如下&#xff1a; 1. 思路分析 界面很简单&#xff0c;只有一个输入框&#xff0c;提示我们输入域名&#xff0c;我们随便输入一个baidu.com 发现这个域名赋值给url参数传递到后台。因此&#xff0c;这里能做文章的地方只有这个url参数&a…

GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术

第一章 理论基础 1、Earth Engine平台及应用、主要数据资源介绍 2、Earth Engine遥感云重要概念、数据类型与对象等 3、JavaScript与Python遥感云编程比较与选择 4、Python基础&#xff08;语法、数据类型与程序控制结构、函数及类与对象等&#xff09; 5、常用Python软件…

算法与数据结构-栈

文章目录 什么是栈如何实现一个“栈”&#xff1f;定长顺序栈动长链式栈 栈的应用栈在函数调用中的应用栈在表达式求值中的应用栈在括号匹配中的应用 总结 什么是栈 后进者先出&#xff0c;先进者后出&#xff0c;这就是典型的“栈”结构。 就像一摞叠在一起的盘子。我们平时放…