React useContext()深入淺出教學與最佳實務

更新於 發佈於 閱讀時間約 9 分鐘

在 React 中,useContext() 是一個 Hook,用來讓你在函式元件中輕鬆地存取 context 資料,避免繁瑣的 props 傳遞。以下是一步步的教學與示例程式碼:

什麼是 Context?

Context 可以讓你在元件樹中傳遞資料,而不需要每層都用 props 傳遞。這對於全域設定(如主題、語言、認證狀態)特別有用。

建立一個 Context

首先,你需要 建立一個 Context 物件:

import React, {createContext} from 'react';

// 建立一個 Context,預設值可以是任何你想要的資料或空值
const MyContext = createContext({ user: null });
export default MyContext;

提供 Context 值

使用 Context Provider 將資料傳遞到元件樹中。所有被 Provider 包裹的子元件,都可以透過這個 Context 存取資料:

import React, { useState } from 'react';
import MyContext from './MyContext';
import Header from './Header';

function TestComponent() {
const [user, setUser] = useState({ name: 'Alice' });

return (
<MyContext.Provider value={{ user, setUser }}>
<Header />
</MyContext.Provider>
);
}
export default TestComponent;

在子元件中使用 useContext()

在子元件中,你可以使用 useContext() 來存取剛剛提供的 Context 資料,無需透過 props 傳遞:

import React, { useContext } from 'react';
import MyContext from './MyContext';

function Header() {
// 直接存取 context 中的資料
const { user } = useContext(MyContext);

return (
<header>
<h1>歡迎, {user.name}!</h1>
</header>
);
}

export default Header;

效果:

raw-image

使用場景與注意事項

  • 適用場景: 當多個元件需要共用某些資料時(例如使用者資料、語言設定、主題樣式)。
  • 注意事項:
    • 每次 context 的值改變時,所有使用該 context 的元件都會重新渲染,因此要避免不必要的大範圍更新。
    • 僅在真正需要跨多層元件傳遞資料時使用 context,否則簡單的 props 傳遞可能更直觀。

下面提供兩個完整的範例,一個是使用 props 傳遞兩層(父元件 → 子元件 → 孫元件),另一個則是使用 useContext 來改寫,省去中間層級的 props 傳遞。

範例1-使用 props 傳遞兩層

在這個範例中,父元件中定義了 user 狀態,並透過 props 傳遞到子元件,再由子元件傳給孫元件,孫元件可以讀取與更新 user 狀態。

Parent.js

import React, { useState } from 'react';
import Child from './Child';

function Parent() {
const [user, setUser] = useState({ name: 'Alice' });

return (
<div>
<h1>父元件</h1>
{/* 將 user 與 setUser 透過 props 傳給 Child */}
<Child user={user} setUser={setUser} />
</div>
);
}

export default Parent;

Child.js

import React from 'react';
import GrandChild from './GrandChild';

function Child(Props) {
return (
<div>
<h2>子元件</h2>
{/* 再將資料繼續傳給 GrandChild */}
<GrandChild user={Props.user} setUser={Props.setUser} />
</div>
);
}

export default Child;

GrandChild.js

import React from 'react';

function GrandChild(Props) {
const changeUser = () => {
Props.setUser({ name: 'Bob' });
};

return (
<div>
<h3>孫元件</h3>
<p>使用者名稱:{Props.user.name}</p>
<button onClick={changeUser}>更改使用者</button>
</div>
);
}

export default GrandChild;
  • 在此範例中,父元件傳遞資料到子元件,再由子元件傳遞到孫元件,這種方式隨著元件層級增加,props 傳遞會變得繁瑣。

範例2-使用 useContext 改寫

在父元件中我們會建立並 export 一個 Context(這裡命名為 MyContext),其他元件則直接引入使用,不再需要 props 傳遞。

Parent.js

import React, { useState, createContext } from 'react';
import Child from './Child';

// 在父元件中建立並 export Context
export const MyContext = createContext();

function Parent() {
const [user, setUser] = useState({ name: 'Alice' });

return (
<MyContext.Provider value={{ user, setUser }}>
<div>
<h1>父元件</h1>
<Child />
</div>
</MyContext.Provider>
);
}

export default Parent;

Child.js

import React from 'react';
import GrandChild from './GrandChild';

function Child() {
return (
<div>
<h2>子元件</h2>
{/* 直接呼叫 GrandChild,不需要傳遞 props */}
<GrandChild />
</div>
);
}

export default Child;

GrandChild.js

import React, { useContext } from 'react';
import { MyContext } from './Parent';

