1. 程式人生 > >關於 Vue 和 React 區別的一些筆記

關於 Vue 和 React 區別的一些筆記

(點選上方公眾號,可快速關注)

作者:lihongxun945

github.com/lihongxun945/myblog/issues/21

這篇文章記錄我在使用Vue和React的時候,對他們的不同之處的一些思考,不僅侷限於他們本身,也會包括比如 Vuex/Redux 等經常搭配使用的工具。因為涉及到的內容很多,可能下面的每一個點都能寫成一篇文章,這次先簡單做一個概要,等我有空做一個詳細的專題出來。

監聽資料變化的實現原理不同

  • Vue 通過 getter/setter 以及一些函式的劫持,能精確知道資料變化,不需要特別的優化就能達到很好的效能

  • React 預設是通過比較引用的方式進行的,如果不優化(PureComponent/shouldComponentUpdate)可能導致大量不必要的VDOM的重新渲染

為什麼 React 不精確監聽資料變化呢?這是因為 Vue 和 React 設計理念上的區別,Vue 使用的是可變資料,而React更強調資料的不可變。所以應該說沒有好壞之分,Vue更加簡單,而React構建大型應用的時候更加魯棒。

因為一般都會用一個數據層的框架比如 Vuex 和 Redux,所以這部分不作過多解釋,在最後的 vuex 和 redux的區別 中也會講到。

資料流的不同

640?wx_fmt=png

大家都知道Vue中預設是支援雙向繫結的。在Vue1.0中我們可以實現兩種雙向繫結:

  1. 父子元件之間,props 可以雙向繫結

  2. 元件與DOM之間可以通過 v-model 雙向繫結

在 Vue2.x 中去掉了第一種,也就是父子元件之間不能雙向綁定了(但是提供了一個語法糖自動幫你通過事件的方式修改),並且 Vue2.x 已經不鼓勵元件對自己的 props 進行任何修改了。
所以現在我們只有 元件 <--> DOM 之間的雙向繫結這一種。

然而 React 從誕生之初就不支援雙向繫結,React一直提倡的是單向資料流,他稱之為 onChange/setState()模式。

不過由於我們一般都會用 Vuex 以及 Redux 等單向資料流的狀態管理框架,因此很多時候我們感受不到這一點的區別了。

HoC 和 mixins

在 Vue 中我們組合不同功能的方式是通過 mixin,而在React中我們通過 HoC (高階元件)。

React 最早也是使用 mixins 的,不過後來他們覺得這種方式對元件侵入太強會導致很多問題,就棄用了 mixinx 轉而使用 HoC,關於mixin究竟哪裡不好,可以參考React官方的這篇文章 Mixins Considered Harmful

而 Vue 一直是使用 mixin 來實現的。

為什麼 Vue 不採用 HoC 的方式來實現呢?

高階元件本質就是高階函式,React 的元件是一個純粹的函式,所以高階函式對React來說非常簡單。

但是Vue就不行了,Vue中元件是一個被包裝的函式,並不簡單的就是我們定義元件的時候傳入的物件或者函式。比如我們定義的模板怎麼被編譯的?比如宣告的props怎麼接收到的?這些都是vue建立元件例項的時候隱式乾的事。由於vue默默幫我們做了這麼多事,所以我們自己如果直接把元件的宣告包裝一下,返回一個高階元件,那麼這個被包裝的元件就無法正常工作了。

推薦一篇很棒的文章講的是vue中如何實現高階元件 探索Vue高階元件

元件通訊的區別

640?wx_fmt=png

其實這部分兩個比較相似。

在Vue 中有三種方式可以實現元件通訊:

  • 父元件通過 props 向子元件傳遞資料或者回調,雖然可以傳遞迴調,但是我們一般只傳資料,而通過 事件的機制來處理子元件向父元件的通訊

  • 子元件通過 事件 向父元件傳送訊息

  • 通過 V2.2.0 中新增的 provide/inject 來實現父元件向子元件注入資料,可以跨越多個層級。

另外有一些比如訪問 $parent/$children等比較dirty的方式這裡就不講了。

在 React 中,也有對應的三種方式:

  • 父元件通過 props 可以向子元件傳遞資料或者回調

  • 可以通過 context 進行跨層級的通訊,這其實和 provide/inject 起到的作用差不多。

