hook中useContext到底怎么用

語法:

somecontext = createContext(defaultValue);

作用: 避免了組件嵌套太深, 頂層變量層層傳遞的麻煩.

如何消費頂層數據

第一步: 用createContext聲明一個context上下文變量

import { createContext } from 'react';export const GlobalContext = createContext({} as any);

● 參數defaultValue: 如果在組件的頂層樹沒有匹配到context Provider,就會使用defaultValue,它是靜態的并且永遠不會被改變. 如果你沒有什么特別想聲明的默認值, 寫個null就行.
● 返回值: 返回一個context對象, 它本身不帶有任何信息,它代表了其他組件可以提供和讀取的上下文.生成的context對象有兩個屬性,分別是:
○ context.Provider: 讓你用來給組件們提供context變量
○ context.Consumer: 另一種比較少用的, 用來消費context變量的方法( useContext出現之前的一種老的讀取context的方法, 不推薦使用, 現在推薦用useContext )

第二步: 用context.Provider給下層組件傳遞要消費的值
像下面這樣, 將你的子組件用context.Provider包裹, 并通過value向內部所有的組件們提供可用的值,

const globalData = Object.assign({},  {mydata,
}const [globalStore, dispatch] = useReducer(useCallback((preState, patchValue) => {return { ...preState, ...patchValue };}, []),globalData,
);function App(){return (<GlobalContext.Providervalue={{ globalStore}}<OtherComponents/></GlobalContext.Provider>)
}

第三步: 用useContext消費頂層樹提供的數據
所有子組件就可以通過調用usecontext(ThemeContext)去讀取這個context的變量,無論這些子組件嵌套有多深

 const { globalStore } = useContext(GlobalContext);
function OtherComponents(){const theme = useContext(GlobalContext);return <button classname={theme}/>
}

只要來自父組件的context改變了, react就會重新渲染和更新ui

通常, 在不同文件的組件需要訪問同一個context, 這就是為什么我們要在一個單獨的文件里聲明context, 然后將它export出去
// Contexts.js

import { createContext } from 'react';export const GlobalContextProvider = GlobalContext.Provider;export default GlobalContext;

如果想在子組件更新這些數據怎么辦?

總不能從頂層傳遞一個setstate下來吧,這多麻煩啊, 特別是如果你的項目中組件嵌套很深的情況, 有個簡單的方法,就是從context.Provider的value中 pass down 一個 dispatch 函數 from useReducer via context

const globalData = Object.assign({},  {mydata,
}const [globalStore, dispatch] = useReducer(useCallback((preState, patchValue) => {return { ...preState, ...patchValue };}, []),globalData,
);function App(){return (<GlobalContext.Providervalue={{ globalStore, dispatch}} //改動在這里<OtherComponents/></GlobalContext.Provider>)
}

這樣TodosApp中所有的子組件就可以使用dispatch去更新頂層數據了

function DeepChild(props) {// If we want to perform an action, we can get dispatch from context.  const dispatch = useContext(TodosDispatch);function handleClick() {dispatch({ type: 'add', text: 'hello' });}return (<button onClick={handleClick}>Add todo</button>);
}

參考自文檔: https://legacy.reactjs.org/docs/hooks-faq.html#how-to-avoid-passing-callbacks-down

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

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

相關文章

面試問題小結

說說你的項目&#xff0c;從里面學到啥了&#xff08;隨便說&#xff09; CAS 線程池 的各個方面 線程咋創建&#xff08;4種方式&#xff09; 說一下聚集索引和非聚集索引 50w男 50w女 &#xff0c;在B樹中咋存儲的&#xff08;類似下面的圖&#xff0c;變通一下就行了&a…

本是夢中人,常作花下客。心中自往來,知我有幾個。

我們總是喜歡拿“順其自然”來敷衍人生道路上的荊棘坎坷&#xff0c;卻很少承認&#xff0c;真正的順其自然&#xff0c; 其實是竭盡所能之后的不強求&#xff0c; 而非兩手一攤的不作為。 一花凋零荒蕪不了整個春天&#xff0c; 一次挫折也荒廢不了整個人生。 多年后&#x…

近臨算法(個人總結版)

背景 近鄰算法&#xff08;Nearest Neighbor Algorithm&#xff09;是一種基本但非常有效的分類和回歸方法。最早由Fix和Hodges在1951年提出&#xff0c;經過幾十年的發展和改進&#xff0c;已成為數據挖掘、模式識別和機器學習領域的重要工具。近鄰算法基于相似性原則&#x…

通過el-tree自定義渲染網頁版工作目錄,實現鼠標懸浮顯示完整名稱、用icon區分文件和文件夾等需求

目錄 一、通過el-tree自定義渲染網頁版工作目錄 1.1、需求介紹 1.2、使用el-tree生成文檔目錄 1.2.1、官方基礎用法 ①效果 ②代碼&#xff1a; 1.2.2、自定義文檔目錄&#xff08;實現鼠標懸浮顯示完整名稱、用icon區分文件和文件夾&#xff09; ①效果&#xff08;直接效…

find 幾招在 Linux 中高效地查找目錄

1. 介紹 在 Linux 操作系統中&#xff0c;查找目錄是一項常見的任務。無論是系統管理員還是普通用戶&#xff0c;都可能需要查找特定的目錄以執行各種操作&#xff0c;如導航文件系統、備份數據、刪除文件等。Linux 提供了多種命令和工具來幫助我們在文件系統中快速找到目標目…

淺談后端整合Springboot框架后操作基礎配置

boot基礎配置 現在不訪問端口8080 可以嗎 我們在默認啟動的時候訪問的是端口號8080 基于屬性配置的 現在boot整合導致Tomcat服務器的配置文件沒了 我們怎么去修改Tomcat服務器的配置信息呢 配置文件中的配置信息是很多很多的... 復制工程 保留工程的基礎結構 抹掉原始…

樸素貝葉斯+SMSSpamCollections

1. 打開 Jupyter 后&#xff0c;在工作目錄中&#xff0c;新建一個文件夾命名為 Test01 &#xff0c;并且在文件夾中導入數據 集。在網頁端界面點擊 “upload” 按鈕&#xff0c;在彈出的界面中選擇要導入的數據集。然后數據集出現 在 jupyter 文件目錄中&#xff0c;此時…

Vue.js Promise 與 async/await 的比較

在現代 Web 開發中&#xff0c;異步操作是不可避免的。在處理異步數據獲取時&#xff0c;開發人員通常會使用 Promise 或 async/await。雖然兩者都可以實現相同的功能&#xff0c;但它們在代碼風格、可讀性和錯誤處理等方面有所不同。本文將對這兩種方法進行比較&#xff0c;并…

初識Qt:從Hello world到對象樹的深度解析

Qt中的對象樹深度解析 Hello world1.圖形化界面創建命令行式創建在棧上創建在堆上創建為什么傳文本需要QString&#xff0c;std::string不行嗎&#xff1f;那為什么要傳入this指針&#xff1f;為什么new后不用顯示調用delete函數呢&#xff0c;不會造成內存泄漏問題嗎&#xff…

python:__class_getitem__使用以及cached_property源碼分析

python&#xff1a;__class_getitem__使用以及cached_property源碼分析 1 前言 Python中如何模擬泛型類型&#xff1f; 當使用類型標注時&#xff0c;使用 Python 的方括號標記來形參化一個 generic type 往往會很有用處。 例如&#xff0c;list[int] 這樣的標注可以被用來表…

深入 OpenFeign:探索緩存、QueryMap、MatrixVariable 和 CollectionFormat 的高級用法以實現優雅的遠程調用

免費多模型AI網站,支持豆包、GPT-4o、谷歌Gemini等AI模型&#xff0c;無限制使用&#xff0c;快去白嫖&#x1f449;海鯨AI 一、OpenFeign簡介 OpenFeign 是一個聲明式的 HTTP 客戶端&#xff0c;它使得我們可以通過簡單的注解和接口定義來調用遠程 HTTP 服務。與傳統的 HTTP …

K8S集群再搭建

前述&#xff1a;總體是非常簡單的&#xff0c;就是過程繁瑣&#xff0c;不過都是些重復的操作 master成員: [controller-manager, scheduler, api-server, etcd, proxy,kubelet] node成員: [kubelet, proxy] master要修改的配置文件有 1. vi /etc/etcd/etcd.conf # 數…

Mokito的一些API

Mockito是一個Java單元測試框架&#xff0c;它允許開發者創建和配置模擬對象&#xff08;mock objects&#xff09;&#xff0c;以便在隔離的環境中測試代碼&#xff0c;尤其是當實際對象難以構造或其行為不確定時。下面是一些核心的Mockito API及其使用場景和代碼示例。 基礎…

wordpress教程視頻 wordpress教程網盤 wordpress教程推薦wordpress教程網

WordPress&#xff0c;作為一款強大且靈活的開源內容管理系統&#xff0c;已成為許多網站開發者與運營者的首選。其強大的功能、豐富的插件以及易于上手的特點&#xff0c;使得無論是初學者還是專業開發者都能輕松構建出個性化的網站。然而&#xff0c;對于初學者來說&#xff…

JUnit5標記測試用例

使用場景&#xff1a; 通過Tag對用例分組&#xff1a; 環境分組&#xff1a;測試環境、預發布環境階段分組&#xff1a;冒煙用例版本分組&#xff1a;V1.1、V1.2 Tag標記用例&#xff1a; 設置標簽根據標簽執行 結合Maven執行結合測試套件執行 設置標簽&#xff1a; 通過T…

NER 數據集格式轉換

NER 數據集格式 格式一 某些地方的數據和標簽拆成兩個文件了 sentences.txt 如 何 解 決 足 球 界 長 期 存 在 的 諸 多 矛 盾 &#xff0c; 重 振 昔 日 津 門 足 球 的 雄 風 &#xff0c; 成 為 天 津 足 壇 上 下 內 外 到 處 議 論 的 話 題 。 該 縣 一 手 抓 農 業…

【Spring Cloud】全面解析服務容錯中間件 Sentinel 持久化兩種模式

文章目錄 推送模式本地文件持久化&#xff08;拉模式&#xff09;配置yml編寫處理類添加配置演示 配置中心持久化&#xff08;推模式&#xff09;修改nacos在sentinel中生效引入依賴配置文件 修改sentinel在nacos中生效下載源碼更改代碼演示 總結 推送模式 Sentinel 規則的推送…

allegro 無法刪除Xnet

allegro 無法刪除Xnet Orcad中打開Constraint Manager之后&#xff0c;再生成網表&#xff0c;導入PCB后就會出現一堆Xnet網絡。無法去除Xnet。 解決辦法 在原理圖ORCAD中&#xff0c; 1、打開Edit Object properties 2、選擇Filter by:Capture 3、點擊New Property 4、設置…

火山引擎邊緣云亮相 Force 原動力大會,探索 AI 應用新范式

5月15日&#xff0c;2024 春季火山引擎 FORCE 原動力大會在北京正式舉辦。大會聚焦 AI 主題&#xff0c;以大模型應用為核心、以 AI 落地為導向&#xff0c;展示了火山引擎在大模型、云計算領域的實踐應用&#xff0c;攜手汽車、手機終端、金融、消費、互聯網等領域的專家和企業…

2024042102-array-list

數組 Array 一、前言 數組是數據結構還是數據類型&#xff1f; 數組只是個名稱&#xff0c;它可以描述一組操作&#xff0c;也可以命名這組操作。數組的數據操作&#xff0c;是通過 idx->val 的方式來處理。它不是具體要求內存上要存儲著連續的數據才叫數據&#xff0c;而…