setState 詳解與 React 性能優化

setState 的同步和異步

1. 爲什麼使用 setState

2.setState 異步更新

3. 如何獲取異步的結果

3.setState 一定是異步的嗎?

  • 其實可以分成兩種情況
  • 在組件生命週期或 React 合成事件中, setState是異步的
  • setTimeou或原生 DOM 事件中, setState是同步的

4. 源碼分析

setState 的合併

1. 數據的合併

2. 多個 state 的合併

React 更新機制

1.React 更新機制

2.React 更新流程

情況一: 對比不同類型的元素

情況二: 對比同一類型的元素

情況三: 對子節點進行遞歸

React 性能優化

1.key 的優化

key的注意事項:

  • key應該是唯一的
  • key不要使用隨機數(隨機數在下一次 render 時,會重新生成一個數字)
  • 使用index作爲key,對性能是沒有優化的

2.render 函數被調用

3.shouldComponentUpdate

React給我們提供了一個生命週期方法 shouldComponentUpdate(很多時候,我們簡稱爲SCU),這個方法接受參數,並且需要有返回值;主要作用是:**控制當前類組件對象是否調用render**方法

// 決定當前類組件對象是否調用render方法
// 參數一: 最新的props
// 參數二: 最新的state
shouldComponentUpdate(nextProps, nextState) {
  // 默認是: return true
  // 不需要在頁面上渲染則不調用render函數
  return false
}

4.PureComponent

5.shallowEqual 方法

這個方法中,調用 !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState),這個 shallowEqual 就是進行淺層比較:

6. 高階組件 memo

import React, { PureComponent, memo } from 'react'

// MemoHeader: 沒有依賴props,不會被重新調用render渲染
const MemoHeader = memo(function Header() {
  console.log('Header被調用')
  return <h2>我是Header組件</h2>
})

React 知識點總結腦圖

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://segmentfault.com/a/1190000039776687