成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

vue和react的差異

OnlyLing / 1482人閱讀

摘要:而中實(shí)現(xiàn)原理是利用高階函數(shù)通過將多個(gè)函數(shù)組合成一個(gè)可執(zhí)行執(zhí)行函數(shù)關(guān)鍵步驟代碼如下所示。和都是基于更新差異元素。

引言

平時(shí)開發(fā)單頁項(xiàng)目應(yīng)用基于vue,目前另外兩個(gè)比較熱的庫還有angular和react,angular 1系列用過,進(jìn)入公司后由于基于vue技術(shù)棧就沒在關(guān)注了。
一直在關(guān)注react,目的不是學(xué)習(xí)用法,只是為了拓展自己的視野和思維,通過了解一些使用上的差異性,來進(jìn)一步的思考其底層設(shè)計(jì)的思想。

環(huán)境搭建

在具體業(yè)務(wù)邏輯開發(fā)前,我們首先要做的是搭建項(xiàng)目骨架,vue的話可以使用vue-cli,通過腳手架產(chǎn)生的配置完全暴露出來,我們可以靈活的修改配置來定制化需求。
我常用幾個(gè)配置如下

    build時(shí)assetsPublicPath會(huì)修改成相對(duì)引入,或者配置成公共前綴,方便測(cè)試
    dev時(shí)proxyTable代理一些接口,聯(lián)調(diào)用,自己測(cè)試話就直接用mock數(shù)據(jù)服務(wù)
    關(guān)閉devtool,去除contenthash,chunkhash,html的minify,添加externals,定制化一些eslint……等等
    其它也有一些不通用改動(dòng),上面是每個(gè)項(xiàng)目都通用的配置

至于react可以使用create-react-app架手架,然后就直接可以使用create-react-app創(chuàng)建項(xiàng)目了,默認(rèn)隱藏配置,定制化配置可以直接npm run eject。需要注意點(diǎn)就是使用?create-react-app創(chuàng)建比較慢,需要做如下設(shè)置

    ?npm config set registry https://registry.npm.taobao.org 

其實(shí)自定義配置直接在配置依賴包里也可以改動(dòng),不過這樣不太好。其次腳手架創(chuàng)建項(xiàng)目最好不要在已有g(shù)it目錄下載創(chuàng)建,不然使用npm run eject會(huì)報(bào)錯(cuò),此時(shí)用空目錄下創(chuàng)建即可。
無論是哪個(gè)腳手架常用的配置,都是基于webpack核心生態(tài)圈構(gòu)建,所以核心重點(diǎn)就是webpack用的熟練的話,無論使用哪個(gè)自定義化配置都不成問題。

使用

vue稍微復(fù)雜些單頁會(huì)基于vue+vuex+vue-router,react棧是react+redux+react-router。
不同點(diǎn)是vue組件是(html+css+js),對(duì)開發(fā)友好,上手容易。react一切都是js,特別的靈活,通過在render中利用純js邏輯控制渲染輸出模板。下面是基于react的一個(gè)示例。

render() {
    let name = this.state.flag ? "true":"false"
    return (
        
    {this.props.items.map(item => (
  • {item.text}
  • ))} {name}
); }

vue的語法糖可以讓我們?cè)诒韱紊陷p松的實(shí)現(xiàn)雙向綁定,而react是純粹的基于UI=render(data)的理念。vue利用es5的set,get機(jī)制收集依賴,能詳細(xì)的定位修改元素,react每次setState對(duì)組件構(gòu)造函數(shù)中私有屬性進(jìn)行修改時(shí),組件都會(huì)更新,除非你在shouldComponentUpdate加入一些邏輯處理。另外vue提供的api多,有很多好用又方便的指令,但是具有兩面性,而react核心概念少,js用的溜,上手挺容易的。

數(shù)據(jù)流

無論是vue還是react都支持組件私有屬性;組件之間prop,組件之間簡(jiǎn)單關(guān)數(shù)據(jù)系修改的話,可以使用事件的方式,vue此時(shí)又提供了個(gè)語法糖sync,吼吼,其它的話沒啥差異。

