React lifeCycle 生命週期
什麼是生命週期?就像人有生老病死,component 也有類似這樣的概念,了解生命週期可以讓我們知道如何在「對」的時間做「對」的事。
從官方提供的這張圖表,可以看出 react 生命週期的三大階段
- 創建 component (componentDidMount)
- 更新 component(componentDidUpdate)
- 銷毀 component (componentWillUnmount)
需要注意的是 class component 自帶生命週期,而 functional component 需要透過 react hook 才能擁有生命週期。
生命週期的執行順序
mounting 階段
- constructor :初始化
- static getDerivedStateFromProps
- componentWillMount(即將廢棄
- render :渲染
- componentDidMount: DOM 掛載完成
updating 階段
- componentWillReceiveProps :props 改變時才觸發(即將廢棄
- static getDerivedStateFromProps
- shouldComponentUpdate
- componentWillUpdate(即將廢棄
- render
- getSnapshotBeforeUpdate :component 更新前執行
- componentDidUpdate :component 已經更新完畢
Unmount 銷毀
- componentWillUnmount component 即將銷毀
以下針對較常用的生命週期來做介紹
- constructor :用來初始化的地方,還沒掛載到 DOM 的時候,假設沒有寫 super() ,就調用 this 的話會報錯
- render:必須實作的,回傳 JSX
- componentDidMount: DOM 已經掛載完成 ,在這個階段可以呼叫 api 來更新 DOM ,適合做一些初始化的工作
- componentDidUpdate: 當 props or state 更新 ,就會觸發組件更新 DOM,所以千萬不要在這個階段 setState,會造成無限循環
- componentWillUnmount: component 從 DOM 被移除 ,在這階段可以用來清除一些計時器
接下來介紹一些比較冷門的生命週期
勾選上面的 show less common lifecycle,就可以看到一些不常用的生命週期
- getDerivedStateFromProps(): 當 props、state 改變就會觸發,在初始化的時候也會觸發一次
- shouldComponentUpdate:讓你自己判斷是否要更新,如果回傳 false 這邊就不在往下執行 render, 所以這邊可以做一些效能的優化
- getSnapshotBeforeUpdate :在更新 DOM 和 Refs 之前會觸發
額外補充
componentDidCatch() 錯誤邊界,個人覺得跟 try catch 概念有點像,捕捉子組件的錯誤,不因為錯誤而影響到父組件。
附上 react 開發者製作的生命週期流程圖,跟著流程圖跑一遍會比較容易理解生命週期的執行順序和觸發時機。