全面理解 React Functional Component 生命週期:從掛載到卸載的運作原理與內部機制
淺談 React Component 的生命週期
何謂元件的生命週期?
首先,我們來聊聊「生命週期」是什麼。簡單來說,生命週期就是一個 React 元件從被放到畫面上,到隨著資料改變而更新,再到最後從畫面上消失的過程,這些階段就是它的「生命週期」。
在技術上,生命週期有三個主要階段:
- Mounting(掛載):元件第一次出現在畫面上的時候。
- Updating(更新):元件的狀態或屬性改變,畫面需要重新渲染的時候。
- Unmounting(卸載):元件從畫面上被移除的時候。
對於大部分的 React 開發者來說,只要知道元件在什麼時間點會進入哪個生命週期階段,以及 hooks 在各個階段會有什麼樣 的行為,就足以應付所有開發任務。不過,我認為要成為更進階的 React 開發者,理解生命週期底層的運作原理也是很重要的。這篇文章會帶大家一起理解 Functional Component 在各個生命週期階段的工作細節。
從 Class Component 到 Function Component
如果你曾經學過 Class Component,應該對它的生命週期方法(如 componentDidMount
、componentDidUpdate
、componentWillUnmount
)不陌生。這些方法讓我們能夠在特定時間點執行某些動作,比如:
- 元件掛載時(Mount):像是向 API 取得初始資料。
- 元件更新時(Update):監聽
props
或state
變化並做出對應反應。 - 元件卸載時(Unmount):清除計時器、取消訂閱、釋放資源。
但是,自從 React v16 推出了 Functional Component 開始,這些生命周期方法不見了,取而代之的是 Hook。如果你也經歷過 Functional Component 尚未完全取代 Class Component 的時期(也就是 React 官方網站同時有 functional component 教學與 class component 教學的時期),你可能跟我一樣,在網路上查詢 「React 元件生命週期」的關鍵字,卻只搜尋得到 Class Component 的生命週期方法,甚至會懷疑 Function Component 如果只是單純的 JavaScript 函式,那它會有生命周期嗎?
由於以前 class component 時代的 React 有很明確的生命週期方法,比如 componentDidMount
(元件掛載時執行)、componentDidUpdate
(元件更新時執行),還有 componentWillUnmount
(元件卸載時執行)。轉換到 Functional Component 後,從表面上看,Function Component 只是個函式,感覺沒有「開始」或「結束」的概念。但實際上,每當 React 需要渲染一個 Function Component,它會按照一定的步驟來執行,而這些步驟構成了 Function Component 的「隱藏生命週期」。後面的章節將會介紹 React 底層是如何透過一些聰明的機制讓簡單的函數也能擁有「出生」、「改變」、「死亡」的過程。
- Class Component 是自己定義生命週期行為
- Functional Component 是把控制權交給 React,讓它用更聰明的方式處理。