比較麻煩的一點(diǎn)就是復(fù)雜網(wǎng)狀組件之間數(shù)據(jù)流動(dòng)時(shí)處理,此時(shí)就需要合理組織數(shù)據(jù)了,不然維護(hù),調(diào)試就是一個(gè)大坑,事件方式就不適合了,此時(shí)就要說到vuex和redux了,vuex的getter獲取state中數(shù)據(jù),映射到組件data屬性上,Mutation同步commit修改數(shù)據(jù),Action中dispatch可同步or異步修改數(shù)據(jù),核心是單一狀態(tài)樹,通過設(shè)計(jì)層層方法最后達(dá)到修改數(shù)據(jù)的目的就是為了更好的管理,檢測(cè)數(shù)據(jù)的流動(dòng)。redux因?yàn)槠綍r(shí)用的少,所以此刻我要描述的詳細(xì)些,以做備忘。

import {createStore, applyMiddleware, compose} from "redux"
import thunk from "redux-thunk"
import {Provider} from "react-redux"
const store = createStore(counter,
    compose(
        applyMiddleware(thunk),
        window.devToolsExtension?window.devToolsExtension(): f => f
    )) 
ReactDOM.render(
    
        
    ,
    document.getElementById("root")
);

了解背后原理,可以讓我們更靈活的控制代碼,下面開始詳細(xì)的分析。
執(zhí)行createStore,提供一個(gè)狀態(tài)樹的初始化環(huán)境,返回一個(gè)對(duì)象,其中包含一些閉包函數(shù),引用createStore初始化環(huán)境中中的各種函數(shù)和變量,例如dispatch(派發(fā)action),getState(獲取只讀狀態(tài)樹上的值),subscribe(訂閱數(shù)據(jù)改變)等等,其中

dispatch({ type: ActionTypes.INIT })(源碼:248)

此代碼的目的是創(chuàng)建store的時(shí)候,給reduce一個(gè)默認(rèn)值,初始化currentState值,方便初次getState調(diào)用。

applyMiddleware中間件機(jī)制,可以在處理store前后加一些通用處理,其它例如express,koa,springMVC這些框架中都有這種思想,實(shí)現(xiàn)方式不同,目的都一樣,解耦,可插拔效果,便于維護(hù)。
而rudux中applyMiddleware實(shí)現(xiàn)原理是利用高階函數(shù)compose,通過reduce將多個(gè)函數(shù)組合成一個(gè)可執(zhí)行執(zhí)行函數(shù),關(guān)鍵步驟代碼如下所示。

//applyMiddleware.js
chain = middlewares.map(middleware => middleware(middlewareAPI))
dispatch = compose(...chain)(store.dispatch) 
//compose.js
funcs.reduce((a, b) => (...args) => a(b(...args)))

thunk 至于這個(gè)就是用來方便做異步處理的,是一個(gè)高階函數(shù)中間件,如下所示,一般action返回的都是一個(gè)行為描述對(duì)象,但是這個(gè)在你對(duì)store進(jìn)行處理前加了一層邏輯判斷,以便我們?cè)诮M件上統(tǒng)一的方式寫dispatch相關(guān)的代碼。

 if (typeof action === "function") {
      return action(dispatch, getState, extraArgument);
    }

devToolsExtension //開啟調(diào)試工具,沒有vue方便,不能自動(dòng)檢測(cè)

Provider提供一個(gè)上下文環(huán)境,讓一個(gè)樹上的所有組件都能訪問同一個(gè)對(duì)象。必要前提條件是添加加childContextTypes和getChildContext。

優(yōu)化

為了更好的體驗(yàn),一般我們會(huì)采取一些措施,下面總結(jié)一下針對(duì)vue和react的優(yōu)化措施。
重單頁應(yīng)用,在路由中我們可以異步加載組件,雖然兩者都支持,原理類似,但是vue使用極其方便,如下所示

const My = () => import("../components/My.vue")

有一點(diǎn)需要注意的就是需要配置下assetsPublicPath,這樣打包后的url中是全路徑,否則按照相對(duì)路徑處理容易出問題;相對(duì)而言react還要用模板代碼包裝下組件,這一點(diǎn)不好,不過未來react未來會(huì)開啟異步渲染組件的支持,這一點(diǎn)很贊。

vue和react都是基于dom diff更新差異元素。vue中,我們操作的data數(shù)據(jù)是vue封裝處理過,修改數(shù)據(jù)時(shí),vue會(huì)將數(shù)據(jù)初始化時(shí)收集的相關(guān)依賴元素進(jìn)行更新,而react每次setState更新數(shù)據(jù)針對(duì)的是組件,為了優(yōu)化,組件設(shè)計(jì)的時(shí)候盡量細(xì)粒度,尤其是react當(dāng)中的展示類組件。

