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

資訊專欄INFORMATION COLUMN

React Redux使用的一些小優(yōu)化

史占廣 / 519人閱讀

摘要:要做多余的檢查同樣,內(nèi)部數(shù)據(jù),如果數(shù)據(jù)相同,盡量使用原數(shù)據(jù)。注所說的選擇使用原來的對象,是確定數(shù)據(jù)沒有發(fā)生改變的時候,使用原對象。多余提一句,在使用的時候,要謹(jǐn)慎使用。當(dāng)組件夠大,夠復(fù)雜,可以考慮使用這個方法來減少的消耗。

之前畫了一張redux的流程圖,可以看看右下角的部分,可以看出來怎么進行優(yōu)化。

在reducer里面,盡量減少數(shù)據(jù)的變動 不要做多余、無意義的事

也就是能不改變就不改變。比如不要做下面這種無謂的事情:

function reducer(state, action){
  // ....一大堆邏輯代碼
  return {
   ...state
  }
}

這個代碼雖然在selector中,也可以通過areStatePropsEqual來判斷計算后的state是否發(fā)生了改變。

但是如果直接return state;就可以直接被areStatesEqual攔截,避免多余的計算和對比。

要做多余的檢查

同樣,state內(nèi)部數(shù)據(jù),如果數(shù)據(jù)相同,盡量使用原數(shù)據(jù)。只針對復(fù)雜數(shù)據(jù)類型(Object, Array)。
比如:

function reducer(state, action) {
  let mayNotChange = state.mayNotChange; // mayNotChange為Array或Object
  let newState = {...mayNotChange};
  // ...一大堆邏輯
  return {
    ...state,
    mayNotChange: changed ? newState : mayNotChange // 沒有發(fā)生改變的話,就用原來的對象
  }
}

很多時候,一般習(xí)慣于通過計算,然后直接把生成的newState賦值給mayNotChange。

由于眾所周知的{} !== {}的情況,如果能通過簡單判斷來決定是否可以選擇使用原來的對象,那么就可以通過areStatePropsEqual來進行判斷,同樣可以避免不必要的計算,更可以避免不必要的渲染。

注: 所說的選擇使用原來的對象,是確定數(shù)據(jù)沒有發(fā)生改變的時候,使用原對象。并不是說當(dāng)發(fā)生改變的時候,也在原來的對象上面修改最好。在不考慮自定義areStatesEqual和areStatePropsEqual的情況下,如果只在原對象上面進行修改,可能會造成對比的時候,前后兩種結(jié)果相同,可能造成無法重新渲染的情況

優(yōu)化equal的四個方法

connectoption中,有四個對比的方法

areStatesEqual(默認為===),用來判斷redux store返回的state是否和之前的相同

areOwnPropsEqual(默認為shallowEqual),用來判斷父組件傳入的props是否和之前的相同

areStatePropsEqual(默認為shallowEqual),用來判斷mapStateToProps的結(jié)果是否和之前的相同

areMergedPropsEqual(默認為shallowEqual),用來判斷最后merge合并的最終結(jié)果是否和之前的相同

可以通過自己的需求對著四個方法進行優(yōu)化。

比如一個reduxstate是這個樣子:

  state = {
    pageA: {...},
    pageB: {...},
    number: 2
  }

而在pageA里面只需要pageAnumber,那么就可以通過areStatesEqual來進行對比:

function areStatesEqual(prev, current){
  return prev.number === current.number && isEqual(prev.pageA, current.pageA);
}

或者針對復(fù)雜結(jié)構(gòu)數(shù)據(jù)的情況,進行特殊處理,比如深度對比

function areStatePropsEqual(prev, current){
  return deepEqual(prev, current);
}

這些優(yōu)化都可以減少不必要的計算和重渲染。

shouldComponentUpdate

多余提一句,在使用shouldComponentUpdate的時候,要謹(jǐn)慎使用。這個方法就是利用shouldComponentUpdate的消耗來換取render的消耗。

當(dāng)某些小的、調(diào)用的次數(shù)少的component,就沒有必要添加shouldComponentUpdate檢查。

當(dāng)組件夠大,夠復(fù)雜,可以考慮使用這個方法來減少re-render的消耗。當(dāng)然,還是需要考慮用這個方法的消耗和diff&render的消耗比起來哪個更劃算。

先想到這么多,等想到了其他的再添加上來。

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

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

相關(guān)文章

  • React-Redux性能優(yōu)化

    摘要:但是和一起使用還需要一個工具,這一篇就說一下在使用上的一些性能優(yōu)化建議。如果的改變會引起值變化,那么會調(diào)用轉(zhuǎn)換函數(shù),傳入作為參數(shù),并返回結(jié)果。如果的值和前一次的一樣,它將會直接返回前一次計算的數(shù)據(jù),而不會再調(diào)用一次轉(zhuǎn)換函數(shù)。 前面寫了兩篇文章《React組件性能優(yōu)化》《Redux性能優(yōu)化》,分別針對React和Redux在使用上的性能優(yōu)化給了一些建議。但是React和Redux一起使用...

    JouyPub 評論0 收藏0
  • 高級前端面試題大匯總(只有試題,沒有答案)

    摘要:面試題來源于網(wǎng)絡(luò),看一下高級前端的面試題,可以知道自己和高級前端的差距。 面試題來源于網(wǎng)絡(luò),看一下高級前端的面試題,可以知道自己和高級前端的差距。有些面試題會重復(fù)。 使用過的koa2中間件 koa-body原理 介紹自己寫過的中間件 有沒有涉及到Cluster 介紹pm2 master掛了的話pm2怎么處理 如何和MySQL進行通信 React聲明周期及自己的理解 如何...

    kviccn 評論0 收藏0
  • 2018大廠高級前端面試題匯總

    摘要:面試的公司分別是阿里網(wǎng)易滴滴今日頭條有贊挖財滬江餓了么攜程喜馬拉雅兌吧微醫(yī)寺庫寶寶樹??低暷⒐浇挚峒覙钒俜贮c和海風(fēng)教育。 (關(guān)注福利,關(guān)注本公眾號回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實戰(zhàn)、面試指導(dǎo)) 本人于7-8月開始準(zhǔn)備面試,過五關(guān)斬六將,最終抱得網(wǎng)易歸,深深感受到高級前端面試的套路。以下是自己整理的面試題匯總,不敢藏私,統(tǒng)統(tǒng)貢獻出來。 面試的公司分...

    zzir 評論0 收藏0

發(fā)表評論

0條評論

史占廣

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<