VueJs与ReactJS和AngularJS的异同点


Posted in Javascript onDecember 12, 2016

React && Vue

React 和 Vue 有许多相似之处,它们都有:

  • 使用 Virtual DOM
  • 提供了响应式(Reactive)和组件化(Composable)的视图组件。
  • 将注意力集中保持在核心库,伴随于此,有配套的路由和负责处理全局状态管理的库。

由于有着众多的相似处,我们会用更多的时间在这一块进行比较。这里我们不只保证技术内容的准确性,同时也兼顾了平衡的考量。我们需要指出 React 比 Vue 更好的地方,像是他们的生态系统和丰富的自定义渲染器。

React && Vue的性能

渲染性能

在渲染用户界面的时候,DOM 的操作成本是最高的,不幸的是没有库可以让这些原始操作变得更快。
我们能做到的最好效果就是(来源google):

Minimize the number of necessary DOM mutations. Both React and Vue use virtual DOM abstractions to accomplish this and both implementations work about equally well.

Add as little overhead (pure JavaScript computations) as possible on top of those DOM manipulations. This is an area where Vue and React differ.

The JavaScript overhead is directly related to the mechanisms of computing the necessary DOM operations. Both Vue and React utilizes Virtual DOM to achieve that, but Vue's Virtual DOM implementation (a fork of snabbdom) is much lighter-weight and thus introduces less overhead than React's.

更新性能

In React, when a component's state changes, it triggers the re-render of the entire component sub-tree, starting at that component as root.

To avoid unnecessary re-renders of child components, you need to implement shouldComponentUpdate everywhere and use immutable data structures. In Vue, a component's dependencies are automatically tracked during its render, so the system knows precisely which components actually need to re-render.

也就是说,未经优化的 Vue 相比未经优化的 React 要快的多。由于 Vue 改进过渲染性能,甚至全面优化过的 React 通常也会慢于开箱即用的 Vue。

JSX vs Templates

在 React 中,所有的组件的渲染功能都依靠 JSX。JSX 是使用 XML 语法编写 Javascript 的一种语法糖。

render () {
  let { items } = this.props
  let children
  if ( items.length > 0 ) {
    children = (
      <ul>
        {items.map( item =>
          <li key={item.id}>{item.name}</li>
        )}
      </ul>
    )
  } else {
    children = <p>No items found.</p>
  }
  return (
    <div className = 'list-container'>
      {children}
    </div>
  )
}

JSX 的渲染功能有下面这些优势:

你可以使用完整的编程语言 JavaScript 功能来构建你的视图页面。
工具对 JSX 的支持相比于现有可用的其他 Vue 模板还是比较先进的(比如,linting、类型检查、编辑器的自动完成)。

在 Vue 中,由于有时需要用这些功能,Vue也提供了渲染功能 并且支持了 JSX。然而,对于大多数组件来说,渲染功能是不推荐使用了。
在这方面,Vue提供的是更简单的模板:

<template>
  <div class="list-container">
    <ul v-if="items.length">
      <li v-for="item in items">
        {{ item.name }}
      </li>
    </ul>
    <p v-else>No items found.</p>
  </div>
</template>

优点如下:

在写模板的过程中,样式风格已定并涉及更少的功能实现。
模板总是会被声明的。
模板中任何 HTML 语法都是有效的。
阅读起来更贴合英语(比如,for each item in items)。
不需要高级版本的 JavaScript 语法,来增加可读性。
这还没有结束。Vue 拥抱 HTML,而不是用 JavaScript 去重塑它。在模板内,Vue 也允许你用预处理器比如 Pug(原名 Jade)

div.list-container
 ul(v-if="items.length")
  li(v-for="item in items") {{ item.name }}
 p(v-else) No items found.

Angular && Vue

Vue 的一些语法和 Angular 的很相似(例如 v-if vs ng-if)。据Vue开发者说因为 Angular 是 Vue 早期开发的灵感来源。然而,Augular 中存在的许多问题,在 Vue 中已经得到解决

复杂性

在 API 与设计两方面上 Vue.js 都比 Angular 1 简单得多,因此你可以快速地掌握它的全部特性并投入开发。

