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

資訊專(zhuān)欄INFORMATION COLUMN

react如何通過(guò)shouldComponentUpdate來(lái)減少重復(fù)渲染

NikoManiac / 771人閱讀

摘要:在組件未定義的情況下,會(huì)判斷該組件是否是,如果是的話,會(huì)對(duì)新舊進(jìn)行比較,一旦新舊不一致,會(huì)觸發(fā)。而用于渲染復(fù)雜列表的數(shù)據(jù)其實(shí)并沒(méi)有變化,但由于重新觸發(fā),列表還是會(huì)重新渲染。

在react開(kāi)發(fā)中,經(jīng)常會(huì)遇到組件重復(fù)渲染的問(wèn)題,父組件一個(gè)state的變化,就會(huì)導(dǎo)致以該組件的所有子組件都重寫(xiě)render,盡管絕大多數(shù)子組件的props沒(méi)有變化

render什么時(shí)候會(huì)觸發(fā)

首先,先上一張react生命周期圖:

這張圖將react的生命周期分為了三個(gè)階段:生成期、存在期、銷(xiāo)毀期,這樣在create、props、state、unMount狀態(tài)變化時(shí)我們可以清楚的看到reacte觸發(fā)了哪些生命周期鉤子以及什么時(shí)候會(huì)render。

如果我們需要更改root的一個(gè)state,使綠色組件視圖更改

如果你寫(xiě)過(guò)vue,你會(huì)發(fā)現(xiàn)組件更新是如上圖那樣的(視圖指令已編譯為修改視圖的函數(shù)存放在綁定的state里的屬性里,所以能夠做到靶向修改),而react會(huì)以組件為根,重新渲染整個(gè)組件子樹(shù),如下圖(綠色是期望的render路徑,橙色是無(wú)用render):

所以在react里,我們探討的render性能優(yōu)化是react調(diào)用render的路徑如下:

如何避免這些不必要的render: shouldComponentUpdate
shouldComponentUpdate(nextProps, nextState)

使用shouldComponentUpdate()以讓React知道當(dāng)前狀態(tài)或?qū)傩缘母淖兪欠癫挥绊懡M件的輸出,默認(rèn)返回ture,返回false時(shí)不會(huì)重寫(xiě)render,而且該方法并不會(huì)在初始化渲染或當(dāng)使用forceUpdate()時(shí)被調(diào)用,我們要做的只是這樣:

shouldComponentUpdate(nextProps, nextState) {
  return nextState.someData !== this.state.someData
}

但是,state里的數(shù)據(jù)這么多,還有對(duì)象,還有復(fù)雜類(lèi)型數(shù)據(jù),react的理念就是拆分拆分再拆分,這么多子組件,我要每個(gè)組件都去自己一個(gè)一個(gè)對(duì)比嗎??不存在的,這么麻煩,要知道我們的終極目標(biāo)是不勞而獲-_-

React.PureComponent

React.PureComponent 與 React.Component 幾乎完全相同,但 React.PureComponent 通過(guò)props和state的淺對(duì)比來(lái)實(shí)現(xiàn) shouldComponentUpate()。如果對(duì)象包含復(fù)雜的數(shù)據(jù)結(jié)構(gòu),它可能會(huì)因深層的數(shù)據(jù)不一致而產(chǎn)生錯(cuò)誤的否定判斷(表現(xiàn)為對(duì)象深層的數(shù)據(jù)已改變視圖卻沒(méi)有更新)

關(guān)注點(diǎn):

無(wú)論組件是否是 PureComponent,如果定義了 shouldComponentUpdate(),那么會(huì)調(diào)用它并以它的執(zhí)行結(jié)果來(lái)判斷是否 update。在組件未定義 shouldComponentUpdate() 的情況下,會(huì)判斷該組件是否是 PureComponent,如果是的話,會(huì)對(duì)新舊 props、state 進(jìn)行 shallowEqual 比較,一旦新舊不一致,會(huì)觸發(fā) update。

淺判等 只會(huì)比較到兩個(gè)對(duì)象的 ownProperty 是否符合 Object.js() 判等,不會(huì)遞歸地去深層比較---源碼

const hasOwnProperty = Object.prototype.hasOwnProperty;

/**
 * inlined Object.is polyfill to avoid requiring consumers ship their own
 * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
 */
function is(x: mixed, y: mixed): boolean {
  // SameValue algorithm
  if (x === y) { // Steps 1-5, 7-10
    // Steps 6.b-6.e: +0 != -0
    // Added the nonzero y check to make Flow happy, but it is redundant
    return x !== 0 || y !== 0 || 1 / x === 1 / y;
  } else {
    // Step 6.a: NaN == NaN
    return x !== x && y !== y;
  }
}

