Vue和React的異同點(diǎn)解讀
一、核心設(shè)計(jì)理念的差異
組件形態(tài)的底層實(shí)現(xiàn)
- Vue:組件編譯后是包含 render/setup 方法的對(duì)象(通過 vue-loader 或 @vitejs/plugin-vue 將 SFC 轉(zhuǎn)換為對(duì)象)。
- React:組件本質(zhì)是函數(shù)(函數(shù)組件)或類(類組件),JSX 會(huì)被 Babel 編譯為
React.createElement
調(diào)用。
模板與 JSX 的編譯差異
- Vue:模板(Template)在編譯階段會(huì)被優(yōu)化為可追蹤依賴的渲染函數(shù),通過靜態(tài)分析實(shí)現(xiàn)靶向更新。
- React:JSX 編譯為純 JavaScript 函數(shù)調(diào)用,依賴開發(fā)者手動(dòng)優(yōu)化(如
React.memo
)。
二、響應(yīng)式系統(tǒng)的實(shí)現(xiàn)
維度 | Vue | React |
---|---|---|
數(shù)據(jù)綁定 | 基于 Proxy/Object.defineProperty 的響應(yīng)式系統(tǒng),自動(dòng)追蹤依賴 | 基于狀態(tài)(State)的不可變數(shù)據(jù)流,需手動(dòng)觸發(fā)更新 |
更新粒度 | 組件級(jí) + 屬性級(jí)靶向更新(通過虛擬 DOM 的 Block Tree 優(yōu)化) | 組件級(jí)更新(默認(rèn)全量 Diff,依賴 Fiber 調(diào)度優(yōu)化) |
觸發(fā)方式 | 響應(yīng)式數(shù)據(jù)變更自動(dòng)觸發(fā)渲染 | 需調(diào)用 setState 或 Hooks 函數(shù)觸發(fā)更新 |
三、虛擬 DOM 與 Diff 算法
Vue 的靶向更新
編譯時(shí)標(biāo)記動(dòng)態(tài)節(jié)點(diǎn)(如 {{ count }}
),Diff 時(shí)僅對(duì)比動(dòng)態(tài)部分。
示例:
<!-- 編譯后生成 Block 標(biāo)記 --> <h1>count的值是: {{ count }}</h1>
React 的 Fiber 架構(gòu)
- 將 Diff 過程拆分為可中斷的時(shí)間切片,優(yōu)先處理高優(yōu)先級(jí)任務(wù)(如動(dòng)畫)。
- 全量 Diff 但通過 Fiber 鏈表結(jié)構(gòu)實(shí)現(xiàn)增量更新。
四、函數(shù)式編程的演進(jìn)
框架 | 方案 | 底層實(shí)現(xiàn)差異 |
---|---|---|
Vue | Composition API | 基于響應(yīng)式系統(tǒng)的 setup 函數(shù),依賴閉包管理狀態(tài) |
React | Hooks | 依賴鏈表結(jié)構(gòu)維護(hù)狀態(tài)順序,要求 Hooks 調(diào)用順序穩(wěn)定 |
五、編譯時(shí)優(yōu)化對(duì)比
優(yōu)化策略 | Vue | React |
---|---|---|
靜態(tài)提升 | 將靜態(tài)節(jié)點(diǎn)提取為常量 | 無原生支持 |
樹結(jié)構(gòu)優(yōu)化 | Block Tree 減少 Diff 范圍 | 依賴開發(fā)者手動(dòng)優(yōu)化 |
預(yù)字符串化 | 將靜態(tài) HTML 編譯為字符串常量 | 不支持 |
總結(jié)
相同點(diǎn):虛擬 DOM、組件化、支持函數(shù)式編程。
核心差異:
- Vue 通過編譯時(shí)優(yōu)化 + 響應(yīng)式系統(tǒng)實(shí)現(xiàn)細(xì)粒度更新,React 依賴運(yùn)行時(shí)調(diào)度(Fiber)實(shí)現(xiàn)可控的更新優(yōu)先級(jí)。
- Vue 的漸進(jìn)式設(shè)計(jì)降低上手門檻,React 的函數(shù)式理念提供更高靈活性。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue + typescript + video.js實(shí)現(xiàn) 流媒體播放 視頻監(jiān)控功能
視頻才用流媒體,有后臺(tái)實(shí)時(shí)返回?cái)?shù)據(jù), 要支持flash播放, 所以需安裝對(duì)應(yīng)的flash插件。這篇文章主要介紹了vue + typescript + video.js 流媒體播放 視頻監(jiān)控,需要的朋友可以參考下2019-07-07詳解如何從零開始搭建Express+Vue開發(fā)環(huán)境
這篇文章主要介紹了詳解如何從零開始搭建Express+Vue開發(fā)環(huán)境,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07vue開發(fā)chrome插件,實(shí)現(xiàn)獲取界面數(shù)據(jù)和保存到數(shù)據(jù)庫功能
這篇文章主要介紹了vue開發(fā)chrome插件,實(shí)現(xiàn)獲取界面數(shù)據(jù)和保存到數(shù)據(jù)庫功能的示例,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下2020-12-12vue3實(shí)現(xiàn)點(diǎn)擊空白區(qū)域隱藏div
這篇文章主要介紹了vue3實(shí)現(xiàn)點(diǎn)擊空白區(qū)域隱藏div方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04VUE頁面中通過雙擊實(shí)現(xiàn)復(fù)制表格中內(nèi)容的示例代碼
這篇文章主要介紹了VUE頁面中通過雙擊實(shí)現(xiàn)復(fù)制表格中內(nèi)容,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06vue+canvas實(shí)現(xiàn)移動(dòng)端手寫簽名
這篇文章主要為大家詳細(xì)介紹了vue+canvas實(shí)現(xiàn)移動(dòng)端手寫簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05創(chuàng)建項(xiàng)目及包管理yarn create vite源碼學(xué)習(xí)
這篇文章主要為大家介紹了創(chuàng)建項(xiàng)目及包管理yarn create vite源碼學(xué)習(xí)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09