溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Vue和React的區(qū)別有哪些

發(fā)布時(shí)間:2021-07-09 11:02:18 來(lái)源:億速云 閱讀:156 作者:Leah 欄目:web開(kāi)發(fā)

今天就跟大家聊聊有關(guān)Vue和React的區(qū)別有哪些,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

監(jiān)聽(tīng)數(shù)據(jù)變化的實(shí)現(xiàn)原理不同

  • Vue 通過(guò) getter/setter 以及一些函數(shù)的劫持,能精確知道數(shù)據(jù)變化,不需要特別的優(yōu)化就能達(dá)到很好的性能

  • React  默認(rèn)是通過(guò)比較引用的方式進(jìn)行的,如果不優(yōu)化(PureComponent/shouldComponentUpdate)可能導(dǎo)致大量不必要的VDOM的重新渲染

為什么 React 不精確監(jiān)聽(tīng)數(shù)據(jù)變化呢?這是因?yàn)?Vue 和 React 設(shè)計(jì)理念上的區(qū)別,Vue  使用的是可變數(shù)據(jù),而React更強(qiáng)調(diào)數(shù)據(jù)的不可變。所以應(yīng)該說(shuō)沒(méi)有好壞之分,Vue更加簡(jiǎn)單,而React構(gòu)建大型應(yīng)用的時(shí)候更加魯棒。

因?yàn)橐话愣紩?huì)用一個(gè)數(shù)據(jù)層的框架比如 Vuex 和 Redux,所以這部分不作過(guò)多解釋?zhuān)?**的 vuex 和 redux的區(qū)別 中也會(huì)講到。

數(shù)據(jù)流的不同

Vue和React的區(qū)別有哪些

大家都知道Vue中默認(rèn)是支持雙向綁定的。在Vue1.0中我們可以實(shí)現(xiàn)兩種雙向綁定:

  • 父子組件之間,props 可以雙向綁定

  • 組件與DOM之間可以通過(guò) v-model 雙向綁定

在 Vue2.x 中去掉了***種,也就是父子組件之間不能雙向綁定了(但是提供了一個(gè)語(yǔ)法糖自動(dòng)幫你通過(guò)事件的方式修改),并且 Vue2.x  已經(jīng)不鼓勵(lì)組件對(duì)自己的 props 進(jìn)行任何修改了。

所以現(xiàn)在我們只有 組件 <&ndash;> DOM 之間的雙向綁定這一種。

然而 React 從誕生之初就不支持雙向綁定,React一直提倡的是單向數(shù)據(jù)流,他稱(chēng)之為 onChange/setState()模式。

不過(guò)由于我們一般都會(huì)用 Vuex 以及 Redux 等單向數(shù)據(jù)流的狀態(tài)管理框架,因此很多時(shí)候我們感受不到這一點(diǎn)的區(qū)別了。

HoC 和 mixins

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

React 最早也是使用 mixins 的,不過(guò)后來(lái)他們覺(jué)得這種方式對(duì)組件侵入太強(qiáng)會(huì)導(dǎo)致很多問(wèn)題,就棄用了 mixinx 轉(zhuǎn)而使用  HoC,關(guān)于mixin究竟哪里不好,可以參考React官方的這篇文章 Mixins Considered Harmful

而 Vue 一直是使用 mixin 來(lái)實(shí)現(xiàn)的。

為什么 Vue 不采用 HoC 的方式來(lái)實(shí)現(xiàn)呢?

高階組件本質(zhì)就是高階函數(shù),React 的組件是一個(gè)純粹的函數(shù),所以高階函數(shù)對(duì)React來(lái)說(shuō)非常簡(jiǎn)單。

但是Vue就不行了,Vue中組件是一個(gè)被包裝的函數(shù),并不簡(jiǎn)單的就是我們定義組件的時(shí)候傳入的對(duì)象或者函數(shù)。比如我們定義的模板怎么被編譯的?比如聲明的props怎么接收到的?這些都是vue創(chuàng)建組件實(shí)例的時(shí)候隱式干的事。由于vue默默幫我們做了這么多事,所以我們自己如果直接把組件的聲明包裝一下,返回一個(gè)高階組件,那么這個(gè)被包裝的組件就無(wú)法正常工作了。

組件通信的區(qū)別

Vue和React的區(qū)別有哪些

其實(shí)這部分兩個(gè)比較相似。

在Vue 中有三種方式可以實(shí)現(xiàn)組件通信:

  • 父組件通過(guò) props 向子組件傳遞數(shù)據(jù)或者回調(diào),雖然可以傳遞回調(diào),但是我們一般只傳數(shù)據(jù),而通過(guò) 事件的機(jī)制來(lái)處理子組件向父組件的通信

  • 子組件通過(guò) 事件 向父組件發(fā)送消息

  • 通過(guò) V2.2.0 中新增的 provide/inject 來(lái)實(shí)現(xiàn)父組件向子組件注入數(shù)據(jù),可以跨越多個(gè)層級(jí)。