因?yàn)閮烧呤褂玫氖轻槍?duì)web頁面情況優(yōu)化過的dom diff算法,以使復(fù)雜度降低為O(n),所以有一些默認(rèn)前提,理解并按照默認(rèn)diff規(guī)則才能使代碼達(dá)到最優(yōu),比如說,保持根節(jié)點(diǎn)一致;一個(gè)dom父節(jié)點(diǎn)下有多個(gè)子節(jié)點(diǎn)并列時(shí),給子節(jié)點(diǎn)添加key,防止對(duì)父節(jié)點(diǎn)使用insertBefore插入子節(jié)點(diǎn)這種情況等等。

總結(jié)

陸陸續(xù)續(xù)的學(xué)習(xí)過程中,將自己的想法自己總結(jié)下來。

說明,文中的總結(jié)基于下面這些版本,
vue ^2.4.2
react 16.0.0-rc.2
redux 3.7.2
react-router 4.2

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/90003.html

相關(guān)文章

  • vue[email protected]之前版本差異

    摘要:記使用方式和之前版本的差異的使用下載和安裝項(xiàng)目生成的目錄結(jié)構(gòu)以上,目前版本的使用下載和安裝項(xiàng)目生成的目錄結(jié)構(gòu)新的目錄結(jié)構(gòu),隱藏了配置文件,封裝了細(xì)節(jié)對(duì)比個(gè)區(qū)別區(qū)別下載包的包命變化。貌似是之前的版本有點(diǎn)問題 記[email protected]使用方式和之前版本的差異 @2.9.3的使用 1.下載vue-cli和安裝項(xiàng)目 cnpm i -g vue-cli#2.9.3 vue init webpa...

    wow_worktile 評(píng)論0 收藏0
  • 珠峰前端架構(gòu)師培養(yǎng)計(jì)劃

    摘要:公司的招聘要求都提到了至少熟悉其中一種前端框架,有前端工程化與模塊化開發(fā)實(shí)踐經(jīng)驗(yàn)相關(guān)字眼。我們主要從端公眾號(hào)移動(dòng)端小程序三大平臺(tái)進(jìn)行前端的技術(shù)選型,并來說說選其技術(shù)的幾大優(yōu)勢(shì)。技術(shù)的優(yōu)勢(shì)互聯(lián)網(wǎng)前端大潮后,前端出現(xiàn)了大框架,分別是與。 1、技術(shù)選型的背景前端技術(shù)發(fā)展日新月異,互聯(lián)網(wǎng)上出現(xiàn)的新型框架也比較多,如何讓新招聘的人員...

    ccj659 評(píng)論0 收藏0
  • Vue面試題精選:VueReact區(qū)別,分別在哪些場(chǎng)景下使用更合適?

    摘要:它們是高度重視且廣泛使用的框架,用于界面設(shè)計(jì)。應(yīng)用程序開發(fā)引起了全球開發(fā)人員的極大關(guān)注,以構(gòu)建令人驚嘆的應(yīng)用程序。但是,具有適應(yīng)性強(qiáng)的體系結(jié)構(gòu),使其成為廣泛使用的框架之一,具有最新的庫和包。專業(yè)和出色的社區(qū)支持,以解決任何問題。 JavaScript是世界上最流行的語言之一,React和Vue是JS最流行的兩個(gè)框架。但哪一款最適合你? JavaScript越來越受歡迎,許多科技巨頭正在...

    mcterry 評(píng)論0 收藏0
  • Vue面試題精選:VueReact區(qū)別,分別在哪些場(chǎng)景下使用更合適?

    摘要:它們是高度重視且廣泛使用的框架,用于界面設(shè)計(jì)。應(yīng)用程序開發(fā)引起了全球開發(fā)人員的極大關(guān)注,以構(gòu)建令人驚嘆的應(yīng)用程序。但是,具有適應(yīng)性強(qiáng)的體系結(jié)構(gòu),使其成為廣泛使用的框架之一,具有最新的庫和包。專業(yè)和出色的社區(qū)支持,以解決任何問題。 JavaScript是世界上最流行的語言之一,React和Vue是JS最流行的兩個(gè)框架。但哪一款最適合你? JavaScript越來越受歡迎,許多科技巨頭正在...

    lijy91 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<