Lala Code

Lala 的前端大補帖,歡迎一起鑽研前端技術😊

0%

React Context API跨組件溝通傳遞資料

React

context api 可以跨組件溝通傳遞資料,讓組件可以省去組件層層傳遞的麻煩

以下範例情境: 點擊按鈕,讓 header 的總數量增加

App 為最外層、Header 顯示訂單數量、ProductList 訂單、Product 每個品項增加按鈕

context-api



設定 Context

import createContext,並設定 createContext 的預設值,
範例預設為: 訂單陣列 orders、增加訂單函式 addOrder

Provider(提供者)是用來提供 context 值

Consumer(消費者)是用來使用 context 值

/src/context/order.js

1
2
3
4
5
import { createContext } from "react";
export const { Provider, Consumer } = createContext({
orders: [],
addOrder: () => {},
});



設定 Provider,contextValue 傳入 context

在外層設定值與函式,傳入 context

在需使用到的組件外,包一層 Provider,傳入需要的 value,使底下的組件都可以使用 value 裡的值

App.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import React, { Component } from 'react';
import Header from "./Header";
import ProductList from "./ProductList";
import { Provider } from "./context/order.js";

class App extends Component {
state = {
orders: []
}
addOrder = order => {
this.setState({
orders: [...this.state.orders, order]
})
}
render() {
const { orders } = this.state;
const contextValue = {
orders,
addOrder: this.addOrder
}
return (
<div>
<Provider value={contextValue}>
<Header />
<ProductList />
</Provider>
</div>
);
}
}

export default App;



Consumer 使用 context

在需要使用 context value 的地方包一層 Consumer,需注意 value 必須用函式傳入

這麼一來就可以取到 context 的值囉!

Header.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import React from 'react';
import { Consumer } from "./context/order.js";

const Header = () => {
return (
<header>
<Consumer>
{ value => (`購物車(${value.orders.length})`)}
</Consumer>
<hr/>
</header>
);
}

export default Header;

ProductList.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import React from 'react';
import Product from "./Product";
const menu = [
{ id: 0, name: '雞肉鍋'},
{ id: 1, name: '豬肉鍋'},
{ id: 2, name: '牛肉鍋'},
{ id: 3, name: '海鮮鍋'},
{ id: 4, name: '泡菜鍋'},
]

const ProductList = () => {
return(
<ul>
{menu.map(item => <Product key={item.id} {...item} />)}
</ul>
)
}

export default ProductList;

Product.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import React from 'react';
import { Consumer } from "./context/order.js";

const Product = ({ id, name }) => {
return (
<li>
<label>{name}</label>
<Consumer>
{
value => (
<button onClick={() => {value.addOrder(id)}}>+</button>
)
}
</Consumer>
</li>
);
}

export default Product;




React Hooks 的 useContext 可以不使用 Consumer,可參考 React 常用 Hooks



Hey!想學習更多前端知識嗎?

最近 Lala 開了前端課程 👉【實地掌握RWD - 12小時新手實戰班】👈
無論您是 0 基礎新手,又或是想學 RWD 的初學者,
我們將帶你從零開始,深入了解並掌握 RWD 響應式網頁設計的核心技術,快來一起看看吧 😊



🚀線上課程分享

線上課程可以加速學習的時間,省去了不少看文件的時間XD,以下是我推薦的一些課程
想學習更多關於前後端的線上課程,可以參考看看。

Hahow

Hahow 有各式各樣類型的課程,而且是無限次數觀看,對學生或上班族而言,不用擔心被時間綁住



六角學院

如果你是初學者,非常推薦六角學院哦!
剛開始轉職也是上了六角的課,非常的淺顯易懂,最重要的是,隨時還有線上的助教幫你解決問題!


Udemy

Udemy 裡的課程非常的多,品質普遍不錯,且價格都滿實惠的,CP值很高!
也是很多工程師推薦的線上課程網站。
❤️