」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何在 React 中使用上下文

如何在 React 中使用上下文

發佈於2024-11-03
瀏覽:767

How to use Context in React

欢迎回来,朋友们!


今天我们将回顾名为 useContext 的 React Hook 的基础知识。 useContext 是一个强大的工具,它比 useState 更进一步,创建了一个类似全局的 State,可以将信息传递给子组件和孙组件,而无需直接传递 props。

但我有点超前了。
如果你不熟悉 useState,请先跳过去阅读我之前的文章,然后再回来准备大吃一惊!


如何使用‘useState’:https://dev.to/deborah/how-to-use-state-in-react-2pah

现在您已经了解了“useState”,让我们深入了解“useContext”!

什么是 useContext?:

useContext 非常适合需要放置在全局范围内的数据(例如使某人在整个应用程序中保持登录的用户名),但它并不是最终的快捷方式将 props 传递给子组件。
然而,useContext 允许我们在不直接传递 props 的情况下传递数据,因此当我们遇到需要由多个子组件访问或在整个应用程序中可用的数据时,useContext 非常有用。

为了让 useContext 启动并运行,我们需要执行两个步骤:首先,我们需要创建一个上下文对象('createContext'),然后我们需要使用钩子 'useContext' 通过提供者访问该值。

为了让您更好地了解 useContext 的含义以及如何使用它,以下示例已进行了简化,但您应该注意 createContext 通常在其自己的单独文件中声明。然而,我将“Parent.js”比作典型的“App.js”文件(组件层次结构顶部的组件)。 Parent.js 是我定义所有状态变量、更新这些状态变量的函数,并使用 useEffect 获取数据库的地方。我选择在顶级组件中声明 createContext,而不是创建自己的文件,以简化此说明,以便您可以更好地理解 Context 的核心概念。

话虽如此,让我们从头开始:createContext!

1.我们需要做的第一件事是声明并导出一个名为“Context”的变量,稍后我们将在子组件中使用该变量[我们现在正在创建一个变量,以便使我们的代码更简单,因此我们可以将稍后访问其中的值(数据)]:

export Context = React.createContext();

‘Context’是通过调用‘createContext’创建的上下文对象。上下文对象包含一个名为 Provider 的组件,我们现在可以调用该组件,然后传递我们想要保留在“全局”级别的变量和函数。

2. 使用“Context”变量,现在让我们跳到 return 语句中的 JSX。在这里,我们将调用“Context”并将其包装在开始标签(尖括号)中,并像这样调用 Provider:


return(
    
        // Other JSX & the child components we want to hand Context to.

    
);

为了完成‘Context.Provider’,我们还需要给‘Provider’提供一个值。这是我们将传递一个带有所有变量和函数的对象的地方,我们将在子组件中使用“Context”调用这些变量和函数:

return(
    
        // Other JSX & the child components we want to hand Context to.

    
);

非常重要的是要注意,我们需要将所有将使用变量和函数的子组件放在标签之间。例如:

return(
    
);

请注意,我们不需要将任何 props 直接传递给子组件(就像我们使用“useState”一样),只要我们将 props 放在“value”中即可。

现在我们已经使用了 createContext 并将所有全局项传递给“Context.Provider”,我们准备好继续讨论子组件并了解如何使用“Context”。

3. 让我们看看一个子组件,它(为了本示例)位于文件“Child.js”中。正如编码的生活一样:如果你想使用某些东西,你需要导入它。让我们继续从“Parent.js”中声明它的位置获取“Context”,以便我们可以在这个子组件(“Child.js”)中使用它:

import Context from ‘./Parent.js’;

4. 现在我们可以访问子组件中的“Context”,现在需要将“useContext”导入到文件中,以便我们可以将“Context”传递给它(稍后将详细介绍):

import React, { useContext } from ‘react’;
import Context from ‘./Parent.js’;

5. 太棒了!现在让我们使用“useContext”。首先我们需要声明一个变量来使用“useContext”。我们将在组件内部以与声明 useState 类似的方式执行此操作:

import React, { useContext } from ‘react’;
import Context from ‘./Parent.js’;

