Vue与React的区别和优势对比


Posted in Vue.js onDecember 18, 2020

简单介绍

React--Facebook创建的JavaScript UI框架。它支撑着包括Instagram在内的大多数Facebook网站。React与当时流行的jQuery,Backbone.js和Angular 1等框架不同,它的诞生改变了JavaScript的世界。其中最大的变化是React推广了Virtual DOM(虚拟DOM)并创造了新的语法——JSX,JSX允许开发者在JavaScript中书写HTML(译者注:即HTML in JavaScript)。

Vue致力解决的问题与React一致,但却提供了另外一套解决方案。Vue使用模板系统(弱化的jsx),使其对现有应用的升级更加容易。这是因为模板用的就是普通的HTML,通过Vue来整合现有的系统是比较容易的,不需要整体重构。同时Vue的学习曲线相对react来说更加容易。

相似之处

React与Vue有很多相似之处,如他们都是JavaScript的UI框架,专注于创造前端的富应用。不同于早期的JavaScript框架“功能齐全”,Reat与Vue只有框架的骨架,其他的功能如路由、状态管理等是框架分离的组件。

  • 两者都是用于创建UI的JavaScript库;
  • 两者都快速轻便;
  • 都有基于组件的架构;
  • 都是用虚拟DOM;
  • 都可放入单个HTML文件中,或者成为更复杂webpack设置中的模块;
  • 都有独立但常用的路由器和状态管理库;

它们之间的最大区别是Vue通常使用HTML模板文件,而React则完全是JavaScript。Vue有双向绑定语法糖。

不同点

1.监听数据变化的实现原理不同

Vue通过 getter/setter以及一些函数的劫持,能精确知道数据变化。

React默认是通过比较引用的方式(diff)进行的,如果不优化可能导致大量不必要的VDOM的重新渲染。为什么React不精确监听数据变化呢?这是因为Vue和React设计理念上的区别,Vue使用的是可变数据,而React更强调数据的不可变,两者没有好坏之分,Vue更加简单,而React构建大型应用的时候更加鲁棒。

2.数据流的不同

Vue与React的区别和优势对比

Vue1.0中可以实现两种双向绑定:父子组件之间,props可以双向绑定;组件与DOM之间可以通过v-model双向绑定。Vue2.x中去掉了第一种,也就是父子组件之间不能双向绑定了(但是提供了一个语法糖自动帮你通过事件的方式修改),并且Vue2.x已经不鼓励组件对自己的 props进行任何修改了。

React一直不支持双向绑定,提倡的是单向数据流,称之为onChange/setState()模式。不过由于我们一般都会用Vuex以及Redux等单向数据流的状态管理框架。

3.HoC和mixins

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

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

4.组件通信的区别

Vue与React的区别和优势对比

Vue中有三种方式可以实现组件通信:父组件通过props向子组件传递数据或者回调,虽然可以传递回调,但是我们一般只传数据;子组件通过事件向父组件发送消息;通过V2.2.0中新增的provide/inject来实现父组件向子组件注入数据,可以跨越多个层级。

React中也有对应的三种方式:父组件通过props可以向子组件传递数据或者回调;可以通过 context 进行跨层级的通信,这其实和 provide/inject 起到的作用差不多。React 本身并不支持自定义事件,而Vue中子组件向父组件传递消息有两种方式:事件和回调函数,但Vue更倾向于使用事件。在React中我们都是使用回调函数的,这可能是他们二者最大的区别。

5.模板渲染方式的不同

在表层上,模板的语法不同,React是通过JSX渲染模板。而Vue是通过一种拓展的HTML语法进行渲染,但其实这只是表面现象,毕竟React并不必须依赖JSX。

在深层上,模板的原理不同,这才是他们的本质区别:React是在组件JS代码中,通过原生JS实现模板中的常见语法,比如插值,条件,循环等,都是通过JS语法实现的,更加纯粹更加原生。而Vue是在和组件JS代码分离的单独的模板中,通过指令来实现的,比如条件语句就需要 v-if 来实现对这一点,这样的做法显得有些独特,会把HTML弄得很乱。

6.渲染过程不同

Vue可以更快地计算出Virtual DOM的差异,这是由于它在渲染过程中,会跟踪每一个组件的依赖关系,不需要重新渲染整个组件树。

React在应用的状态被改变时,全部子组件都会重新渲染。通过shouldComponentUpdate这个生命周期方法可以进行控制,但Vue将此视为默认的优化。

7.框架本质不同

Vue本质是MVVM框架,由MVC发展而来;

React是前端组件化框架,由后端组件化发展而来。

8.Vuex和Redux的区别