可以看到,React 本身並不支援自定義事件,Vue中子元件向父元件傳遞訊息有兩種方式:事件和回撥函式,而且Vue更傾向於使用事件。但是在 React 中我們都是使用回撥函式的,這可能是他們二者最大的區別。

模板渲染方式的不同

在表層上, 模板的語法不同

  • React 是通過JSX渲染模板

  • 而Vue是通過一種拓展的HTML語法進行渲染

但其實這只是表面現象,畢竟React並不必須依賴JSX。


在深層上,模板的原理不同,這才是他們的本質區別:

  • React是在元件JS程式碼中,通過原生JS實現模板中的常見語法,比如插值,條件,迴圈等,都是通過JS語法實現的

  • Vue是在和元件JS程式碼分離的單獨的模板中,通過指令來實現的,比如條件語句就需要 v-if 來實現

對這一點,我個人比較喜歡React的做法,因為他更加純粹更加原生,而Vue的做法顯得有些獨特,會把HTML弄得很亂。舉個例子,說明React的好處:

react中render函式是支援閉包特性的,所以我們import的元件在render中可以直接呼叫。但是在Vue中,由於模板中使用的資料都必須掛在 this 上進行一次中轉,所以我們import 一個元件完了之後,還需要在 components 中再宣告下,這樣顯然是很奇怪但又不得不這樣的做法。

Vuex 和 Redux 的區別

從表面上來說,store 注入和使用方式有一些區別。

在 Vuex 中,$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來比較的(如果看Vuex原始碼會知道,其實他內部直接建立一個Vue例項用來跟蹤資料變化)

而這兩點的區別,其實也是因為 React 和 Vue的設計理念上的區別。React更偏向於構建穩定大型的應用,非常的科班化。相比之下,Vue更偏向於簡單迅速的解決問題,更靈活,不那麼嚴格遵循條條框框。因此也會給人一種大型專案用React,小型專案用 Vue 的感覺。

【關於投稿】

如果大家有原創好文投稿,請直接給公號傳送留言。

① 留言格式:
【投稿】+《 文章標題》+ 文章連結

② 示例:
【投稿】《不要自稱是程式設計師,我十多年的 IT 職場總結》:http://blog.jobbole.com/94148/

③ 最後請附上您的個人簡介哈~

覺得本文對你有幫助?請分享給更多人

關注「前端大全」,提升前端技能

640?wx_fmt=png

640?wx_fmt=jpeg

相關推薦

關於 Vue React 區別一些筆記

(點選上方公眾號,可快速關注)作者:lihongxun945github.com/lihongx

前端-關於 Vue React 區別一些筆記

這才 模板 alt vuex prop info 兩種 dir ops 監聽數據變化的實現原理不同 1、Vue 通過 getter/setter 以及一些函數的劫持,能精確知道數據變化,不需要特別的優化就能達到很好的性能 2、React 默認是通過比較引用的方式進行的

vuemvvm的一些區別

後端 模型 掃描 公司 訪問 vue 出了 vue.js 監聽器 Vue.js 和 MVVM 小細節 MVVM 是Model-View-ViewModel 的縮寫,它是一種基於前端開發的架構模式,其核心是提供對View 和 ViewModel 的雙向數據綁定,這使得

vuereact區別

因為本人用過 java、backbone、underscore、jquery、vue、react 、小程式、week、 react native 等一些相關語言。 所以總有人問我這幾些語言之間的區別。在這裡我先對vue和react的理解說一下,用前端做原生的 week、 react na

Angular、VueReact區別

Angular、Vue和React都是目前比較流行的前端框架,不同的企業對其前端工作者有不同的要求,那麼這三個框架之間有什麼樣的區別呢?   ▍Angular 框架比較成熟完整,過於龐大,上手難; 指令以ng-xxx開頭; 由谷歌開發和維護;

vuereact區別之我見

react和vue都是做元件化的,整體的功能都類似,但是他們的設計思路是有很多不同的。使用react和vue,主要是理解他們的設計思路的不同。 1.資料是不是可變的 react整體是函式式的思想,把元件設計成純元件,狀態和邏輯通過引數傳入,所以在react中,是單向資料流,推崇結合immut