灵活性和模块化

Vue.js 是一个更加灵活开放的解决方案。它允许你以希望的方式组织应用程序,而不是在任何时候都必须遵循 Angular 1 制定的规则,这让 Vue 能适用于各种项目。我们知道把决定权交给你是非常必要的。
这也就是为什么我们提供 Webpack template,让你可以用几分钟,去选择是否启用高级特性,比如热模块加载、linting、CSS 提取等等。

数据绑定

Angular 1 使用双向绑定,Vue 在不同组件间强制使用单向数据流。这使应用中的数据流更加清晰易懂。

指令与组件

在 Vue 中指令和组件分得更清晰。指令只封装 DOM 操作,而组件代表一个自给自足的独立单元 —— 有自己的视图和数据逻辑。在 Angular 中两者有不少相混的地方。

性能

Vue 有更好的性能,并且非常非常容易优化,因为它不使用脏检查。

在 Angular 1 中,当 watcher 越来越多时会变得越来越慢,因为作用域内的每一次变化,所有 watcher 都要重新计算。并且,如果一些 watcher 触发另一个更新,脏检查循环(digest cycle)可能要运行多次。Angular 用户常常要使用深奥的技术,以解决脏检查循环的问题。有时没有简单的办法来优化有大量 watcher 的作用域。

Vue 则根本没有这个问题,因为它使用基于依赖追踪的观察系统并且异步队列更新,所有的数据变化都是独立触发,除非它们之间有明确的依赖关系。

有意思的是,Angular 2 和 Vue 用相似的设计解决了一些 Angular 1 中存在的问题

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript Distilled 基础知识与函数
Apr 07 Javascript
javascript 构造函数强制调用经验总结
Dec 02 Javascript
jquery图片切换实例分析
Apr 15 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
May 13 Javascript
JS 拦截全局ajax请求实例解析
Nov 29 Javascript
jquery实时获取时间的简单实例
Jan 26 Javascript
全选复选框JavaScript编写小结(附代码)
Aug 16 Javascript
AngularJs 延时器、计时器实例代码
Sep 16 Javascript
微信小程序实现tab左右切换效果
Nov 15 Javascript
elementUI 动态生成几行几列的方法示例
Jul 11 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
Jul 26 Javascript
使用Vue3+Vant组件实现App搜索历史记录功能(示例代码)
Jun 09 Vue.js
layer实现弹窗提交信息
Dec 12 #Javascript
详解Javascript数据类型的转换规则
Dec 12 #Javascript
设置jquery UI 控件的大小方法
Dec 12 #Javascript
JS中检测数据类型的几种方式及优缺点小结
Dec 12 #Javascript
JS仿京东移动端手指拨动切换轮播图效果
Apr 10 #Javascript
JavaScript版经典游戏之扫雷游戏完整示例【附demo源码下载】
Dec 12 #Javascript
JavaScript利用正则表达式替换字符串中的内容
Dec 12 #Javascript
You might like
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
用php的ob_start来生成静态页面的方法分析
2011/03/09 PHP
PHP在字符断点处截断文字的实现代码
2011/04/21 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
ThinkPHP安装和设置
2015/07/27 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
php 运算符与表达式详细介绍
2016/11/30 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
网页javascript精华代码集
2007/01/24 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
JavaScript Base64 作为文件上传的实例代码解析
2017/02/14 Javascript
用最少的JS代码写出贪吃蛇游戏
2018/01/12 Javascript
JS实现百度搜索接口及链接功能实例代码
2018/02/02 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
JS实现获取当前所在周的周六、周日示例分析
2019/05/11 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
Python多叉树的构造及取出节点数据(treelib)的方法
2019/08/09 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
Python3实现打印任意宽度的菱形代码
2020/04/12 Python
Python错误的处理方法
2020/06/23 Python
python开根号实例讲解
2020/08/30 Python
Django mysqlclient安装和使用详解
2020/09/17 Python
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
测控技术自荐信
2014/06/05 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
优秀教师先进材料
2014/12/16 职场文书
深入理解margin塌陷和margin合并的解决方案
2021/06/26 HTML / CSS
python使用torch随机初始化参数
2022/03/22 Python