React Context:管理共用狀態的利器

2025/03/25

這篇文章旨在為新手介紹 React Context,如何簡化跨層級組件資料傳遞的問題。我們將探討如何創建與使用 Context 以及它的好處,幫助你更有效管理應用程式的全域狀態,讓專案更具組織性。

React Context:管理共用狀態的利器

什麼是 React Context?

React Context 是 React 框架提供的一種功能,用於在不使用 prop drilling 的情況下,在元件樹中進行資料傳遞。這對於需要在多個層級中共用資料的應用程式,非常有效。透過 Context,我們可以在應用程式的高層定義狀態,並讓深層次的元件也能夠存取到這些資料。

Context 的基本架構

使用 React Context 的基本過程包含三個步驟:創建 Context、提供 Context、消費 Context。首先,我們使用 React.createContext() 創建一個新的 Context。接著,使用 Context.Provider 將資料提供給子樹中的元件。最後,透過 useContextContext.Consumer 來取得資料。

import React, { createContext, useContext } from 'react'; const MyContext = createContext(); const MyProvider = ({ children }) => { const sharedState = 'Hello World'; return ( <MyContext.Provider value={sharedState}> {children} </MyContext.Provider> ); }; const MyComponent = () => { const value = useContext(MyContext); return <div>{value}</div>; };

使用 Provider 提供資料

Context.Provider 是提供資料的關鍵元件。所有在 Provider 樹下的元件都可以存取這些提供的資料。Provider 接受一個 value 屬性,代表你想要提供的資料。

const App = () => { return ( <MyProvider> <MyComponent /> </MyProvider> ); };

MyComponent 放置在 MyProvider 之下,這樣 MyComponent 就能透過 useContext 存取到 MyProvider 提供的資料。

消費 Context 的兩種方法

在 React 中有兩種主要方法可以消費 Context:使用 useContext Hook 或 Context.Consumer 組件。useContext 更直覺也容易搭配 Hooks,較推薦使用。

使用 useContext:

const MyComponent = () => { const value = useContext(MyContext); return <div>{value}</div>; };

使用 Context.Consumer:

<MyContext.Consumer> {value => <div>{value}</div>} </MyContext.Consumer>

避免不必要的重渲染

在使用 Context 時,若未妥善處理,容易導致不必要的重渲染。這是因為每當 Context.Providervalue 發生變化時,所有消費該 Context 的元件都會重新渲染。若要改善,可使用 memouseMemo 來優化性能。

const memoizedValue = useMemo(() => ({ prop1, prop2 }), [prop1, prop2]); <MyContext.Provider value={memoizedValue}> {children} </MyContext.Provider>

這段程式碼確保只有當 prop1prop2 改變時才會更新 value

Context 的最佳實踐

在使用 Context 時,推薦的最佳實踐包括:盡量避免在大型或過於複雜的應用中廣泛使用 Context,這可能會導致維護困難;分離不同邏輯的 Context,例如,將認證資訊、設定、語言轉換等拆分為不同 Context。這樣可提高應用的模組化程度和可維護性。

與 Redux 比較

React Context 通常被與 Redux 相提並論,因為它們都用於狀態管理。然而,兩者有不同的適用場合。Redux 提供了全面且可預測的方式來管理應用的全域狀態,適合大型應用。相對而言,Context 更簡單,適用於較小或中型應用中需要共享的狀態。

在 Function 元件中使用 Context

在 Function 元件中使用 Context 變得越來越普遍,主要是得益於 useContext Hook 的簡單和靈活。以下是一個簡單的範例,展示如何在 Function 元件中透過 Context 取得共用資料。

const ThemeContext = createContext('light'); const ChildComponent = () => { const theme = useContext(ThemeContext); return <div>Current theme: {theme}</div>; }; const App = () => ( <ThemeContext.Provider value='dark'> <ChildComponent /> </ThemeContext.Provider> );

Context 擴展應用:多 Context 使用

在複雜的應用中,可能需要使用多個 Context 來管理不同類型的狀態。React 支持在一個元件中消費多個 Context。合理組織和使用這些 Context 可以使專案更具組織性。

const AuthContext = createContext(); const ThemeContext = createContext(); const App = () => { return ( <AuthContext.Provider value={authValue}> <ThemeContext.Provider value={themeValue}> <SomeComponent /> </ThemeContext.Provider> </AuthContext.Provider> ); };

合適的使用多個 Context 組成的架構能讓資料流更加清晰。

結語:優雅的狀態管理

React Context 提供了一種優雅的方式來管理跨層級共用狀態,避免了繁瑣的 prop 層層傳遞。對於中等規模的應用,或者需要在多個層級中簡單共享狀態的情況下,使用 Context 是非常不錯的選擇。理解如何使用和擴展 Context,對於提升專案架構和開發效率上,有著顯著的幫助。