回覆列表
  • 1 # 小張在浙

    由於react中效能主要耗費在於update階段的diff演算法,因此效能最佳化也主要針對diff演算法。

    一.減少diff演算法觸發次數

    減少diff演算法觸發次數實際上就是減少update流程的次數。

    正常進入update流程有三種方式:

    1.setState

    setState機制在正常執行時,由於批更新策略,已經降低了update過程的觸發次數。

    因此,setState最佳化主要在於非批更新階段中(timeout/Promise回撥),減少setState的觸發次數。

    常見的業務場景即處理介面回撥時,無論資料處理多麼複雜,保證最後只調用一次setState。

    2.父元件render

    父元件的render必然會觸發子元件進入update階段(無論props是否更新)。此時最常用的最佳化方案即為shouldComponentUpdate方法。

    最常見的方式為進行this.props和this.state的淺比較來判斷元件是否需要更新。或者直接使用PureComponent,原理一致。

    需要注意的是,父元件的render函式如果寫的不規範,將會導致上述的策略失效。

    forceUpdate

    其中forceUpdate方法呼叫後將會直接進入componentWillUpdate階段,無法攔截,因此在實際專案中應該棄用。

    其他最佳化策略

    shouldComponentUpdate

    使用shouldComponentUpdate鉤子,根據具體的業務狀態,減少不必要的props變化導致的渲染。如一個不用於渲染的props導致的update。

    另外, 也要儘量避免在shouldComponentUpdate 中做一些比較複雜的操作, 比如超大資料的pick操作等。

    合理設計state,不需要渲染的state,儘量使用例項成員變數。

    不需要渲染的props,合理使用context機制,或公共模組(比如一個單例服務)變數來替換。

    二.正確使用diff演算法

    不使用跨層級移動節點的操作。

    對於條件渲染多個節點時,儘量採用隱藏等方式切換節點,而不是替換節點。

    儘量避免將後面的子節點移動到前面的操作,當節點數量較多時,會產生一定的效能問題。

  • 中秋節和大豐收的關聯?
  • 收音機外接電源能混用嗎?