React
class component
本篇為 [FE302] React 基礎 - hooks 版本 這門課程的學習筆記。如有錯誤歡迎指正!
在學會如何在 React 中,以 Function component 搭配 Hooks 寫出簡單的 Todo List 之後,再來要探討使用 Function 或 Class 寫 component 的差異,即使目前主流是使用 Function component,未來還是有機會碰到 Class component 的寫法。
在 React 16.8 之前,因為 function component 還沒有 useState、Hooks 的概念,需要描述 component 的狀態時通常會使用 Class component。
但在 React 16.8 有了 Hooks 以後,就能夠在 Function component 引入 Hooks 來表示狀態,這種寫法也成為目前主流。
而 class component 與 function component 兩者之間的差別主要在於:
顧名思義,就是用 class 去實作一個 component,但這種寫法比起 function component,其實需要具備 JavsScript 物件導向的相關知識。
舉例來說,在之前 Todo List 以 function 寫一個 Button component:
換成 class component 的寫法如下,兩者的功能其實相同:
或是改寫之前用 function 寫的 TodoItem:
以 class component 改寫如下,但這樣寫其實會出現錯誤訊息,this 的值會是 undefined:
這是因為 this 的值會根據怎麼呼叫 function 決定,在嚴格模式中直接呼叫 onClick 的話 this 的值就會是 undefined:
有兩種解決方式:
透過 constructor,將 props 初始化,在利用 bind 來綁定 this 指向 constructor 裡面的 this,也就是 TodoItemC 這個 component:
另一種解決方法,就是改用 classmethod 寫法,類似箭頭函式,同樣能綁定 this:
在 Class Component 的 state 同樣要寫在 constructor 裡面,進行 props 初始化,以及設定初始 state:
關於 class component 的生命週期架構可參考附圖:
(圖片來源:React LifeCycle Methods Diagram)
可和之前提過的 React Hook 流程圖進行對照,改成用 useEffect 執行:
(圖片來源:https://github.com/donavon/hook-flow)
這裡重新建立一個 Counter.js 作為範例,首先將 index.js 改成引入 Counter:
建立 Counter.js:
結果如下,藉由點擊事件來改變 component 狀態:
加上 Test component,並設定只有在 count 等於 1 時會出現 Test,以及使用 React 內建 method 來觀察 component 的生命週期:
結果如下:
第一次渲染畫面,只有第一次會有 constructor 和 mount:
點擊第一次,第二次渲染畫面,count 不等於 1,test unmount:
點擊第二次,第三次渲染畫面:
輸入 component 會發現有些 method 被畫刪除線,代表目前版本不建議使用:
舉例來說,在 Counter component 加入這段,若 return false 就不會進行 update;反之 return true 就會:
以下舉個簡單範例:
結果如下,當 counter: 5 之後,再點擊也不會有反應:
這通常會和之前在 React 效能優化提到的 memo 搭配使用,根據比對 props 是否相同或自訂條件。
另一個方法,是把 Component 改寫成 PureComponent,和 memo 的效果類似:
React 會自動進行優化,加上 shouldComponentUpdate 判斷,當 props 裡面的屬性有變動時才會進行 update,沒有的話就不進行 re-render。
–
在實作 React 時,會瞭解到 class component 和 function component 用不同方式去思考如何建立 component,背後的概念其實差蠻多的,需要轉變成另一種想法。
最後再簡單記錄 class component 和 function component 兩者之間的差異:
參考文章: