內建 React Hooks
Hooks 讓您可以在元件中使用不同的 React 功能。您可以使用內建的 Hooks,或將它們組合起來構建自己的 Hooks。此頁面列出了 React 中所有內建的 Hooks。
狀態 Hooks
狀態讓元件可以“記住”像是使用者輸入的資訊。例如,表單元件可以使用狀態來儲存輸入值,而圖片庫元件可以使用狀態來儲存所選圖片的索引。
要將狀態添加到元件,請使用以下 Hooks 之一
useState宣告一個可以直接更新的狀態變數。useReducer宣告一個狀態變數,其更新邏輯位於reducer 函式內。
function ImageGallery() {
const [index, setIndex] = useState(0);
// ...Context Hooks
Context 讓元件可以從遠程父元件接收資訊,而無需將其作為 props 傳遞。例如,您的應用程式的頂層元件可以將目前的 UI 主題傳遞給下面的所有元件,無論它們有多深。
useContext讀取並訂閱一個 context。
function Button() {
const theme = useContext(ThemeContext);
// ...Ref Hooks
Refs 讓元件可以保存一些不用於渲染的資訊,例如 DOM 節點或 timeout ID。與狀態不同,更新 ref 不會重新渲染您的元件。Refs 是 React 範例中的“逃生出口”。當您需要使用非 React 系統(例如內建的瀏覽器 API)時,它們會很有用。
useRef宣告一個 ref。您可以在其中保存任何值,但最常使用它來保存 DOM 節點。useImperativeHandle允許您自訂元件公開的 ref。這很少使用。
function Form() {
const inputRef = useRef(null);
// ...Effect Hooks
Effects 讓元件可以連接到外部系統並與之同步。這包括處理網路、瀏覽器 DOM、動畫、使用不同 UI 程式庫編寫的 widget 以及其他非 React 程式碼。
useEffect將元件連接到外部系統。
function ChatRoom({ roomId }) {
useEffect(() => {
const connection = createConnection(roomId);
connection.connect();
return () => connection.disconnect();
}, [roomId]);
// ...Effects 是 React 範例中的“逃生出口”。不要使用 Effects 來協調應用程式中的資料流。如果您沒有與外部系統互動,您可能不需要 Effect。
useEffect 有兩個很少使用的變體,它們在時序上有所不同
useLayoutEffect在瀏覽器重新繪製螢幕之前觸發。您可以在這裡測量佈局useInsertionEffect在 React 對 DOM 進行更改之前觸發。程式庫可以在這裡插入動態 CSS。
效能 Hook
最佳化重新渲染效能的常見方法是跳過不必要的工作。例如,您可以告訴 React 重複使用快取的計算結果,或者如果資料自上次渲染以來沒有更改,則跳過重新渲染。
要跳過計算和不必要的重新渲染,請使用以下 Hook 之一
useMemo讓您可以快取耗時計算的結果。useCallback讓您可以在將函式定義傳遞給已最佳化的元件之前將其快取。
function TodoList({ todos, tab, theme }) {
const visibleTodos = useMemo(() => filterTodos(todos, tab), [todos, tab]);
// ...
}有時,您無法跳過重新渲染,因為畫面實際上需要更新。在這種情況下,您可以透過將必須同步的阻塞更新(例如在輸入框中輸入)與不需要阻塞使用者介面的非阻塞更新(例如更新圖表)分開來提高效能。
要設定渲染的優先順序,請使用以下 Hook 之一
useTransition讓您可以將狀態轉換標記為非阻塞,並允許其他更新中斷它。useDeferredValue讓您可以延遲更新 UI 的非關鍵部分,並讓其他部分先更新。
其他 Hook
這些 Hook 主要對函式庫作者有用,在應用程式程式碼中不常使用。
useDebugValue讓您可以自訂 React DevTools 為您的自訂 Hook 顯示的標籤。useId讓元件可以將唯一的 ID 與自身關聯。通常與無障礙 API 一起使用。useSyncExternalStore讓元件可以訂閱外部 store。
useActionState允許您管理 actions 的狀態