溫馨提示×

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

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

vue和react的區(qū)別是什么

發(fā)布時(shí)間:2022-04-19 16:59:50 來源:億速云 閱讀:134 作者:iii 欄目:移動(dòng)開發(fā)

本文小編為大家詳細(xì)介紹“vue和react的區(qū)別是什么”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“vue和react的區(qū)別是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

具體分析如下:

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

Vue通過 getter/setter以及一些函數(shù)的劫持,能精確知道數(shù)據(jù)變化。

React默認(rèn)是通過比較引用的方式(diff)進(jìn)行的,如果不優(yōu)化可能導(dǎo)致大量不必要的VDOM的重新渲染。為什么React不精確監(jiān)聽數(shù)據(jù)變化呢?這是因?yàn)閂ue和React設(shè)計(jì)理念上的區(qū)別,Vue使用的是可變數(shù)據(jù),而React更強(qiáng)調(diào)數(shù)據(jù)的不可變,兩者沒有好壞之分,Vue更加簡單,而React構(gòu)建大型應(yīng)用的時(shí)候更加魯棒。

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

Vue1.0中可以實(shí)現(xiàn)兩種雙向綁定:父子組件之間,props可以雙向綁定;組件與DOM之間可以通過v-model雙向綁定。Vue2.x中去掉了第一種,也就是父子組件之間不能雙向綁定了(但是提供了一個(gè)語法糖自動(dòng)幫你通過事件的方式修改),并且Vue2.x已經(jīng)不鼓勵(lì)組件對(duì)自己的 props進(jìn)行任何修改了。

React一直不支持雙向綁定,提倡的是單向數(shù)據(jù)流,稱之為onChange/setState()模式。不過由于我們一般都會(huì)用Vuex以及Redux等單向數(shù)據(jù)流的狀態(tài)管理框架,因此很多時(shí)候我們感受不到這一點(diǎn)的區(qū)別了。

3.HoC和mixins

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

React組合不同功能的方式是通過HoC(高階組件)。React最早也是使用mixins的,不過后來他們覺得這種方式對(duì)組件侵入太強(qiáng)會(huì)導(dǎo)致很多問題,就棄用了mixinx轉(zhuǎn)而使用HoC。高階組件本質(zhì)就是高階函數(shù),React的組件是一個(gè)純粹的函數(shù),所以高階函數(shù)對(duì)React來說非常簡單。

4.組件通信的區(qū)別

Vue中有三種方式可以實(shí)現(xiàn)組件通信:父組件通過props向子組件傳遞數(shù)據(jù)或者回調(diào),雖然可以傳遞回調(diào),但是我們一般只傳數(shù)據(jù);子組件通過事件向父組件發(fā)送消息;通過V2.2.0中新增的provide/inject來實(shí)現(xiàn)父組件向子組件注入數(shù)據(jù),可以跨越多個(gè)層級(jí)。

React中也有對(duì)應(yīng)的三種方式:父組件通過props可以向子組件傳遞數(shù)據(jù)或者回調(diào);可以通過 context 進(jìn)行跨層級(jí)的通信,這其實(shí)和 provide/inject 起到的作用差不多。React 本身并不支持自定義事件,而Vue中子組件向父組件傳遞消息有兩種方式:事件和回調(diào)函數(shù),但Vue更傾向于使用事件。在React中我們都是使用回調(diào)函數(shù)的,這可能是他們二者最大的區(qū)別。

5.模板渲染方式的不同

在表層上,模板的語法不同,React是通過JSX渲染模板。而Vue是通過一種拓展的HTML語法進(jìn)行渲染,但其實(shí)這只是表面現(xiàn)象,畢竟React并不必須依賴JSX。

在深層上,模板的原理不同,這才是他們的本質(zhì)區(qū)別:React是在組件JS代碼中,通過原生JS實(shí)現(xiàn)模板中的常見語法,比如插值,條件,循環(huán)等,都是通過JS語法實(shí)現(xiàn)的,更加純粹更加原生。而Vue是在和組件JS代碼分離的單獨(dú)的模板中,通過指令來實(shí)現(xiàn)的,比如條件語句就需要 v-if 來實(shí)現(xiàn)對(duì)這一點(diǎn),這樣的做法顯得有些獨(dú)特,會(huì)把HTML弄得很亂。

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

6.渲染過程不同

Vue可以更快地計(jì)算出Virtual DOM的差異,這是由于它在渲染過程中,會(huì)跟蹤每一個(gè)組件的依賴關(guān)系,不需要重新渲染整個(gè)組件樹。

React在應(yīng)用的狀態(tài)被改變時(shí),全部子組件都會(huì)重新渲染。通過shouldComponentUpdate這個(gè)生命周期方法可以進(jìn)行控制,但Vue將此視為默認(rèn)的優(yōu)化。

如果應(yīng)用中交互復(fù)雜,需要處理大量的UI變化,那么使用Virtual DOM是一個(gè)好主意。如果更新元素并不頻繁,那么Virtual DOM并不一定適用,性能很可能還不如直接操控DOM。

7.框架本質(zhì)不同

Vue本質(zhì)是MVVM框架,由MVC發(fā)展而來;

React是前端組件化框架,由后端組件化發(fā)展而來。

8.Vuex和Redux的區(qū)別

從表面上來說,store注入和使用方式有一些區(qū)別。在Vuex中,$store被直接注入到了組件實(shí)例中,因此可以比較靈活的使用:使用dispatch、commit提交更新,通過mapState或者直接通過this.$store來讀取數(shù)據(jù)。在Redux中,我們每一個(gè)組件都需要顯示的用connect把需要的props和dispatch連接起來。另外,Vuex更加靈活一些,組件中既可以dispatch action,也可以commit updates,而Redux中只能進(jìn)行dispatch,不能直接調(diào)用reducer進(jìn)行修改。

從實(shí)現(xiàn)原理上來說,最大的區(qū)別是兩點(diǎn):Redux使用的是不可變數(shù)據(jù),而Vuex的數(shù)據(jù)是可變的,因此,Redux每次都是用新state替換舊state,而Vuex是直接修改。Redux在檢測(cè)數(shù)據(jù)變化的時(shí)候,是通過diff的方式比較差異的,而Vuex其實(shí)和Vue的原理一樣,是通過getter/setter來比較的,這兩點(diǎn)的區(qū)別,也是因?yàn)镽eact和Vue的設(shè)計(jì)理念不同。React更偏向于構(gòu)建穩(wěn)定大型的應(yīng)用,非常的科班化。相比之下,Vue更偏向于簡單迅速的解決問題,更靈活,不那么嚴(yán)格遵循條條框框。因此也會(huì)給人一種大型項(xiàng)目用React,小型項(xiàng)目用Vue的感覺。

讀到這里,這篇“vue和react的區(qū)別是什么”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

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

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

AI