从表面上来说,store注入和使用方式有一些区别。在Vuex中,store被直接注入到了组件实例中,因此可以比较灵活的使用:使用dispatch、commit提交更新,通过mapState或者直接通过this.store被直接注入到了组件实例中,因此可以比较灵活的使用:使用dispatch、commit提交更新,通过mapState或者直接通过this.store来读取数据。在Redux中,我们每一个组件都需要显示的用connect把需要的props和dispatch连接起来。另外,Vuex更加灵活一些,组件中既可以dispatch action,也可以commit updates,而Redux中只能进行dispatch,不能直接调用reducer进行修改。

从实现原理上来说,最大的区别是两点:Redux使用的是不可变数据,而Vuex的数据是可变的,因此,Redux每次都是用新state替换旧state,而Vuex是直接修改。Redux在检测数据变化的时候,是通过diff的方式比较差异的,而Vuex其实和Vue的原理一样,是通过getter/setter来比较的,这两点的区别,也是因为React和Vue的设计理念不同。React更偏向于构建稳定大型的应用,非常的科班化。相比之下,Vue更偏向于简单迅速的解决问题,更灵活,不那么严格遵循条条框框。因此也会给人一种大型项目用React,小型项目用Vue的感觉。

总结

Vue的优势包括:

  • 模板和渲染函数的弹性选择
  • 简单的语法及项目创建
  • 更快的渲染速度和更小的体积

React的优势包括:

  • 更适用于大型应用和更好的可测试性
  • 同时适用于Web端和原生App
  • 更大的生态圈带来的更多支持和工具

而实际上,React和Vue都是非常优秀的框架,它们之间的相似之处多过不同之处,并且它们大部分最棒的功能是相通的:

  • 利用虚拟DOM实现快速渲染
  • 轻量级
  • 响应式组件
  • 服务器端渲染
  • 易于集成路由工具,打包工具以及状态管理工具
  • 优秀的支持和社区

以上就是Vue与React的区别和优势对比的详细内容,更多关于Vue与React的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue-calendar-component 封装多日期选择组件的实例代码
Dec 04 Vue.js
vue 在服务器端直接修改请求的接口地址
Dec 19 Vue.js
vue watch监控对象的简单方法示例
Jan 07 Vue.js
如何在vue中使用HTML 5 拖放API
Jan 14 Vue.js
vue基于Teleport实现Modal组件
May 31 Vue.js
Vue过滤器(filter)实现及应用场景详解
Jun 15 Vue.js
Vue3中的Refs和Ref详情
Nov 11 Vue.js
深入讲解Vue中父子组件通信与事件触发
Mar 22 Vue.js
vue 给数组添加新对象并赋值
Apr 20 Vue.js
vue动态绑定style样式
Apr 20 Vue.js
vue实现input输入模糊查询的三种方式
Aug 14 Vue.js
Vue实现指令式动态追加小球动画组件的步骤
Dec 18 #Vue.js
vue+elementUI动态增加表单项并添加验证的代码详解
Dec 17 #Vue.js
vue 数据操作相关总结
Dec 17 #Vue.js
Vue 组件注册全解析
Dec 17 #Vue.js
vue图片裁剪插件vue-cropper使用方法详解
Dec 16 #Vue.js
vue实现图片裁剪后上传
Dec 16 #Vue.js
Vue-router中hash模式与history模式的区别详解
Dec 15 #Vue.js
You might like
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
关于使用runtimeStyle属性问题讨论文章
2007/03/08 Javascript
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
jQuery中 noConflict() 方法使用
2013/04/25 Javascript
setInterval计时器不准的问题解决方法
2014/05/08 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
JS实现支持多选的遍历下拉列表代码
2015/08/20 Javascript
jQuery动态添加可拖动元素完整实例(附demo源码下载)
2016/06/21 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
vue.js或js实现中文A-Z排序的方法
2018/03/08 Javascript
webpack源码之loader机制详解
2018/04/06 Javascript
Node.js事件的正确使用方法
2019/04/05 Javascript
JavaScript设计模式--桥梁模式引入操作实例分析
2020/05/23 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
[03:18]【TI9纪实】社区大触GL与木木
2019/08/25 DOTA
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
对pandas中Series的map函数详解
2018/07/25 Python
python事件驱动event实现详解
2018/11/21 Python
Python 字符串池化的前提
2020/07/03 Python
python如何实现图片压缩
2020/09/11 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
详解CSS3中nth-child与nth-of-type的区别
2017/01/05 HTML / CSS
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
莫斯科制造商的廉价皮大衣:Fursk
2020/06/09 全球购物
面试自我介绍演讲稿
2014/04/29 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
致接力运动员加油稿
2015/07/21 职场文书
安全生产感想
2015/08/07 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
使用Oracle跟踪文件的问题详解
2021/06/28 Oracle
python对文档中元素删除,替换操作
2022/04/02 Python