Vue 和 React 的对比

2023-10-27


前言

Vue 由 EvanYou 开发。
React 由 由 Facebook 开发。

React 版本
Vue 版本


一、vue2 与 react 15 的对比

此时 Vue 和 React 还都没支持 Hooks 语法。

1、vue2 与 react 15 的相同点

  • 都支持声明式编程
  • 都使用虚拟 DOM,只更新那些已经修改的对象,从而实现快速渲染。
  • 都是支持响应式组件,专注于组件化开发,将其他功能(如路由和全局状态管理等)交给相关的库来处理。

2、vue2 与 react 15 的不同点

(1)、数据流的不同

Vue 双向数据流:

  • 父子组件之间,props 可以双向绑定;
  • 组件与 DOM 之间可以通过 v-model 双向绑定。

React 单向数据流:

  • 自顶向下,由外及内。
  • 数据在某个节点被改动后,只会影响一个方向上的其他节点。
  • 将父组件的方法以属性的形式传递给子组件,进而操作父组件的属性。

(2)、框架本质不同

Vue 采用 MVVM 框架,由 MVC 发展而来,详情请看 从 MVC 到 MVVM 软件架构

React 既不属于 MVC 也不属于 MVVM 架构。React 是前端组件化框架,由后端组件化发展而来。

(3)、模板不同

模板的语法不同:

  • Vue 采用 SFC(single-file-component)模板系统——组件包括 template、script 和 style 三个模块。将 HTML、CSS 和 JS 分离了。
  • React 采用 JSX 语法

模板的原理不同:

(4)、组件通信方式不同

Vue 中常用的 3 种组件通信的方式(具体请看 Vue 组件之间的通信):

  • 父组件通过 props 向子组件传递数据或者回调,虽然可以传递回调,但是我们一般只传数据。
  • 子组件向父组件发送消息有两种方式:事件和回调函数。但 Vue 更倾向于使用事件。
  • 可以通过 provide/inject 来实现父组件向子组件注入数据,可以跨越多个层级。

React 中常用的 3 种组件通信的方式(具体请看 React 组件的“组件间的通信”小节):

  • 父组件通过 props 可以向子组件传递数据或者回调。
  • 子组件向父组件发送消息,都是使用回调函数的,这可能是他们二者最大的区别。
  • 可以通过 context 进行跨层级的通信,这其实和 provide/inject 起到的作用差不多。

(5)、组合不同功能的方式不同

Vue 组合不同功能的方式是通过 mixin(vue3 弃用了),Vue 中组件是一个被包装的函数,并不简单的就是我们定义组件的时候传入的对象或者函数。比如我们定义的模板怎么被编译的?比如声明的 props 怎么接收到的?这些都是 vue 创建组件实例的时候隐式干的事。由于 vue 默默帮我们做了这么多事,所以我们自己如果直接把组件的声明包装一下,返回一个 HoC,那么这个被包装的组件就无法正常工作了。

React 组合不同功能的方式是通过 HoC(高阶组件)。React 最早也是使用 mixins 的,不过后来他们觉得这种方式对组件侵入太强会导致很多问题,就弃用了 mixinx 转而使用 HoC。高阶组件本质就是高阶函数,React 的组件是一个纯粹的函数,所以高阶函数对 React 来说非常简单。

(6)、state 数据的变更方式不同

Vue 中 state 对象不是必须的。数据由 data 属性在 vue 对象中管理,可以直接通过 this.state.属性名 来修改 state 对象里的数据。

React 中 state 对象是必须的。不能直接修改 state 对象里的数据,只能通过 setState() 方法更新 state 对象里的数据。

(7)、监听数据变化的实现原理不同

Vue:

  • Vue 通过 getter/setter 以及一些函数的劫持,能精确知道数据变化。
  • Vue 可以更快地计算出 Virtual DOM 的差异,这是因为 Vue 是以组件为颗粒度的,会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树。

React:

  • React 默认是通过比较引用的方式(diff)进行的,如果不优化可能导致大量不必要的 VDOM 的重新渲染。
  • React 默认会重新渲染其全部子组件。当然,这也可以通过 shouldComponentUpdate 这个生命周期方法来进行控制,但 Vue 将此视为默认的优化。