另外有一些比如訪問(wèn) $parent/$children等比較dirty的方式這里就不講了。

在 React 中,也有對(duì)應(yīng)的三種方式:

  • 父組件通過(guò) props 可以向子組件傳遞數(shù)據(jù)或者回調(diào)

  • 可以通過(guò) context 進(jìn)行跨層級(jí)的通信,這其實(shí)和 provide/inject 起到的作用差不多。

可以看到,React 本身并不支持自定義事件,Vue中子組件向父組件傳遞消息有兩種方式:事件和回調(diào)函數(shù),而且Vue更傾向于使用事件。但是在 React  中我們都是使用回調(diào)函數(shù)的,這可能是他們二者***的區(qū)別。

模板渲染方式的不同

在表層上, 模板的語(yǔ)法不同

  • React 是通過(guò)JSX渲染模板

  • 而Vue是通過(guò)一種拓展的HTML語(yǔ)法進(jìn)行渲染

但其實(shí)這只是表面現(xiàn)象,畢竟React并不必須依賴(lài)JSX。

在深層上,模板的原理不同,這才是他們的本質(zhì)區(qū)別:

  • React是在組件JS代碼中,通過(guò)原生JS實(shí)現(xiàn)模板中的常見(jiàn)語(yǔ)法,比如插值,條件,循環(huán)等,都是通過(guò)JS語(yǔ)法實(shí)現(xiàn)的

  • Vue是在和組件JS代碼分離的單獨(dú)的模板中,通過(guò)指令來(lái)實(shí)現(xiàn)的,比如條件語(yǔ)句就需要 v-if 來(lái)實(shí)現(xiàn)

對(duì)這一點(diǎn),我個(gè)人比較喜歡React的做法,因?yàn)樗蛹兇飧釉?,而Vue的做法顯得有些獨(dú)特,會(huì)把HTML弄得很亂。舉個(gè)例子,說(shuō)明React的好處:

react中render函數(shù)是支持閉包特性的,所以我們import的組件在render中可以直接調(diào)用。但是在Vue中,由于模板中使用的數(shù)據(jù)都必須掛在  this 上進(jìn)行一次中轉(zhuǎn),所以我們import 一個(gè)組件完了之后,還需要在 components 中再聲明下,這樣顯然是很奇怪但又不得不這樣的做法。

Vuex 和 Redux 的區(qū)別

從表面上來(lái)說(shuō),store 注入和使用方式有一些區(qū)別。

在 Vuex 中,$store 被直接注入到了組件實(shí)例中,因此可以比較靈活的使用:

  • 使用 dispatch 和 commit 提交更新

  • 通過(guò) mapState 或者直接通過(guò) this.$store 來(lái)讀取數(shù)據(jù)

在 Redux 中,我們每一個(gè)組件都需要顯示的用 connect 把需要的 props 和 dispatch 連接起來(lái)。

另外 Vuex 更加靈活一些,組件中既可以 dispatch action 也可以 commit updates,而 Redux 中只能進(jìn)行  dispatch,并不能直接調(diào)用 reducer 進(jìn)行修改。

從實(shí)現(xiàn)原理上來(lái)說(shuō),***的區(qū)別是兩點(diǎn):

  • Redux 使用的是不可變數(shù)據(jù),而Vuex的數(shù)據(jù)是可變的。Redux每次都是用新的state替換舊的state,而Vuex是直接修改

  • Redux 在檢測(cè)數(shù)據(jù)變化的時(shí)候,是通過(guò) diff 的方式比較差異的,而Vuex其實(shí)和Vue的原理一樣,是通過(guò)  getter/setter來(lái)比較的(如果看Vuex源碼會(huì)知道,其實(shí)他內(nèi)部直接創(chuàng)建一個(gè)Vue實(shí)例用來(lái)跟蹤數(shù)據(jù)變化)

而這兩點(diǎn)的區(qū)別,其實(shí)也是因?yàn)?React 和  Vue的設(shè)計(jì)理念上的區(qū)別。React更偏向于構(gòu)建穩(wěn)定大型的應(yīng)用,非常的科班化。相比之下,Vue更偏向于簡(jiǎn)單迅速的解決問(wèn)題,更靈活,不那么嚴(yán)格遵循條條框框。因此也會(huì)給人一種大型項(xiàng)目用React,小型項(xiàng)目用  Vue 的感覺(jué)。

看完上述內(nèi)容,你們對(duì)Vue和React的區(qū)別有哪些有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI