[誰來跟我 React 一下] 生命週期與 useEffect

constructor 、 render 、 componentDidMount 、 componentDidUpdate 、 componentWillUnmount 、 useEffect

YiChe Liu
6 min readJun 28, 2022

由於 React 的寫法分成 class component 與 functional component ,在處理生命週期的方式上也不太一樣。過去在 Vue 時的一些習慣,導致我剛開始一直看不懂 useEffect 與 componentDidMount 等間的關係。不過 Vue 和 React 的邏輯畢竟還是有所不同,學習時必須轉換一下自己的腦袋比較好。

class component 的生命週期

在 class component 中,使用的概念很容易理解,就是當元件被掛載時,如果我要在這個階段觸發某事,就在對應函式撰寫要發生的。列出幾個比較常見的生命週期名稱與順序:

constructor > render > componentDidMount > render > componentDidUpdate > componentWillUnmount
  • constructor

constructor 其實是一個 ES6 語法糖,用以初始化、建構物件。只有一開始會出現。

  • render

把 JSX 渲染至畫面。

  • componentDidMount

API 串接、綁定 DOM 都在此處理,但若有綁定 DOM ,要記得在 unmounting 移除監聽。只有在第一次 render 後會出現,之後重渲染也不會再經歷此階段。

  • componentDidUpdate

狀態更新或重渲染時就會觸發,但須自行寫判斷式判斷是否需重渲染,可用來 call API 、 setState 。

  • componentWillUnmount

元件移除時觸發、清除綁定等,要注意的是在此執行 setState 不會 re-render 。

useEffect

有 hook 後,在 functional component 能用 useEffect 來實現 componentDidMount 、 componentDidUpdate 和 componentWillUnmount 。

  • componentDidMount

componentDidMount 的定義是第一次 render 後,只會觸發一次。在 useEffect 中,只要在第二個參數中放入空陣列,就只會觸發一次。

useEffect(()=>{
console.log('觸發 componentDidMount')
},[]);
  • componentWillUnmount

元件卸載時的行為,要放在 return 的函式裡。第二個參數一樣放空陣列。

useEffect(()=>{
return()=>{
console.log('觸發 componentWillUnmount')
}
},[]);
  • componentDidUpdate

componentDidUpdate 的定義是不論第一次或重 render ,只要 render 就會觸發。我們可以利用 useEffect 的第二個參數,來達到監聽的效果,監聽對象改變時,就會觸發。

useEffect(()=>{
console.log('count 改變了,觸發 componentDidUpdate')
},[count]);

系列連結

Medium 不太好找前後篇文章,所以在這個系列文章最後,放入任意門連結,希望能幫助到你!

--

--

YiChe Liu
YiChe Liu

Written by YiChe Liu

小菜鳥前端 / 親手打過的筆記才是自己的

No responses yet