为什么 React 不精确监听数据变化呢?这是因为 Vue 和 React 设计理念上的区别:

  • Vue 使用的是可变数据。
  • React 更强调数据的不可变。

Vue 和 React 的 diff 算法都是进行同层次的比较,主要有以下两点不同:

  • Vue 对比节点,如果节点元素类型相同,但是 className 不同,认为是不同类型的元素,会进行删除重建,但是 React 则会认为是同类型的节点,只会修改节点属性。
  • Vue 的列表对比采用的是首尾指针法,而 react 采用的是从左到右依次比对的方式,当一个集合只是把最后一个节点移动到了第一个,React 会把前面的节点依次移动,而 Vue 只会把最后一个节点移动到最后一个,从这点上来说 Vue 的对比方式更加高效。

二、vue3 和 react18 对比

1、vue3 和 react18 的相同点

在 vue2 与 react 15 的相同点 的基础上又增加了以下两点。

  • 都用 hooks 来逻辑复用。
  • 都支持 JSX 语法。

2、vue3 和 react18 的不同点

(1)、 react 使用更加灵活

react18 中使用 JSX 语法更加灵活,而 vue3 虽然也支持了 JSX 语法,但是使用较少。

vue3 的 SFC 是一把双刃剑,一方面它让 vue3 更易上手,让代码更易阅读与维护,另一方面,它需要到固定位置写逻辑,没 react18 的 JSX 语法灵活。

(2)、vue3 更智能的依赖收集

vue3 在模板中的数据可以被模板自动查询,而 react18 需要手动调用 useState 定义数据和修改数据的方法。

vue3 的 watchEffect 和 computed 是可以自动寻找依赖的,而 react18 的 useEffect、useMemo 和 useCallBack 的第二个参数“数组[]”需要写上依赖的数据。

(3)、vue3 和 react 优化手段不同

vue3 是以组件为颗粒度的,可以精准的找到需要更新的地方,组件拆分细一点,就可以达到一定优化效果。

react18 是对比差异来更新的,而且父组件更新,子组件默认也会更新,所以 react18 更新手段一个方法就是浅比较,判断父组件更新的时候,子组件是否要更新,从而跳过子组件更新。




【参考文章】
2022年前端框架趋势:React与Vue深度对比
React与Vue的区别和对比
Vue和React的使用场景和深度有何不同?
vue和react区别
Vue与REACT两个框架的区别和优势对比
Vue与React的区别和优势对比
思考vue3和react18的区别

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue 和 React 的对比 的相关文章

