最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年09月12日 09:57:44   作者:黃東璐  
這篇文章主要介紹了Vue和React有哪些區(qū)別,幫助大家更好的理解和學(xué)習(xí)JavaScript框架,感興趣的朋友可以了解下

一、監(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í)候更加魯棒。

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

  • 大家都知道Vue中默認(rèn)是支持雙向綁定的。在Vue1.0中我們可以實(shí)現(xiàn)兩種雙向綁定:
props
v-model
  • 在 Vue2.x 中去掉了第一種, 也就是父子組件之間不能雙向綁定了(但是提供了一個(gè)語(yǔ)法糖自動(dòng)幫你通過(guò)事件的方式修改),并且 Vue2.x 已經(jīng)不鼓勵(lì)組件對(duì)自己的 props 進(jìn)行任何修改了 。
  • 然而 React從誕生之初就不支持雙向綁定,React一直提倡的是單向數(shù)據(jù)流,他稱之為 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)呢?

因?yà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 中有三種方式可以實(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í)。

在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并不必須依賴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)

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ù)變化)

七、diff算法不同

兩者流程思維上是類似的,都是基于兩個(gè)假設(shè)(使得算法復(fù)雜度降為O(n)):

  • 不同的組件產(chǎn)生不同的 DOM 結(jié)構(gòu)。當(dāng)type不相同時(shí),對(duì)應(yīng)DOM操作就是直接銷毀老的DOM,創(chuàng)建新的DOM。
  • 同一層次的一組子節(jié)點(diǎn),可以通過(guò)唯一的 key 區(qū)分。

但兩者源碼實(shí)現(xiàn)上有區(qū)別:

  • Vue基于snabbdom庫(kù),它有較好的速度以及模塊機(jī)制。 Vue Diff使用雙向鏈表,邊對(duì)比,邊更新DOM 。
  • React主要使用 diff隊(duì)列保存需要更新哪些DOM,得到patch樹(shù),再統(tǒng)一操作批量更新DOM。

八、事件機(jī)制不同

Vue

  • Vue原生事件使用 標(biāo)準(zhǔn)Web事件
  • Vue組件 自定義事件機(jī)制,是父子組件通信基礎(chǔ)
  • Vue合理利用了snabbdom庫(kù)的模塊插件

React

  • React原生事件被包裝,所有事件都冒泡到頂層document監(jiān)聽(tīng),然后在這里合成事件下發(fā) ?;谶@套,可以跨端使用事件機(jī)制,而不是和Web DOM強(qiáng)綁定。
  • React組件上無(wú)事件,父子組件通信使用props

以上就是Vue和React有哪些區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于Vue和React的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 初識(shí)簡(jiǎn)單卻不失優(yōu)雅的Vue.js

    初識(shí)簡(jiǎn)單卻不失優(yōu)雅的Vue.js

    這篇文章主要為大家介紹了簡(jiǎn)單卻不失優(yōu)雅、小巧而不乏大匠的Vue.js,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • vue中this.$message的實(shí)現(xiàn)過(guò)程詳解

    vue中this.$message的實(shí)現(xiàn)過(guò)程詳解

    Message在開(kāi)發(fā)中的使用頻率很高,也算是Element-UI組件庫(kù)中比較簡(jiǎn)單的,對(duì)于感興趣的朋友可以一起探討一下Message組件的實(shí)現(xiàn),本文詳細(xì)介紹了vue中this.$message的實(shí)現(xiàn)過(guò)程,感興趣的同學(xué)可以參考一下
    2023-04-04
  • Vue Socket.io源碼解讀

    Vue Socket.io源碼解讀

    這篇文章主要介紹了Vue Socket.io源碼解讀,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • 詳解vue在項(xiàng)目中使用百度地圖

    詳解vue在項(xiàng)目中使用百度地圖

    這篇文章主要介紹了vue在項(xiàng)目中使用百度地圖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Vue中對(duì)象數(shù)組改變其對(duì)象內(nèi)容值數(shù)組沒(méi)變化的原因與解決方案

    Vue中對(duì)象數(shù)組改變其對(duì)象內(nèi)容值數(shù)組沒(méi)變化的原因與解決方案

    最近開(kāi)發(fā)遇到一個(gè)問(wèn)題,修改對(duì)象某一個(gè)索引對(duì)象時(shí),直接將對(duì)象賦值給數(shù)組的某一索引對(duì)象,該數(shù)組沒(méi)變化,在 Vue 中,直接修改對(duì)象數(shù)組中某個(gè)對(duì)象的屬性值時(shí),數(shù)組的引用本身未改變,本文介紹了詳細(xì)的原理分析和解決方案,需要的朋友可以參考下
    2025-03-03
  • Vue實(shí)現(xiàn)側(cè)邊菜單欄手風(fēng)琴效果實(shí)例代碼

    Vue實(shí)現(xiàn)側(cè)邊菜單欄手風(fēng)琴效果實(shí)例代碼

    本文通過(guò)一段簡(jiǎn)單的代碼給大家介紹了基于純vue實(shí)現(xiàn)側(cè)邊菜單欄手風(fēng)琴效果,代碼很簡(jiǎn)單,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-05-05
  • Vue中的高德軌跡回放

    Vue中的高德軌跡回放

    這篇文章主要介紹了Vue中的高德軌跡回放問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 解決vue-cli webpack打包開(kāi)啟Gzip 報(bào)錯(cuò)問(wèn)題

    解決vue-cli webpack打包開(kāi)啟Gzip 報(bào)錯(cuò)問(wèn)題

    這篇文章主要介紹了vue-cli webpack打包開(kāi)啟Gzip 報(bào)錯(cuò)問(wèn)題的解決方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • vue3項(xiàng)目中ESLint配置和使用

    vue3項(xiàng)目中ESLint配置和使用

    在用vite創(chuàng)建vue3項(xiàng)目時(shí)已經(jīng)選擇了添加ESLint,本文就來(lái)介紹一下ESLint在項(xiàng)目中需要怎樣配置和使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • vue基于element的區(qū)間選擇組件

    vue基于element的區(qū)間選擇組件

    這篇文章主要介紹了vue基于element的區(qū)間選擇組件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09

最新評(píng)論

湖北省| 蒙城县| 台南县| 高陵县| 湄潭县| 丹凤县| 赤峰市| 庄河市| 工布江达县| 庆云县| 汉川市| 广丰县| 商水县| 二连浩特市| 高清| 达尔| 思南县| 阿拉善左旗| 外汇| 原阳县| 通河县| 阿拉善左旗| 永康市| 绥化市| 南充市| 黑龙江省| 靖宇县| 新绛县| 福州市| 六枝特区| 进贤县| 探索| 宜丰县| 白玉县| 花莲市| 辽宁省| 垫江县| 慈利县| 金阳县| 称多县| 于田县|