vuereact 相似區別

vue和react的區別 相似之處 他們都是JavaScript的UI框架,專注於創造前端的富應用 不同於早期的JavaScript框架“功能齊全”,Reat與Vue只有框架的骨架,其他的功能

angularvuereact區別

一些歷史 Angular 是基於 TypeScript 的 Javascript 框架。由 Google 進行開發和維護,它被描述為“超級厲害的 JavaScript MVW 框架”。Angular(也被稱為 “Angular 2+”,“Angular 2” 或者 “ng2

vue react中子組件分別如何向父組件傳值

AC ssa 傳值 received message methods std 狀態 route vue子組件和父組件雙向傳值: 子: Vue.component("childComponent",{ template:`<div><p @clic

vuereact在使用上的對比

使用 sha targe hnu bdd src ace 傳送門 mps 傳送門vue和react在使用上的對比

vuereact對比

nat 響應 合成 總結 優化 建議 react one vue模板 區別: 1:vue使用模板語法,和HTML很相似,因此初學者易上手。 2:react使用JSX,它要求開發者借助JSX在JavaScript中創建DOM。 3:vue更快,這是因為,react渲染是將所

前端MVVM模式及其在VueReact中的體現

MVVM相關概念 1) MVVM典型特點是有四個概念:Model、View、ViewModel、繫結器。MVVM可以是單向繫結也可以是雙向繫結甚至是不繫結 2) 繫結器:宣告性的資料和命令,存在於ViewModel之中,讓ViewModel和Model二者進行自動或手動通訊,接下來的“MVVM在Reac

大神評論vue react

知乎上近日有人發起了一個 “react 是不是比 vue 牛皮,為什麼?” 的問題,再度引發一場關於前端框架誰更牛的口水戰,評論裡可以說是撕得不可開交。Vue.js 作者尤雨溪12月4日正面迴應了該問題,他表示希望大家能停止無謂的爭執,多想想使用這些技術的初衷,比起爭論這個,倒不如多想想怎麼

Vue React

元件 vue <template> <div class="hello"> <h1>{{msg}}</h1> <button @click="handleClick">click</button> </d

Ionic 框架宣佈 2019 年將正式支援 Vue React

   Ionic 框架開發團隊近日宣佈,2019年將推出正式支援 Vue (目前處於 alpha 階段)和 React 的 Ionic 版本,以讓開發者在框架選擇上更多樣化。 Ionic 是一個高階的 HTML5 移動端應用框架,也是一個開發混合移動應用的前端框架,

VueReact之間如何選擇

兩者之間的相同之處 同樣是基於元件開發的輕量級框架,同樣是專注於使用者介面的檢視view層 如何選擇 1.1 如果喜歡用模板搭建應用(或者有這個想法)選擇Vue Vue應用預設的是把markup放在HTML中,資料繫結表示式和Angular一樣,採用

學習WeblogicJAVA的一些筆記-Xms Xmx PermSize MaxPermSize的含義

 JVM使用-XX:PermSize設定非堆記憶體初始值,預設是實體記憶體的1/64;由XX:MaxPermSize設定最大非堆記憶體的大小,預設是實體記憶體的1/4。(還有一說:MaxPermSize預設值和-server -client選項相關,  -server選項下預設MaxPermSize為64m

Vue React的比較

cube 合作 pos 產品 也有 browser 使用 社區 dom操作 Vue 和 React比較 Vue 易用 已經會了 HTML、CSS、JavaScript?即刻閱讀指南開始構建應用! 靈活 不斷繁榮的生態系統,可以在一個庫和一套完

對於vuereact“頁面間”傳遞數據的理解誤區

路由 不可 傳遞數據 span cal 如果 通信 vue 標簽 前言 如果我們想要實現多個標簽頁之間的通信,可以使用localStorage、cookie等,但是能不能用vue或react呢? 結論 答案是NO,因為vue和react雖然可以在“多個&r

vue入門 vuereactAngular的關係區別

一、為什麼學習vue.js vue.js兼具angular.js和react的優點,並且剔除了他們的缺點。 二、vue.js是什麼 Vue是一個"MVVM框架(庫)",和angular類似,相比angular小巧,比較容易上手 Vue是一個構建使用者介面點的漸進式框架,與其他