摘要:在組件未定義的情況下,會判斷該組件是否是,如果是的話,會對新舊進行比較,一旦新舊不一致,會觸發(fā)。而用于渲染復雜列表的數(shù)據(jù)其實并沒有變化,但由于重新觸發(fā),列表還是會重新渲染。
在react開發(fā)中,經(jīng)常會遇到組件重復渲染的問題,父組件一個state的變化,就會導致以該組件的所有子組件都重寫render,盡管絕大多數(shù)子組件的props沒有變化
render什么時候會觸發(fā)首先,先上一張react生命周期圖:
這張圖將react的生命周期分為了三個階段:生成期、存在期、銷毀期,這樣在create、props、state、unMount狀態(tài)變化時我們可以清楚的看到reacte觸發(fā)了哪些生命周期鉤子以及什么時候會render。
如果我們需要更改root的一個state,使綠色組件視圖更改
如果你寫過vue,你會發(fā)現(xiàn)組件更新是如上圖那樣的(視圖指令已編譯為修改視圖的函數(shù)存放在綁定的state里的屬性里,所以能夠做到靶向修改),而react會以組件為根,重新渲染整個組件子樹,如下圖(綠色是期望的render路徑,橙色是無用render):
所以在react里,我們探討的render性能優(yōu)化是react調(diào)用render的路徑如下:
如何避免這些不必要的render: shouldComponentUpdateshouldComponentUpdate(nextProps, nextState)
使用shouldComponentUpdate()以讓React知道當前狀態(tài)或屬性的改變是否不影響組件的輸出,默認返回ture,返回false時不會重寫render,而且該方法并不會在初始化渲染或當使用forceUpdate()時被調(diào)用,我們要做的只是這樣:
shouldComponentUpdate(nextProps, nextState) { return nextState.someData !== this.state.someData }
但是,state里的數(shù)據(jù)這么多,還有對象,還有復雜類型數(shù)據(jù),react的理念就是拆分拆分再拆分,這么多子組件,我要每個組件都去自己一個一個對比嗎??不存在的,這么麻煩,要知道我們的終極目標是不勞而獲-_-
React.PureComponentReact.PureComponent 與 React.Component 幾乎完全相同,但 React.PureComponent 通過props和state的淺對比來實現(xiàn) shouldComponentUpate()。如果對象包含復雜的數(shù)據(jù)結構,它可能會因深層的數(shù)據(jù)不一致而產(chǎn)生錯誤的否定判斷(表現(xiàn)為對象深層的數(shù)據(jù)已改變視圖卻沒有更新)
關注點:
無論組件是否是 PureComponent,如果定義了 shouldComponentUpdate(),那么會調(diào)用它并以它的執(zhí)行結果來判斷是否 update。在組件未定義 shouldComponentUpdate() 的情況下,會判斷該組件是否是 PureComponent,如果是的話,會對新舊 props、state 進行 shallowEqual 比較,一旦新舊不一致,會觸發(fā) update。
淺判等 只會比較到兩個對象的 ownProperty 是否符合 Object.js() 判等,不會遞歸地去深層比較---源碼
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; }
至于復雜數(shù)據(jù)結構,用Object.key()獲取下key,然后key和對應的value都是基礎類型數(shù)據(jù),就是算是簡單數(shù)據(jù)結構,不然就是復雜
針對以上規(guī)則我們在項目開發(fā)種可以做出如下優(yōu)化:
盡量將復雜類型數(shù)據(jù)(ArrayList)所關聯(lián)的視圖多帶帶拆成PureComonent有助于提高渲染性能,比如表單、文本域和復雜列表在同一個 render() 中,表單域的輸入字段改變會頻繁地觸發(fā) setState() 從而導致 組件 重新 render()。而用于渲染復雜列表的數(shù)據(jù)其實并沒有變化,但由于重新觸發(fā) render(),列表還是會重新渲染。react-immutable-render-mixin
我想復雜數(shù)組沒變化時也不要render(), 那你用react-immutable-render-mixin,來,我們看看插件的介紹:
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
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108551.html
摘要:函數(shù)組件上面我們探討了如何使用和的方法優(yōu)化類組件的性能。它的作用和類似,是用來控制函數(shù)組件的重新渲染的。其實就是函數(shù)組件的。 原文鏈接: Improving Performance in React Functional Component using React.memo 原文作者: Chidume Nnamdi 譯者: 進擊的大蔥 推薦理由: 本文講述了開發(fā)React應用時如...
摘要:函數(shù)綁定的方式一般有下面種方式綁定構造函數(shù)中綁定然后可以使用時綁定使用箭頭函數(shù)以上三種方法,第一種最優(yōu)。因為第一種構造函數(shù)只在組件初始化的時候執(zhí)行一次,第二種組件每次都會執(zhí)行第三種在每一次時候都會生成新的箭頭函數(shù)。 這篇文章主要介紹了淺談react性能優(yōu)化的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧 React性能優(yōu)化思路 軟件的性能優(yōu)化思路就像生...
摘要:數(shù)據(jù)管理及性能優(yōu)化統(tǒng)一管理數(shù)據(jù)這一部份算是重頭戲吧。重復渲染導致卡頓這套的東西在家校群頁面上用得很歡樂,以至于不用怎么寫都沒遇到過什么性能問題。但放到移動端上,我們在列表頁重構的時候就馬上遇到卡頓的問題了。列表頁目前的處理辦法是將值換成。 本文來自于騰訊bugly開發(fā)者社區(qū),非經(jīng)作者同意,請勿轉載,原文地址:http://dev.qq.com/topic/57908... 最近一個季度...
閱讀 3318·2019-08-29 16:17
閱讀 1974·2019-08-29 15:31
閱讀 2645·2019-08-29 14:09
閱讀 2547·2019-08-26 13:52
閱讀 744·2019-08-26 12:21
閱讀 2125·2019-08-26 12:08
閱讀 991·2019-08-23 17:08
閱讀 1922·2019-08-23 16:59