function Child(){
    const { example, setExample } = useContext(Context)

    // The rest of our code

在此代码中,我们使用大括号 {} 来表示解构赋值。这是一种奇特的说法,我们可以调用存储在 Context 中的多个变量和函数。我们还将“Context”传递给“useContext”,以便我们可以访问 Context.Provider 中定义的值(我们在“Parent.js”中声明)。



6. 不管你信不信,你已经准备好了!您现在可以在代码中使用上下文值,就像通常使用 State 一样。例如:

const expId = example.id;

或者

setExample(newExample);

让我们回顾一下:

恭喜!您现在拥有开始使用 createContext 和 useContext 的所有工具。您了解 useContext 允许您创建某种“全局状态”,可以将变量和函数传递给组件,而无需直接通过子组件传递 props。

我们还深入研究了在应用程序中获取上下文所需的六个步骤。您现在已准备好开始使用 createContext 和 useContext 进行编码,但如果您需要快速入门指南,请看这里:

在父组件中,使用“createContext”声明并导出一个名为“Context”的变量:

export const Context = React.createContext();

在父组件的 JSX 中,将所有需要访问上下文的子组件包装在 Context.Proivder 中,并在对象内传递任何变量/函数:


   //Child components

在您的子组件中,导入“useContext”:

import React, { useContext } from ‘react’;

还从父组件导入“Context”:

import Context from “./Parent.js’;

然后使用 useContext 并将其传递给您的“Context”变量:

const { example, handleExample } = useContext(Context);

最后,使用您现在可以访问的上下文(在上面的示例中,这将是“example”和“handleExample”),但是您需要在子组件中使用。

干得好!下次再见,祝您编码愉快!

最后一点,如果您想深入研究这个主题,这里是我在学习 useContext 和撰写此博客时也引用的官方文档资源:

官方文档:
https://react.dev/reference/react/createContext

Legacy官方文档,对于理解useContext还是有一定帮助的:https://legacy.reactjs.org/docs/context.html

版本聲明 本文轉載於:https://dev.to/deborah/how-to-use-context-in-react-3aa9?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何將單一輸入欄位設定為分區輸入?
    如何將單一輸入欄位設定為分區輸入?
    將輸入欄位設為分區輸入有多種方法可用於建立一系列分區輸入欄位。一種方法利用「字母間距」來分隔單一輸入欄位內的字元。此外,「background-image」和「border-bottom」樣式可以進一步增強多個輸入欄位的錯覺。 CSS Snippet以下 CSS 程式碼示範如何建立所需的效果:#pa...
    程式設計 發佈於2024-11-05
  • 用 Go 建構一個簡單的負載平衡器
    用 Go 建構一個簡單的負載平衡器
    负载均衡器在现代软件开发中至关重要。如果您曾经想知道如何在多个服务器之间分配请求,或者为什么某些网站即使在流量大的情况下也感觉更快,答案通常在于高效的负载平衡。 在这篇文章中,我们将使用 Go 中的循环算法构建一个简单的应用程序负载均衡器。这篇文章的目的是逐步了解负载均衡器的工作原理。 ...
    程式設計 發佈於2024-11-05
  • 如何以超連結方式開啟本機目錄?
    如何以超連結方式開啟本機目錄?
    透過超連結導航本地目錄嘗試在連結互動時啟動本地目錄視圖時,您可能會遇到限制。然而,有一個解決方案可以解決這個問題,並且可以在各種瀏覽器之間無縫運作。 實作方法因為從HTML 頁面直接開啟路徑或啟動瀏覽器是由於安全原因受到限制,更可行的方法是提供可下載的連結( .URL 或.LNK)。 建議路徑:.U...
    程式設計 發佈於2024-11-05
  • 為什麼 Makefile 會拋出 Go 指令的權限被拒絕錯誤?
    為什麼 Makefile 會拋出 Go 指令的權限被拒絕錯誤?
    在執行Go 時Makefile 中出現權限被拒絕錯誤透過Makefile 執行Go 指令時可能會遇到「權限被拒絕」錯誤,即使你可以直接執行它們。這種差異是由於 GNU make 中的問題引起的。 原因:當您的 PATH 上有一個目錄包含名為“go.gnu”的子目錄時,就會出現此錯誤。 ”例如,如果您...
    程式設計 發佈於2024-11-05
  • parseInt 函數中 Radix 參數的意義是什麼?
    parseInt 函數中 Radix 參數的意義是什麼?
    parseInt 函數中 Radix 的作用parseInt 函數將字串轉換為整數。然而,它並不總是採用以 10 為基數的數字系統。若要指定所需的基數,請使用基數參數。 理解基數基數是指單一數字表示的值的數量。例如,十六進制的基數為 16,八進制的基數為 8,二進制的基數為 2。 為什麼要用基數? ...
    程式設計 發佈於2024-11-05
  • 如何使用 JavaScript 將連結保留在同一選項卡中?
    如何使用 JavaScript 將連結保留在同一選項卡中?
    在同一分頁和視窗中導覽連結您可能會遇到想要在同一視窗和分頁中開啟連結的情況作為當前頁面。但是,使用 window.open 函數通常會導致在新分頁中開啟連結。為了解決這個問題,您可以使用name 屬性,如下所示:window.open("https://www.youraddress.co...
    程式設計 發佈於2024-11-05
  • 如何解決Python中的循環依賴?
    如何解決Python中的循環依賴?
    Python 中的循環依賴使用 Python 模組時遇到循環依賴可能是一個令人沮喪的問題。在這個特定場景中,我們有兩個文件,node.py 和 path.py,分別包含 Node 和 Path 類別。 最初,path.py 使用 from node.py import * 導入 node.py。但是...
    程式設計 發佈於2024-11-05
  • MariaDB 與 MySQL:開發人員需要了解什麼
    MariaDB 與 MySQL:開發人員需要了解什麼
    MariaDB 和 MySQL 是著名的開源 RDBMS,但儘管它們有著共同的歷史,但它們在功能和效能方面卻有所不同。本文快速強調了主要差異,幫助開發人員決定哪個資料庫最適合他們的需求。 差異和範例 儲存引擎,MariaDB 對 Aria 和 MyRocks 等引擎的擴充支援提供了...
    程式設計 發佈於2024-11-05
  • 為什麼我的 Goroutine 遞增變數會產生意外的結果?
    為什麼我的 Goroutine 遞增變數會產生意外的結果?
    這是編譯器最佳化的結果嗎? 在此程式碼片段中,啟動了一個 goroutine 並重複遞增變數 i:package main import "time" func main() { i := 1 go func() { for { ...
    程式設計 發佈於2024-11-05
  • 利用 AI 快速學習 Node.js - 第 4 天
    利用 AI 快速學習 Node.js - 第 4 天
    今天,借助ChatGPT繼續學習Node.js,重點是非同步程式設計。這是 Node.js 中最重要的概念之一,我很高興能夠開始掌握它。 理論 在 Node.js 中,非同步程式設計因其非阻塞、事件驅動的架構而至關重要。這意味著文件讀取、資料庫查詢或網路請求等操作在等待結果時不會阻塞其他程式碼的執...
    程式設計 發佈於2024-11-05
  • Java 可以定義帶有嵌入引號的字串而不轉義嗎?
    Java 可以定義帶有嵌入引號的字串而不轉義嗎?
    揭開Java 使用嵌入式引號定義字串的替代方法在Java 中處理字串時,您常常會在文字中遇到大量引號,導致繁瑣的轉義和可讀性挑戰。雖然其他語言提供了處理這種情況的語法,但 Java 缺乏類似的選項。 問題: Java 是否提供了另一種方法來定義帶有嵌入引號的字串而不訴諸轉義? 答案: 雖然Java ...
    程式設計 發佈於2024-11-05
  • 耐用的 Python:建立防彈的長期運作工作流程,變得簡單
    耐用的 Python:建立防彈的長期運作工作流程,變得簡單
    在现代软件开发中,创建强大的工作流程来连接来自各种服务的 API 并处理同步和异步事件是一个常见的挑战。传统方法涉及使用队列、微服务和状态管理系统的组合来构建可扩展的应用程序。虽然有效,但这种架构带来了巨大的开销:设置和维护消息队列等基础设施、运行服务器或 lambda 函数、管理数据库中的状态以及...
    程式設計 發佈於2024-11-05
  • 使用 Node.js 建立即時儀表板
    使用 Node.js 建立即時儀表板
    介紹 在當今快節奏的商業世界中,組織存取即時數據以做出明智的決策至關重要。這就是使用 Node.js 建立即時儀表板發揮作用的地方。 Node.js 是一種流行的、輕量級的、高效的 JavaScript 執行環境,近年來獲得了極大的普及。在本文中,我們將討論專門使用 Node.js...
    程式設計 發佈於2024-11-05
  • 以下是一些適合您的文章的基於問題的標題,重點關注問題和解決方案:

* 如何跨子域共享localStorage資料?
* 想要在您之間共享本機儲存數據
    以下是一些適合您的文章的基於問題的標題,重點關注問題和解決方案: * 如何跨子域共享localStorage資料? * 想要在您之間共享本機儲存數據
    如何跨子網域共享 localStorage許多網站使用 localStorage 而不是 cookie 來儲存數據,因為它提供了更好的效能和安全性。然而,localStorage 在處理子網域時可能會帶來挑戰,因為每個子網域都有自己單獨的 localStorage 物件。當使用者同時使用主網域(例如...
    程式設計 發佈於2024-11-05
  • C++ 是否像 Python 一樣有遞迴深度限制?
    C++ 是否像 Python 一樣有遞迴深度限制?
    C 是否像 Python 一樣有遞迴深度限制? 與 Python 不同,Python 由於其解釋性而具有最大遞歸深度,C 是編譯的,並且沒有直接面對這樣的限制。然而,C 確實有作業系統透過其分配的堆疊大小施加的遞歸限制。 C 中的堆疊大小通常明顯小於可用 RAM,並且可以在作業系統內進行修改(例如使...
    程式設計 發佈於2024-11-05

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3