function GrandChild() {
// 直接使用 useContext 取得資料
const { user, setUser } = useContext(MyContext);

const changeUser = () => {
setUser({ name: 'Bob' });
};

return (
<div>
<h3>孫元件</h3>
<p>使用者名稱:{user.name}</p>
<button onClick={changeUser}>更改使用者</button>
</div>
);
}

export default GrandChild;
在當今數位時代,電資領域人才需求爆發式成長,不論是前端網頁設計、嵌入式開發、人工智慧、物聯網還是軟硬體整合,這些技術都在改變世界。而掌握 C/C++、Python、數位邏輯、電路學與嵌入式開發等大學電資領域的課程,正是進入這個高薪、高需求產業的關鍵!
留言
avatar-img
留言分享你的想法!
在本章,我們將使用 React Hooks(useState、useEffect、useRef)來 開發一個碼錶 (Stopwatch) 應用。
透過本章學習,你將掌握 useRef() 的核心概念與最佳應用方式,提高 React 應用的效能與靈活性!
useEffect 是 React 的一個 Hook,它告訴 React 在以下情況下執行某些代碼。 透過本章的學習,你將能夠 熟練使用 useEffect() 處理 React 副作用,並掌握 最佳實務,確保 React 應用運行順暢、效能最佳!
在本章,我們將會實做Todo-List專案,讓你對React開發有更深刻的了解與認識,同時增加 React 的應用經驗。
在本章節,我們將學習如何使用 React useState 來管理 陣列 (Arrays) 和物件 (Objects) 的狀態,這是開發 動態應用 時的重要技術。內涵大量必須知道的應用範例,幫助讀者學習。
React 的 state 是一個元件用於儲存動態資料的機制,當 state 變更時,React 會重新渲染元件。本文說明如何在函式元件和類別元件中使用 state,包含 useState hook 的用法,以及如何處理批次更新以避免 state 更新不一致的問題,並提供三個實例讓大家實際操作上手。
在本章,我們將使用 React Hooks(useState、useEffect、useRef)來 開發一個碼錶 (Stopwatch) 應用。
透過本章學習,你將掌握 useRef() 的核心概念與最佳應用方式,提高 React 應用的效能與靈活性!
useEffect 是 React 的一個 Hook,它告訴 React 在以下情況下執行某些代碼。 透過本章的學習,你將能夠 熟練使用 useEffect() 處理 React 副作用,並掌握 最佳實務,確保 React 應用運行順暢、效能最佳!
在本章,我們將會實做Todo-List專案,讓你對React開發有更深刻的了解與認識,同時增加 React 的應用經驗。
在本章節,我們將學習如何使用 React useState 來管理 陣列 (Arrays) 和物件 (Objects) 的狀態,這是開發 動態應用 時的重要技術。內涵大量必須知道的應用範例,幫助讀者學習。
React 的 state 是一個元件用於儲存動態資料的機制,當 state 變更時,React 會重新渲染元件。本文說明如何在函式元件和類別元件中使用 state,包含 useState hook 的用法,以及如何處理批次更新以避免 state 更新不一致的問題,並提供三個實例讓大家實際操作上手。
你可能也想看
Google News 追蹤
Thumbnail
【vocus 精選投資理財/金融類沙龍,輸入 "moneyback" 年訂閱 9 折】 市場動盪時,加碼永遠值得的投資標的——「自己」 川普政府再度拋出關稅震撼彈,全球市場應聲重挫,從散戶到專業投資人,都急著找尋買進殺出的訊號,就是現在,輪到知識進場!把握時機讓自己升級,別放過反彈的機會!
Thumbnail
就能get 同款 韓系質感包👜 而且獨家下殺 299元up 讓它成為你的 必備單品吧! - momo優惠折扣碼 領取超簡單❤️ 點擊右下角 會員中心 - 折價券 輸入 FLOWERMOMO 點擊歸戶 就能領取 商店優惠券 啦! - https://momo.dm/RaFNzR
Thumbnail
momo店+ S999純銀四葉草項鍊,精緻細膩,代表愛情、希望、信念與幸運,是送給自己或別人的完美禮物。限時下殺299元起,超取免運!
setter和getter能把狀態改變時需做的事情包裝起來,讓外部只需簡單修改參數就能達到預想的效果
React Hooks 是 React 16.8 中引入的一組新的 API,允許你在函數組件中使用狀態和其他 React 特性,而不需要寫類組件。 狀態管理: useState 鉤子允許在函數組件中添加狀態。 副作用管理: useEffect 鉤子允許處理副作用,如數據獲取、訂閱和手動 DO
06. React Forms: Dynamically Add New Input Fields On Click || Learn React Through Mini Projects
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
※ 函式基礎介紹: ※ JavaScript 特殊的函式特性: 函式可以當成值來傳遞 (可以放進變數或放進物件) 函式可以當成函式的參數 callback - 在特定事件中觸發函式 (非同步特性) ※ 函式的基本寫法: ※ 調用 (invoke) 函式: "調用" 意指呼叫或執行
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
這是一個介紹React Text Wrap Balancer套件的文章,主要內容包括套件的使用方式,常見的實作方式和一些注意事項。文章內容較長,內容大概是在介紹套件的使用方法、使用技巧和注意事項。
Thumbnail
React Props - React 白話文運動。這一篇則會針對 React 語法進一步做講解, 前幾篇也學會了如何建立一個 React 元件,並且學會了元件之間有父子元件的關係。這篇會介紹 React Props 的概念,包含了:React 元件宣告、React Props。
Thumbnail
前言 create react app 是一個可以快速設定 react 專案的一個工具,在建立專案時已經把 babel,webpack 都已經預先封裝設置好,如果我們要修改 webpack alias 設定該如何設定呢 什麼是 alias alias 在 webpack 設定意義叫做,檔案路徑
Thumbnail
useContext 是一種 React hook,讓我們能夠直接取用其他元件的 Context,而無須層層傳遞 props,進而使程式碼簡潔易讀。
Thumbnail
【vocus 精選投資理財/金融類沙龍,輸入 "moneyback" 年訂閱 9 折】 市場動盪時,加碼永遠值得的投資標的——「自己」 川普政府再度拋出關稅震撼彈,全球市場應聲重挫,從散戶到專業投資人,都急著找尋買進殺出的訊號,就是現在,輪到知識進場!把握時機讓自己升級,別放過反彈的機會!
Thumbnail
就能get 同款 韓系質感包👜 而且獨家下殺 299元up 讓它成為你的 必備單品吧! - momo優惠折扣碼 領取超簡單❤️ 點擊右下角 會員中心 - 折價券 輸入 FLOWERMOMO 點擊歸戶 就能領取 商店優惠券 啦! - https://momo.dm/RaFNzR
Thumbnail
momo店+ S999純銀四葉草項鍊,精緻細膩,代表愛情、希望、信念與幸運,是送給自己或別人的完美禮物。限時下殺299元起,超取免運!
setter和getter能把狀態改變時需做的事情包裝起來,讓外部只需簡單修改參數就能達到預想的效果
React Hooks 是 React 16.8 中引入的一組新的 API,允許你在函數組件中使用狀態和其他 React 特性,而不需要寫類組件。 狀態管理: useState 鉤子允許在函數組件中添加狀態。 副作用管理: useEffect 鉤子允許處理副作用,如數據獲取、訂閱和手動 DO
06. React Forms: Dynamically Add New Input Fields On Click || Learn React Through Mini Projects
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
※ 函式基礎介紹: ※ JavaScript 特殊的函式特性: 函式可以當成值來傳遞 (可以放進變數或放進物件) 函式可以當成函式的參數 callback - 在特定事件中觸發函式 (非同步特性) ※ 函式的基本寫法: ※ 調用 (invoke) 函式: "調用" 意指呼叫或執行
Thumbnail
前言 現在的前端需求已經越來越高,要考慮HTML及CSS的切版美觀程度,以及React以及Flutter所提出的元件(Componet、widget)觀念,也就是將元件模組化,使元件可以更動態的被程式運行,而不用靜態的客製化每一個介面。開發一個好的元件可以提升整體的開發速度,讓任何使用元件的開發者
Thumbnail
這是一個介紹React Text Wrap Balancer套件的文章,主要內容包括套件的使用方式,常見的實作方式和一些注意事項。文章內容較長,內容大概是在介紹套件的使用方法、使用技巧和注意事項。
Thumbnail
React Props - React 白話文運動。這一篇則會針對 React 語法進一步做講解, 前幾篇也學會了如何建立一個 React 元件,並且學會了元件之間有父子元件的關係。這篇會介紹 React Props 的概念,包含了:React 元件宣告、React Props。
Thumbnail
前言 create react app 是一個可以快速設定 react 專案的一個工具,在建立專案時已經把 babel,webpack 都已經預先封裝設置好,如果我們要修改 webpack alias 設定該如何設定呢 什麼是 alias alias 在 webpack 設定意義叫做,檔案路徑
Thumbnail
useContext 是一種 React hook,讓我們能夠直接取用其他元件的 Context,而無須層層傳遞 props,進而使程式碼簡潔易讀。