vue与react对比

目录

  • 相同点
  • 不同点
    • DOM编写
    • 组件作用域内的CSS
    • 状态管理
    • 优化
    • 代码分离
    • 开发框架
  • npm下载量对比
  • 优缺点对比
  • 大厂使用案例

vue及react都是用来构建用户界面的JS框架. 它们在很多解决关键问题的点上都是相通的, 不同点只在于细节上的一些差别. 本文主要针对不同点来详细作对比说明.

相同点

两者大部分主要功能是相同的, 如下:

  • 虚拟DOM, 快速修改DOM
  • 组件化开发
  • 响应式组件
  • 服务端渲染
  • 应用开发全家桶: 路由 + 状态管理 + 打包等

不同点

1. DOM编写

vue采用模板语法,react采用JSX来编写DOM, 模板语法是在HTML中加入一些赋值markup,而JSX语法是将JS代码与DOM标签混合在一起使用. 对于没有接触过两者的前端开发来说,模板语法更容易理解,上手快,且结构简单,编写容易. 具体区别见下面的例子:

a) VUE模板语法

采用HTML + moustache(双大括号赋值) + 指令的模板语法, 易学,简单,上手非常快.(也支持JSX, 但推荐使用模板语法)

指令: 接收表达式,当表达式变化时,响应式的作用在DOM上.

例子:

<div class="todo-list">
  <h3>待办列表</h3>
  <ul class="todo-ul">
    <li v-for="(item, key, index) in todoList" :key="key" 
      :id="key" @click="clickTask(key)" :class="{success: item.status}">
      {{ index+1 }}. {{ item.content }} 
      <span v-if="item.status">(完成)</span>
      <span class="create-time">{{ item.createTime}}</span>
    </li>
  </ul>
</div>

上面例子中使用到的模板语法解释:

  • v-for: 循环指令, 遍历todoList对象
  • @click: v-on:click的缩写,绑定点击事件
  • :class: v-bind:class的缩写,表示item.status为true时,添加success到li的class
  • {{}}: 大括号赋值语句, 可以接收表达式
  • v-if: 条件判断,当值为true时,该DOM才显示

b) react JSX语法

例子:

<div className="todo-list">
  <h3>待办列表</h3>
  <ul class="todo-ul">
    {Object.keys(todoList).forEach((k, i) => (
      <li key={i} id={k} onClick={() => {this.clickTask(k)}}
        className={todoList[k].status?'success':''}>
        {i}. {todoList[k].content}
        {todoList[k].status && <span>(完成)</span>}
        <span class="create-time">{{ todoList[k].createTime}}</span>
      </li>
    ))}
  </ul>
</div>

jsx语法将JS逻辑与DOM标签混在一起,学习成本会比较高,对比模板语法来说编写也复杂一些.

2. 组件作用域内的CSS

vue组件作用域的CSS, 还是写在style标签中, 用正常的CSS语法即可. 而react是采用css in js的思想, 用JS的思想来写CSS. 具体区别参考下面的例子:

a) vue的组件作用域内的CSS

例子:

<style scoped>
    div {
        color: red;
    }
</style>
// 渲染出来后如下
div[data-v-20de4a82] {
    color: red
}

vue组件作用域的CSS, 只需要在组件内部的style标签中添加scoped属性即可, 渲染出来的css会在组件的对应标签上添加一个"data-"开头的唯一属性, 并作为CSS的选择定位符

b) react的组件作用域内的CSS

例子:

// style对象
const styles = {color: red, fontSize: '14px'}
// JSX
<div style={styles}></div>

react组件作用域的CSS, 用JS来写时, 需要将css中以中橫线连接的属性换成驼峰的形式, 还是比较麻烦的.

3. 状态管理

vue中的state, 对于非对象类型的数据修改可直接采用赋值的方式修改, 复杂的对象类型的属性添加才需要用vue的set方法来操作. react的state必须使用state.set方法进行操作, 具体区别参考下面的例子:

a) vue操作state

例子:

// state结构如下
data: {
    flag: true,
    obj: {
        a: 1
    }
}
// 修改flag的值
this.flag = false
// 修改obj.a的值
this.obj.a = 2
// 向obj中添加一个新的属性b
this.$set(this.obj, b, 'b1')

可以看出vue操作大部分的state都是非常简单的

b) react操作state

例子:

// state结构如下
state = {
    flag: true,
    obj: {
        a: 1
    }
}
// 修改flag
this.setState({flag: false})
// 修改obj.a的值
this.setState({obj: {a: 2}})
// 向obj中添加一个新的属性b
let obj = this.state.obj;
obj.b = 'b1';
this.setState({obj})

react中操作state都需要使用setState方法

4. 优化

react中, 只要state变化, 组件及子组件都会走render方法去看是否需要更新DOM, 当你需要考虑怎么来优化这个点时, 而vue却不存在这样的问题

