React 開發該選 Class 還是 Functional Component?
在 React 元件教學 中,Class Component 與 Functional Component 代表了兩種不同的程式典範。其核心定義在於:Class 元件基於 ES6 類別,具備完整的 React 生命週期比較 方法(如 componentDidMount);而 Functional 元件則是純函數,透過 React Hooks 教學 中的 useState 與 useEffect 實作狀態與副作用。目前的 React 效能優化建議 傾向使用 Functional 寫法,因為它具備更簡潔的程式碼、更快的編譯速度且易於測試。然而,Class 元件在處理極其複雜的物件狀態合併或特定舊有生命週期時仍具優勢。掌握兩者的轉換與選型,是從初學者邁向資深 React 開發者的必經之路。
React 元件教學:Class Component vs Functional Component
在 React 開發中,建立元件主要有 Class Component (類別元件) 與 Functional Component (函式元件) 兩種方式。這篇文章將針對這兩種寫法進行深度對比,從語法差異、元件特性到 React 生命週期比較 進行詳細解析。隨著 React Hooks 教學 的普及,我們將探討為什麼現代開發更傾向於使用 Functional 寫法。
核心優缺點比較:為何 Functional Component 成為主流?
自從 React 16.8 推出 Hooks 後,Functional Component 的能力大幅提升,幾乎能完全取代 Class Component。以下是針對React 效能優化建議與開發體驗的對比表:
| 項目 | Functional | Class-based |
|---|---|---|
| 編譯快 | 勝 (少了繼承 class 轉成 ES5) | |
| 更少程式碼 | 勝 (沒有繼承) | |
| 測試容易 | 勝 (元件週期單純) | |
| this 的影響 | 勝 (閉包會抓住值) | this.props (state) 會改變 |
| 複雜狀態操作 | 勝 (有 batch,可同時設多個狀態,自動合併狀態物件) | |
| 複雜的情境 | 架構上就要切割乾淨 | 勝 (較多元件週期可以操作) |
寫法比較
接著示範同樣的功能但兩種不同的寫法,可以發現:
Class-based多了extends和render()的寫法,白話就是編譯過後的程式碼會比較多行Functional則是使用接近原生的寫法,不需要寫render()編譯後會自動在 return JSX 時叫用 react 提供的函式轉成元件
1 | // Class-based |
Class Component (類別元件) 與 PureComponent
Class Component 適合實作邏輯極其複雜且需要精確控制 React 生命週期 的元件。例如,當您需要手動優化效能時,常會用到 shouldComponentUpdate()。
React 在狀態改變的時候會把 setState 的動作 batch 起來,所以建議使用 callback 的 function 去設定。
1 | this.setState((state, props) => ({ |
另外因為 Class 元件狀態主要為 Object,所以可以輕易做到動態 Key 的設定:
1 | handleInputChange(event) { |
PureComponent 與 React 效能優化建議
PureComponent 是 React 提供的一個基礎類別,它自動實作了 shouldComponentUpdate(),透過淺比較 (Shallow Comparison) 來決定是否重新渲染,是常見的 React 效能優化建議 手法。
PS: 因為只做 shallowly compares,所以狀態盡量不要使用複雜物件。
1 | function shallowEqual(object1, object2) { |
Functional Component 與 React Hooks 教學
在 React Hooks 加入前,Functional Component 主要用於純渲染 (Presentational Component)。但在 React Hooks 教學 普及後,函式元件已成為建構複雜應用的首選。
- useState:管理元件狀態。
- useReducer:處理複雜物件型態的狀態。
- useEffect:處理副作用,取代傳統的 React 生命週期 方法。
- useCallback & useMemo:用於效能優化,避免不必要的重新渲染。
- React.memo:Functional 元件的效能優化工具,效果等同於 Class 中的 PureComponent。
1 | useEffect(() => { |
元件狀態
React 元件有 class 和 function 兩種形式,設定上分兩種:
- class: 物件型態,透過
this.setState()直接設定元件中的狀態 - function: 值或是物件型態,透過
const [state, setState] = useState();回傳的 setState()
由於 class 的狀態一定是物件的型態,對於 Object 型態的狀態會有比較好的處理,舉例來說像物件的合併機制。
1 | // class setState 實際上做的事情 |
相對於 hook 在設定上實際上沒有針對物件做預設的物件合併機制。
1 | // setHookState 其實就是單純設定 |
React 生命週期比較:傳統 Lifecycle vs. useEffect
雖然 Functional Component 沒有傳統意義上的「生命週期方法」,但透過 useEffect Hook,我們可以達到近似甚至更靈活的效果。以下是將傳統週期改寫為 Hooks 的實戰範例:
componentDidMount()
1 | componentDidMount() { |
componentDidUpdate()
值得注意的是 useEffect 的條件中盡量不要使用物件,因為每次都會被看成是不同的。
1 | componentDidUpdate(prevProps) { |
componentWillUnmount()
1 | function clear () { |
將元件週期改寫的實際案例:
1 | async componentDidMount() { |
FAQ:React 元件開發常見問題
Q1:Hooks 出現後,我還需要學習 Class Component 嗎?
A:是的。雖然新專案大多使用 Functional Component,但業界仍有大量維護中的舊專案使用 Class 寫法。此外,某些特定功能(如:Error Boundaries 錯誤邊界)目前仍僅能透過 Class Component 實作。理解兩者的 React 生命週期比較 邏輯,能協助您更順利地進行程式碼遷移與維護。
Q2:Functional Component 的效能真的比 Class Component 好嗎?
A:在大多數場景下,效能差異微乎其微。Functional 元件的優勢主要在於「編譯後的程式碼體積較小」以及「避免了 class 實例化帶來的開銷」。真正的效能瓶頸通常來自不必要的重新渲染,這在兩者中都需要透過 React.memo 或 shouldComponentUpdate 進行 React 效能優化建議 的實踐。
Q3:為什麼 Functional Component 的狀態更新不會自動合併物件?
A:這是設計上的刻意權衡。Class 元件的 this.setState 會自動執行 Object Merge,而 Functional 的 useState 則採取代換邏輯。這鼓勵開發者將狀態拆分為更小的原子單位(Atomic State),而非維護一個巨大的狀態物件。如果需要合併,請使用擴展運算子 setValues(prev => ({ ...prev, newField: 1 }))。


