使用React.createContext()在React應用中傳遞數據,nolan出品

React.createContext() 是React中的一個API,用于創建一個“上下文”,這是一種在組件樹中傳遞數據的方法,而無需手動將props逐級傳遞。

這個方法接受一個參數,即默認值,當組件在樹中上層沒有找到對應的Provider時,就會使用這個默認值。

React.createContext() 返回一個對象,該對象包含兩個React組件:ProviderConsumer

Provider組件接受一個名為value的prop,你可以將任何數據類型的值傳遞給它。這個值將會被Provider的所有后代Consumer組件所消費。

Consumer組件使用一個函數作為子組件,這個函數接收當前的context值并返回一個React節點。當Providervalue值發生變化時,Consumer組件都將重新渲染。

在React新的版本中,也可以使用useContext這個Hook來消費context。

這個API的主要用途是共享可以被視為全局的數據,例如當前認證的用戶、主題或首選語言等。

怎么使用

下面是一個簡單的React應用,用React.createContext()創建了一個主題上下文,并在組件樹中使用了ProviderConsumer

import React from 'react';// 創建一個主題上下文,默認值為“light”
const ThemeContext = React.createContext('light');class App extends React.Component {render() {// 使用Provider組件傳遞當前的主題給子組件樹return (<ThemeContext.Provider value="dark"><Toolbar /></ThemeContext.Provider>);}
}// Toolbar組件并不關心主題,但是它包含了使用主題的子組件
function Toolbar() {return (<div><ThemedButton /></div>);
}// ThemedButton組件使用Consumer獲取當前的主題
function ThemedButton() {return (<ThemeContext.Consumer>{theme => <button theme={theme}>我是{theme}主題的按鈕</button>}</ThemeContext.Consumer>);
}export default App;

在這個例子中,我們創建了一個ThemeContext,并在App組件中使用ThemeContext.Provider組件傳遞了一個主題值(dark)。然后,在ThemedButton組件中,我們使用了ThemeContext.Consumer組件來獲取當前的主題值,并將其應用于按鈕。

這樣,我們就可以在組件樹中任何地方使用Consumer組件來訪問主題值,而無需手動將主題值作為prop逐層傳遞。如果我們想要更改主題,只需更改App組件中Providervalue即可,所有的Consumer組件都會自動更新。

傳遞對象例子

以下是一個使用React.createContext()傳遞對象的示例:

import React from 'react';// 創建一個主題上下文,默認值包含主題和切換主題的方法
const ThemeContext = React.createContext({theme: 'light',toggleTheme: () => {},
});class App extends React.Component {constructor(props) {super(props);this.state = {theme: 'light',toggleTheme: this.toggleTheme,};}toggleTheme = () => {this.setState(prevState => ({theme: prevState.theme === 'light' ? 'dark' : 'light',}));};render() {// 使用Provider組件傳遞一個包含主題和切換主題方法的對象給子組件樹return (<ThemeContext.Provider value={this.state}><Toolbar /></ThemeContext.Provider>);}
}function Toolbar() {return (<div><ThemedButton /></div>);
}function ThemedButton() {return (<ThemeContext.Consumer>{({ theme, toggleTheme }) => (<button onClick={toggleTheme} theme={theme}>我是{theme}主題的按鈕</button>)}</ThemeContext.Consumer>);
}export default App;

在這個例子中,我們創建了一個ThemeContext,并在App組件的構造函數中初始化了一個包含themetoggleTheme的狀態對象。然后我們將整個狀態對象傳遞給ThemeContext.Providervalue屬性。

ThemedButton組件中,我們使用了ThemeContext.Consumer組件來獲取當前的主題值和切換主題的方法。當點擊按鈕時,會調用toggleTheme方法來更改主題。

這樣,我們就可以在組件樹中任何地方使用Consumer組件來訪問主題值和切換主題的方法,而無需手動將它們作為prop逐層傳遞。

React hooks 寫法

使用 React Hooks 的寫法會更簡潔一些。以下是使用 React.createContext()useContext hook 的示例:

import React, { useState, useContext } from 'react';const ThemeContext = React.createContext();function App() {const [theme, setTheme] = useState('light');const toggleTheme = () => {setTheme(prevTheme => prevTheme === 'light' ? 'dark' : 'light');};return (<ThemeContext.Provider value={{ theme, toggleTheme }}><Toolbar /></ThemeContext.Provider>);
}function Toolbar() {return (<div><ThemedButton /></div>);
}function ThemedButton() {const { theme, toggleTheme } = useContext(ThemeContext);return (<button onClick={toggleTheme}>我是{theme}主題的按鈕</button>);
}export default App;

在這個例子中,我們使用 useState hook 來創建 theme 狀態和 setTheme 函數。然后我們創建一個對象,其中包含 themetoggleTheme,并將該對象傳遞給 ThemeContext.Providervalue 屬性。

ThemedButton 組件中,我們使用 useContext hook 來獲取當前的主題值和切換主題的方法。當點擊按鈕時,會調用 toggleTheme 方法來更改主題。

這樣,我們就可以在組件樹中任何地方使用 useContext hook 來訪問主題值和切換主題的方法,而無需手動將它們作為 prop 逐層傳遞。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/13221.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/13221.shtml
英文地址,請注明出處:http://en.pswp.cn/web/13221.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【GESP試卷】2024年03月Scratch三級試卷

2024年GESP03月認證Scratch三級試卷 分數&#xff1a;100 題數&#xff1a;27 一、單選題(共15題&#xff0c;每題2分&#xff0c;共30分) 010203040506070809101112131415CBACADDADCBCBAB 1、小楊的父母最近剛剛給他買了一塊華為手表&#xff0c;他說手表上跑的是鴻蒙&…

24長三角A題思路+分析選題

需要資料的寶子們可以進企鵝獲取 A題 問題1&#xff1a;西湖游船上掉落華為 mate 60 pro 手機 1. 手機掉落范圍分析 物品特征&#xff1a;華為 mate 60 pro 手機的尺寸、重量、形狀等特性。靜水假設&#xff1a;西湖水面平靜&#xff0c;不考慮水流影響。掉落位置&#xff…

在C#語言里對NULL的技術處理

文章目錄 前言1 、NULL合并操作符&#xff08;??&#xff09;2. 條件運算符 (?:)3. 空條件運算符(?.)4. 空合并賦值操作符 (??)5. 寬容運算符 (!.)6. 使用 is 運算符7. ArgumentNullException 參數空異常結論 前言 在 C# 中&#xff0c;null 是一個特殊存在&#xff0c;…

安卓Fragment基礎

目錄 前言一、基礎使用二、動態添加Fragment三、Fragment的生命周期四、Fragment之間進行通信五、Fragment兼容手機和平板示例 前言 Fragment基礎使用筆記 一、基礎使用 Activity布局和文件 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/andro…

OpenAI 發布 GPT-4o,再次鞏固行業地位!

5 月 14 日凌晨 1 點&#xff08;太平洋時間上午 10 點&#xff09;&#xff0c;OpenAI 發布了其最新的 GPT-4o&#xff0c;再次鞏固了其在人工智能領域的領導地位。這次發布不僅僅是一個產品的推出&#xff0c;更是向世界宣告 AI 技術已邁入一個全新的紀元。OpenAI 的 CEO 薩姆…

品牌竄貨治理管控的方法

竄貨問題確實是一個需要品牌方高度關注和有效治理的難題。這種現象通常源于品牌區域銷售政策的差異&#xff0c;經銷商為了獲取更多的利潤&#xff0c;往往會利用這些差異進行跨區域的低價銷售。這不僅損害了大多數經銷商的利益&#xff0c;也破壞了市場的穩定和品牌價值。 品牌…

深入理解 Spring 循環依賴之三級緩存(附源碼分析)

前言&#xff1a; 學過 Spring 的都知道 Spring 利用三級緩存解決了循環依賴問題&#xff0c;那你知道什么是循環依賴&#xff1f;什么又是三級緩存&#xff1f;本篇將從源碼層面分析 Spring 是怎么去利用三級緩存幫我們解決循環依賴問題。 深入理解 Spring IOC 底層實現機制…

三生隨記——麗水詭事

在浙江的深山之中&#xff0c;隱藏著一座名為麗水的古老小城。這里山水秀麗&#xff0c;風景如畫&#xff0c;但在這美麗的外表下&#xff0c;卻隱藏著不為人知的恐怖秘密。 傳聞&#xff0c;麗水的郊外有一片被詛咒的竹林。這片竹林與其他竹林不同&#xff0c;它的葉子常年枯黃…

c# datagridview基本操作,包括行拖拽,添加自定義行列。

項目場景&#xff1a; 這段代碼定義了一個名為 ucDatagridviewHelper 的用戶控件&#xff08;UserControl&#xff09;&#xff0c;該控件包含了一個 DataGridView 控件和一些其他功能。 這段代碼的主要部分&#xff1a; 構造函數&#xff1a;在構造函數中&#xff0c;初始化…

C++ | Leetcode C++題解之第89題格雷編碼

題目&#xff1a; 題解&#xff1a; class Solution { public:vector<int> grayCode(int n) {vector<int> ret(1 << n);for (int i 0; i < ret.size(); i) {ret[i] (i >> 1) ^ i;}return ret;} };

數據結構--紅黑樹(RBTree)

一、紅黑樹概念 1.1 什么是紅黑樹 紅黑樹&#xff0c;是一種二叉搜索樹&#xff0c;但在每個結點上增加一個存儲位表示結點的顏色&#xff0c;可以是Red或 Black。 通過對任何一條從根到葉子的路徑上各個結點著色方式的限制&#xff0c;紅黑樹確保沒有一條路徑會比其他路徑長…

openEuler-22.03-LTS安裝opengauss5.0.1(包含cm集群管理)主備

環境說明 openEuler-22.0.3-LTS opengauss5.0.1 安裝數據庫 安裝系統依賴包 yum -y install lksctp* yum -y install psmisc yum -y install bzip2 yum -y install unzip yum -y install gcc yum -y install gcc-c yum -y install perl yum -y install libxml2-devel yum …

前端(包含cocosCreator)開發環節調取后端接口時跨域,解決辦法之反向代理

/** eslint-disable */ var http require(http),httpProxy require(http-proxy),HttpProxyRules require(http-proxy-rules);// Set up proxy rules instance var port 9090 var proxyRules new HttpProxyRules({rules: {/api/(.*): https://baidu.com/$1, // 測試環境游戲…

自學VBA 設置單元格文字格式 筆記

一.設定對應單元格對應需要顯示的格式 Cells(1, 1).Font.Size 18 字體大小 Cells(1, 2).Font.Color RGB(255, 0, 0) 字體顏色 Cells(1, 3).Font.Name "黑體" 字體類型 Cells(1, 4).Font.Italic True 字體斜體 Cells(1, 5).Font.FontStyle "BOLD"…

ubuntu下gcc編譯器的安裝

.gcc編譯器的安裝 一般linux下是覆蓋含有的&#xff0c;如果沒有執行更新命令 sudo apt update gcc安裝成功&#xff0c;可以檢查一下版本 可以看出我的gcc是9.4.0版本的

驗證torch.nn.Conv2d

import os import cv2 import torch import numpy as np import random import cv2 as cv from matplotlib import pyplot as pltdef f_VerifyConv2D():"""驗證torch.nn.Conv2d&#xff0c; 并將輸入數據及權重保存到txt文件中"""x torch.randn…

SpringBoot環境隔離Profiles

前言 通常我們開發不可能只有一個生產環境&#xff0c;還會有其它的開發&#xff0c;測試&#xff0c;預發布環境等等。為了更好的管理每個環境的配置項&#xff0c;springboot也提供了對應的環境隔離的方法。 直接上干貨 知識點 激活環境方法 1&#xff0c;在application…

專用設備制造業供應商收發文件,有什么專業而輕便的方式嗎?

專用設備制造業的特點包括&#xff1a;門類廣、跨度大、科技含量高。它主要生產的是國民經濟各部門&#xff08;包括采掘、化工、冶煉、能源、醫療衛生、環保等&#xff09;所急需的重大成套設備&#xff0c;例如礦產資源井采及露天開采設備、大型火電、水電、核電成套設備、石…

教育行業文本短信VS視頻短信VS語音短信哪個好?

在教育行業中&#xff0c;文本短信、視頻短信和語音短信各有其優勢&#xff0c;選擇哪種方式更好取決于具體的應用場景和目標。 文本短信的優勢在于&#xff1a; 1.簡潔明了&#xff1a;能夠快速、直接地傳遞信息&#xff0c;對于需要快速通知或提醒的場景非常適用。 …

通過內網穿透免費部署我們的springboot+vue項目 實現跟服務器一樣的效果

前文講到通過內網穿透能夠實現遠程訪問個人電腦的靜態資源。本文將講解通過內網穿透實現遠程訪問本地的項目&#xff0c;實現跟部署到服務器一樣的效果&#xff1a;前文鏈接&#xff1a;通過內網穿透實現遠程訪問個人電腦資源詳細過程&#xff08;免費&#xff09;&#xff08;…