react的优化方式是当组件的state不常变化时,可以考虑使用pureComponenet. 或者自己在shouldComponentUpdate生命周期的方法中判断该组件的props有没有变化, 当shouldComponentUpdate方法返回false时, 将直接返回跳过后续的生命周期方法. 使用这个方法的前提是, 子组件DOM的变化全部由props决定.

vue框架内部已经对此做了优化, 开发者不需要考虑该类问题, 只需要关注自己的应用本身就可以了.

5. 代码分离

在单页应用中, 代码分离是指除公共资源外, 页面只加载当前页面自己的JS代码, 也就是按需加载.

vue的代码分离很简单, 只需要在路由的component中改用函数返回import()方法导入的异步组件. 而react相对就比较繁琐, 需要借助react-loadable. 具体差别见下面的例子:

a) vue的代码分离

步骤:

1. 安装babel插件: npm install @babel/plugin-syntax-dynamic-import --save-dev
2. 在.babelrc中添加该插件
3. vue-router路由中, component加载改用import()方法:
{ path: '/todo', component: () => import('./module/todo/Index.vue') }

b) react的代码分离

步骤:

1. 安装babel插件: npm install @babel/plugin-syntax-dynamic-import --save-dev
2. 在.babelrc中添加该插件
3. 组件加载需要借用react-loadable插件: npm install react-loadable --save-dev:
{
  path: '/todo',
  component: Loadable({
    loader: () => import('./module/todo/Index.vue'),
    loading: (props) => null
  })
}

6. 开发框架

vue官方提供的vue-cli非常强大, 使用vue-cli 能非常方便的创建一个vue的开发框架, 创建的框架内部对webpack已经做了优化配制. 若你需要改变webpack的配制也非常方便, 只需要在vue.config.js中按要求添加你的配制就可以了. 这种方式非常适合初学者, 不需要去关注webpack繁琐的配制项.

react官方也有提供react-create-cli来创建一个开发框架, 但功能只限于此, 想要根据自己的项目需求来搭建框架你还是得去学习webpack的复杂配制.

npm下载量对比

以下是从npm官网弄下来的最近一年的周下载量, 每一个点是当前日期往后一个星期的下载量. 可以看出两个框架的使用量都在增加, vue现在每周的下载量是一年前的3倍左右, react是一年前的2倍左右. vue使用量增长还是比较快的.


npm下载量

优缺点对比

综合上面不同点的分析, 总结出优缺点如下:

1. vue相比于react优点如下:

vue react
html 模板语法,上手快 JSX语法, 学习成本高
组件作用域内的CSS 直接style标签添加scoped属性, css还是原生的css语法 css in js, js思想来写css, 有转换成本
状态管理 简单属性直接赋值操作 必须调用setState方法来操作state
渲染优化 vue不需要考虑 采用pureComponent, 还有很多限制及坑
代码分离 非常简单, 只需要改用import()方法来加载组件 需要借用第三方插件,书写也很繁琐
开发框架 vue-cli非常方便的搭建可扩展的开发框架 需要去熟悉webpack的各种配制
开发习惯 更接近原生的前端开发模式: HTML CSS JS 一切都是JS, 开发模块的方式更接近后端语言
学习成本 上手快,更接近原生的前端语言 复杂度高, 上手慢, 学习成本高

2. vue相比于react缺点如下:

  • html模板语法不利于调式
  • 生态圈, 使用react的人相对较多, react的社区会更大 对应的开源出来的react组件也会比较多
  • 原生APP的支持,react有比较成熟的react-native.虽然vue也有Weex, 但还不太完善.

大厂使用案例

使用vue的案例:

网站 地址
饿了么 https://h5.ele.me/
简书 https://www.jianshu.com/
手机搜狐网 http://m.sohu.com/
bilibili直播 https://live.bilibili.com

使用react的网站:

网站 地址
facebook www.facebook.com
uber https://www.uber.com/hk/zh-hk/
antd https://ant.design/
知乎 https://www.zhihu.com/signup?next=%2F
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • Vue也已经升级到2.0版本了,到现在为止(2016/11/19)比较流行的MVVM框架有AngularJS(也有...
    彬_仔阅读 27,200评论 12 114
  • React.js 小书学习 之 【使用 JSX 描述 UI 信息】 从 JSX 到页面 过程图解:JSX 到页面过...
    zdlucky阅读 1,264评论 0 20
  • 勇气,优雅说“不”的力量。 从现在回顾到自己能记事时开始,自我和外界对“我”的评价结合起来是“这个人很讲感情,很重...
    Rogerchan2018阅读 169评论 0 0
  • 都知道秋天是成鱼养殖阶段鱼长膘育肥的最佳时候,但是今年受到连续台风的影响,入秋后雨水不断(已经持续一周多了,好像还...
    金山魚阅读 271评论 0 0
  • 1、简历是什么鬼? 写简历是所有职场人无论新老都需要完成的一个步骤,从大学毕业到社会寻找第一份工作要写简历,从一家...
    思雨有约阅读 233评论 0 0