”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何在 React 中使用上下文

如何在 React 中使用上下文

发布于2024-11-03
浏览:708

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]删除
最新教程 更多>
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-07-03
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-07-03
  • 如何在鼠标单击时编程选择DIV中的所有文本?
    如何在鼠标单击时编程选择DIV中的所有文本?
    在鼠标上选择div文本单击带有文本内容,用户如何使用单个鼠标单击单击div中的整个文本?这允许用户轻松拖放所选的文本或直接复制它。 在单个鼠标上单击的div元素中选择文本,您可以使用以下Javascript函数: function selecttext(canduterid){ if(do...
    编程 发布于2025-07-03
  • PHP与C++函数重载处理的区别
    PHP与C++函数重载处理的区别
    作为经验丰富的C开发人员脱离谜题,您可能会遇到功能超载的概念。这个概念虽然在C中普遍,但在PHP中构成了独特的挑战。让我们深入研究PHP功能过载的复杂性,并探索其提供的可能性。在PHP中理解php的方法在PHP中,函数超载的概念(如C等语言)不存在。函数签名仅由其名称定义,而与他们的参数列表无关。...
    编程 发布于2025-07-03
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-07-03
  • Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    Async Void vs. Async Task在ASP.NET中:为什么Async Void方法有时会抛出异常?
    在ASP.NET async void void async void void void void void void void的设计无需返回asynchroncon而无需返回任务对象。他们在执行过程中增加未偿还操作的计数,并在完成后减少。在某些情况下,这种行为可能是有益的,例如未期望或明确...
    编程 发布于2025-07-03
  • eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    eval()vs. ast.literal_eval():对于用户输入,哪个Python函数更安全?
    称量()和ast.literal_eval()中的Python Security 在使用用户输入时,必须优先确保安全性。强大的Python功能Eval()通常是作为潜在解决方案而出现的,但担心其潜在风险。 This article delves into the differences betwee...
    编程 发布于2025-07-03
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-07-03
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-07-03
  • 解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    编程 发布于2025-07-03
  • 编译器报错“usr/bin/ld: cannot find -l”解决方法
    编译器报错“usr/bin/ld: cannot find -l”解决方法
    错误:“ usr/bin/ld:找不到-l “ 此错误表明链接器在链接您的可执行文件时无法找到指定的库。为了解决此问题,我们将深入研究如何指定库路径并将链接引导到正确位置的详细信息。添加库搜索路径的一个可能的原因是,此错误是您的makefile中缺少库搜索路径。要解决它,您可以在链接器命令中添加...
    编程 发布于2025-07-03
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-07-03
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c 的函数时,接受成员函数指针的函数时,必须同时提供对象的指针,并提供指针和指针到函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此)和成员函数指针。这可以通过修改Menubutton :: SetButton()(如下所示:[&& && && &&华)...
    编程 发布于2025-07-03
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-07-03
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-07-03

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3