随机推荐

  • cublasSgemm函数

    cublasStatus t cublasSgemm cublasHandle t handle cublasOperation t transa cublasOperation t transb int m int n int k con
  • sklearn.preprocessing OneHotEncoder——仅仅是数值型字段才可以,如果是字符类型字段则不能直接搞定...

    gt gt gt from sklearn preprocessing import OneHotEncoder gt gt gt enc OneHotEncoder gt gt gt enc fit 0 0 3 1 1 0 0 2 1 1
  • set_output_delay与set_input_delay介绍

    关于set output delay与set input delay概念与用法 可以参考https wenku baidu com view 9135e34efe4733687e21aa2e html rec flag default或者如
  • css字体_在css中如何引入ttf文件的字体

    有时我们需要使用ttf文件中的字体 那如何导入呢 1 将文件放入项目文件夹中 2 在css文件中使用font face语法引入指定字体 font face font family ProductSan 字体 src url fonts Ro
  • PN图的画法

    不讲太复杂 两个概念和三条画图规则 必败点 P点 前一个选手 Previous player 将取胜的位置称为必败点 必胜点 N点 下一个选手 Next player 将取胜的位置称为必胜点 实际上就是按照规则画图 有以下三条规则 1 每个
  • Python3,1行代码,批量把图片转换成PDF文档,女神终于同意跟我吃夜宵了。

    批量图片转换成PDF文档 1 引言 2 代码示例 2 1 安装 2 2 单张转换 2 3 批量转换 3 总结 1 引言 小屌丝 鱼哥 求助 求助 小鱼 有啥事 这大惊小怪的 小屌丝 我女神跟我说 如果我把她的照片整成PDF 那么就跟我一起去
  • Python 中无穷的应用

    简介 Python 中的正负无穷为 float inf 和 float inf inf 全称为 infinity 正负无穷的应用 作为比较大小时的初值 需要选出最大值 使用负无穷 反之 使用正无穷 使用 LeetCode 64 题来详细说明
  • 6.184 默认参数与占位参数

    与 python 中的默认参数类似 C 中同样支持默认参数 默认参数是给形式参数加上默认值 如果调用函数时传入了对应的实参 就使用实参的值替换默认值 如果没有传入实参 形参则使用默认值 注意事项 1 如果某个形参数有默认值 那么从这个位置开
  • css3有哪些新特性?(包含哪些模块)

    css3有哪些新特性 包含哪些模块 以下是整理的21个css3新特性 1 新增选择器 p nth child n color rgba 255 0 0 0 75 2 新增伪元素 before 和 after 3 弹性盒模型 display
  • C/C++为什么总喜欢用u16 u8 这样的声明类型啊

    2012 12 05 09 54 RT 为什么要这么定义 它们表示什么意思啊 有识别它们的规律吗 老是不知道它们是什么意思 还有s16呢 这样写非常直观 不用担心平台的不同可移植性好 它的字节数一看就知道 u6是16位2个字节 u8一个字节
  • Docker入门常规操作

    启动Docker环境 systemctl start docker 停止Docker环境 systemctl stop docker 重启Docker环境 systemctl restart docker 查看所有镜像 docker ima
  • Unity Graphics (Unity 图形渲染 ) 官方教程文档笔记系列之十三

    Unity Graphics Unity 图形渲染 Everything for Lighting and Rendering in Unity 主要涉及到光照与渲染方面的知识 本文档主要是对Unity官方教程的个人理解与总结 其实以翻译记
  • Bilibili自动签到脚本

    作者 三十三重天 博客 http www zhouhuibo club 通过学习和分享的过程 将自己工作中的问题和技术总结输出 希望菜鸟和老鸟都能通过自己的文章收获新的知识 并付诸实施 脚本介绍 这是一个利用 Linux Crontab G
  • 踩坑修改el-input样式

    修改el input样式
  • PCL 曲面重建 迫松重建

    一 算法原理 迫松重建法是一种基于隐式函数的三角网格重建算法 该方法通过对点云数据进行最优化的插值处理之后来获取近似的曲面 泊松曲面重建 jennychenhit的博客 CSDN博客 泊松曲面重建 迫松曲面重建的过程 1 定义八叉树 使用八
  • 如何修改Microsoft edge浏览器主页?

    目录 原因 1 主页被劫持 2 只是想改主页 解决办法 1 还原 2 更改 原因 1 主页被劫持 你是否因为打开Microsoft edge浏览器没有显示原本的主页 而是显示其它浏览器的主页 比如360浏览器或者其它的浏览器 而且广告也挺多
  • CSS样式如何使用?

    css是专门用来 美化 标签 基础CSS 写简单页面 看懂 学会改 模块 调整和修改 1 快速了解 img src style height 100px div style color red 中国联通 div 2 CSS应用方式 1 在标
  • GIT GUI(git的可视化工具)

    目录 一 前言 二 Git和GitHub通过密钥绑定 三 把本地文件夹进行git初始化 四 通过Git Gui上传文件至GitHub 一 前言 GIT官方网站为了解决部分用户通过命令行对git工具使用时的怨声载道的现象 因此推出了一个GIT
  • mc显示未发现java_mc命令编译一直报错, 提示找不到JavaInfo.jar

    x 我已经在 issues 里搜索 没有重复的issue 环境信息 arthas boot jar 或者 as sh 的版本 3 1 1 Arthas 版本 3 1 1 操作系统版本 Cent7 5 目标进程的JVM版本 JDK8 执行ar
  • Vue 和 React 的对比

    目录 前言 一 vue2 与 react 15 的对比 1 vue2 与 react 15 的相同点 2 vue2 与 react 15 的不同点 1 数据流的不同 2 框架本质不同 3 模板不同 4 组件通信方式不同 5 组合不同功能的方