/**
 * Performs equality by iterating through keys on an object and returning false
 * when any key has values which are not strictly equal between the arguments.
 * Returns true when the values of all keys are strictly equal.
 */
function shallowEqual(objA: mixed, objB: mixed): boolean {
  if (is(objA, objB)) {
    return true;
  }

  if (typeof objA !== "object" || objA === null ||
      typeof objB !== "object" || objB === null) {
    return false;
  }

  const keysA = Object.keys(objA);
  const keysB = Object.keys(objB);

  if (keysA.length !== keysB.length) {
    return false;
  }

  // Test for A"s keys different from B.
  for (let i = 0; i < keysA.length; i++) {
    if (
      !hasOwnProperty.call(objB, keysA[i]) ||
      !is(objA[keysA[i]], objB[keysA[i]])
    ) {
      return false;
    }
  }

  return true;
}

至于復(fù)雜數(shù)據(jù)結(jié)構(gòu),用Object.key()獲取下key,然后key和對(duì)應(yīng)的value都是基礎(chǔ)類(lèi)型數(shù)據(jù),就是算是簡(jiǎn)單數(shù)據(jù)結(jié)構(gòu),不然就是復(fù)雜

針對(duì)以上規(guī)則我們?cè)陧?xiàng)目開(kāi)發(fā)種可以做出如下優(yōu)化:

盡量將復(fù)雜類(lèi)型數(shù)據(jù)(ArrayList)所關(guān)聯(lián)的視圖多帶帶拆成PureComonent有助于提高渲染性能,比如表單、文本域和復(fù)雜列表在同一個(gè) render() 中,表單域的輸入字段改變會(huì)頻繁地觸發(fā) setState() 從而導(dǎo)致 組件 重新 render()。而用于渲染復(fù)雜列表的數(shù)據(jù)其實(shí)并沒(méi)有變化,但由于重新觸發(fā) render(),列表還是會(huì)重新渲染。
react-immutable-render-mixin

我想復(fù)雜數(shù)組沒(méi)變化時(shí)也不要render(), 那你用react-immutable-render-mixin,來(lái),我們看看插件的介紹:

Users are urged to use PureRenderMixin with facebook/immutable-js. If performance is still an issue an examination of your usage of Immutable.js should be your first path towards a solution. This library was created from experimentations with Immutable that were ultimately erroneous; improper usage of Immutable.js

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

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

相關(guān)文章

  • 使用React.memo()來(lái)優(yōu)化函數(shù)組件的性能

    摘要:函數(shù)組件上面我們探討了如何使用和的方法優(yōu)化類(lèi)組件的性能。它的作用和類(lèi)似,是用來(lái)控制函數(shù)組件的重新渲染的。其實(shí)就是函數(shù)組件的。 原文鏈接: Improving Performance in React Functional Component using React.memo 原文作者: Chidume Nnamdi 譯者: 進(jìn)擊的大蔥 推薦理由: 本文講述了開(kāi)發(fā)React應(yīng)用時(shí)如...

    BetaRabbit 評(píng)論0 收藏0
  • 淺談react性能優(yōu)化的方法

    摘要:函數(shù)綁定的方式一般有下面種方式綁定構(gòu)造函數(shù)中綁定然后可以使用時(shí)綁定使用箭頭函數(shù)以上三種方法,第一種最優(yōu)。因?yàn)榈谝环N構(gòu)造函數(shù)只在組件初始化的時(shí)候執(zhí)行一次,第二種組件每次都會(huì)執(zhí)行第三種在每一次時(shí)候都會(huì)生成新的箭頭函數(shù)。 這篇文章主要介紹了淺談react性能優(yōu)化的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧 React性能優(yōu)化思路 軟件的性能優(yōu)化思路就像生...

    HitenDev 評(píng)論0 收藏0
  • 【騰訊Bugly干貨分享】React 移動(dòng) web 極致優(yōu)化

    摘要:數(shù)據(jù)管理及性能優(yōu)化統(tǒng)一管理數(shù)據(jù)這一部份算是重頭戲吧。重復(fù)渲染導(dǎo)致卡頓這套的東西在家校群頁(yè)面上用得很歡樂(lè),以至于不用怎么寫(xiě)都沒(méi)遇到過(guò)什么性能問(wèn)題。但放到移動(dòng)端上,我們?cè)诹斜眄?yè)重構(gòu)的時(shí)候就馬上遇到卡頓的問(wèn)題了。列表頁(yè)目前的處理辦法是將值換成。 本文來(lái)自于騰訊bugly開(kāi)發(fā)者社區(qū),非經(jīng)作者同意,請(qǐng)勿轉(zhuǎn)載,原文地址:http://dev.qq.com/topic/57908... 最近一個(gè)季度...

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

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

0條評(píng)論

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