context api 可以跨組件溝通傳遞資料,讓組件可以省去組件層層傳遞的麻煩
以下範例情境: 點擊按鈕,讓 header 的總數量增加
App 為最外層、Header 顯示訂單數量、ProductList 訂單、Product 每個品項增加按鈕
設定 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
🚀實體工作坊分享
最近時賦學苑開了實體體驗課,即使你對程式碼沒有概念也能上手!Lala 會帶你一起做出一個個人品牌形象網站,帶你快速了解前端的開發流程,快跟我們一起玩轉 Web 吧!
🚀線上課程分享
線上課程可以加速學習的時間,省去了不少看文件的時間XD,以下是我推薦的一些課程
想學習更多關於前後端的線上課程,可以參考看看。
Hahow 有各式各樣類型的課程,而且是無限次數觀看,對學生或上班族而言,不用擔心被時間綁住
如果你是初學者,非常推薦六角學院哦!
剛開始轉職也是上了六角的課,非常的淺顯易懂,最重要的是,隨時還有線上的助教幫你解決問題!
Udemy 裡的課程非常的多,品質普遍不錯,且價格都滿實惠的,CP值很高!
也是很多工程師推薦的線上課程網站。