React Hook 提高程式碼複用性

繆宇發表於2019-03-04

程式碼複用一直是程式設計師所追求的,本文主要講解如何利用 React Hook 提高程式碼的複用性。

什麼是 React Hook?

Hook 是 React 新特性,讓你不用寫 class,也可以使用 React 的 state 以及其他功能。目前該特性發布在 v16.7.0-alpha 版本中,所以還不推薦在生產環境中使用。

想用 React 的 state,討厭寫 class,被 this 搞得暈頭轉向?Hook 來幫你。不僅如此,Hook 還可以幫你優雅的複用程式碼。

舉個例子

這個例子是通過 create-react-app 來建立的,由於 Hook 還沒釋出正式版,所以需要手動安裝 react 和 react-dom 的 alpha 版本:

yarn add react@16.7.0-alpha.2 react-dom@16.7.0-alpha.2
複製程式碼

我們來寫一個元件,取名叫 ColoredBanner,它可以通過點選按鈕隨機改變背景顏色:

React Hook 提高程式碼複用性

很明顯,要實現這個元件,需要一個狀態來儲存顏色,以及一個點選事件來改變狀態,實現背景顏色的切換。

在沒有 Hook 之前,我們需要建立一個類,然後通過 this.statethis.setState 實現狀態管理。那麼用 Hook 怎麼實現呢?直接看程式碼:

React Hook 提高程式碼複用性

可以看到在函式中也可以使用 React 的狀態機制。通過呼叫 React 提供的 useState() 方法,傳入引數為初始值,返回一個陣列,包含兩個物件,一個是 color,另一個是 setColor,類似於 this.statethis.setState

還定義了一個方法 changeColor(),隨機選擇一個顏色,然後通過 setColor 更新顏色。

如何複用程式碼呢?

假如我們還需要寫另外一個元件,他的功能和 ColoredBanner 元件幾乎一樣,唯一區別是不需要使用者點選,而是設定一個定時器來自動改變背景。

我們不能直接使用 ColoredBanner 元件,因為裡面有點選事件的邏輯,只需要 ColoredBanner 中隨機更新顏色狀態的功能。

很明顯需要把 ColoredBanner 元件中隨機更新顏色狀態的邏輯抽離出來。

怎麼做呢?

自定義 Hook。類似於 Higher Order Components(高階元件)和 Render Props 的處理方式。

隨機更新顏色狀態的自定義 Hook:

React Hook 提高程式碼複用性

建立一個名為 useRandomColor 的函式,接收兩個引數,colorsinitialColor,在 changColor() 方法中呼叫 setColor 鉤子函式實現顏色的更新。這樣自定義 Hook 就實現了。

ColoredBanner 元件中使用:

React Hook 提高程式碼複用性

呼叫自定義 Hook useRandomColor,傳入顏色陣列和初始化顏色,解構返回 colorchangeColorColoredBanner 元件就可以通過這個自定義 Hook 來隨機改變背景顏色了。

同理,利用這個 Hook 來實現自動更換隨機背景顏色的元件。達到程式碼複用的目的。

自定義 Hook 除了能提高程式碼複用性,還帶來了另一個好處,可以把專案中巢狀很深的 state,拆成一個個小的 Hook,既可以避免更新失效的問題,又方便後期的擴充套件和維護。

感謝閱讀

參考:

Simple Code Reuse with React Hooks

React Hooks in Action: Building a Todo App (hint: no classes)

相關文章