Class-based Component Lifecycle
因為在 Class-based 中無法使用任何 React hook,所以勢必有其他方式來取代 hook 所解決的問題,接下來接介紹取代 useEffect() 的方式 - Lifecycle
Lifecycle
在 Class-based 中,取代 useEffect() 的方式就稱為 Lifecycle,其中有 3 組 function 分別表示 3 種 useEffect() 觸發的時機
componentDidMount(): component 生成時觸發,等同於useEffect(..., [])在 dependency array 為空的情況componentDidUpdate: component dependency 發生異動時觸發,等同於useEffect(..., [someValue])dependency array 中的值改變時機componentWillUnmount: 在 component 從 DOM 移除時觸發,等同於useEffect()cleanup functionuseEffect(() => {return () => {...}, [])
Lifecycle Methods in Action
直接透過一個範例來了解 Class-based Lifecycle 可能會更加清楚,一個包含 useEffect() 的範例如下:
1 | const UserFinder = () => { |
useEffect() 以外的改寫在上一章節中都提到過了,所有 State 會由 this.state object 在 constructor 內定義,event 可以直接在 class 內定義,但在 JSX 上呼叫時需透過 bind(this) 使其指向 class 本身
1 | class UserFinder extends Component { |
componentDidUpdate
而 useEffect() 就需要透過 Lifecycle 來改寫了,因為這組 useEffect() 有一個 dependency searchTerm,所以使用的 Lifecycle 是 componentDidUpdate,其中兩個參數如下
- prevProps: Props snapshot
- prevState: State snpashot
如果需要透過 State 作為 dependency,就會需要判斷 State 前後的值是否相等,否則當 State 異動時,就會造成 infinite loop 的情況
1 | componentDidUpdate(prevProps, prevState) { |
componentDidMount
而 componentDidMount() 則是在 component 生成時,只會執行一次,使用情境常會在許多一次性的行為,如http 驗證登入
1 | componentDidMount() { |
componentWillUnmount
則是在 component 被移除時觸發,如上範例因為 DUMMY_USERS 內有三筆資料,透過 map() 在 JSX 中生成 3 組 User component,如果切換移除 User component, componentWillUnmount 這個 Lifecycle 也就會分別執行 3 次
資料參考
React - The Complete Guide (Incl Hooks, React Router, Redux)