当前位置: 首页 > 知识库问答 >
问题:

react.js - 为什么需要插入 contextHolder 节点才能获取上下文?

何德寿
2023-11-28

为什么 Modal 方法不能获取 context、redux、的内容和 ConfigProvider locale/prefixCls/theme 等配置?

直接调用 Modal 方法,antd 会通过 ReactDOM.render 动态创建新的 React 实体。其 context 与当前代码所在 context 并不相同,因而无法获取 context 信息。

当你需要 context 信息(例如 ConfigProvider 配置的内容)时,可以通过 Modal.useModal 方法会返回 modal 实体以及 contextHolder 节点。将其插入到你需要获取 context 位置即可:

const [modal, contextHolder] = Modal.useModal();return (  <Context1.Provider value="Ant">    {/* contextHolder 在 Context1 内,它可以获得 Context1 的 context */}    {contextHolder}    <Context2.Provider value="Design">      {/* contextHolder 在 Context2 外,因而不会获得 Context2 的 context */}    </Context2.Provider>  </Context1.Provider>);

异同:通过 hooks 创建的 contextHolder 必须插入到子元素节点中才会生效,当你不需要上下文信息时请直接调用。

为啥要插入 contextHolder 节点才能 获取上下文呢?

有没有react大佬解答下

共有1个答案

濮阳安澜
2023-11-28

这个问题涉及到 React 和 Ant Design 的 Modal 组件的上下文(context)管理。在 React 中,上下文(context)是一种让数据在组件树中流动的方式,而无需通过 props 手动向下传递。在 Ant Design 的 Modal 组件中,当你直接调用 Modal 方法时,antd 会通过 ReactDOM.render 动态创建新的 React 实体,这个实体的上下文与当前代码所在的上下文是不同的,因此无法获取当前的上下文信息,包括 ConfigProvider、redux、context 等内容。

为了解决这个问题,Ant Design 的 Modal 组件提供了 useModal hook,通过这个 hook 可以获取到 Modal 的实例以及一个 contextHolder 节点。这个 contextHolder 节点的作用是持有当前的上下文信息,以便在需要的时候获取。

当你需要获取上下文信息时,可以将 contextHolder 节点插入到需要获取上下文信息的组件中。例如,如果你需要在 Modal 组件中使用 ConfigProvider 提供的配置信息,你可以将 contextHolder 插入到 ConfigProvider 组件的子元素中,这样就可以获取到 ConfigProvider 提供的上下文信息了。

总结一下,插入 contextHolder 节点是为了获取当前的上下文信息,而直接调用 Modal 方法会创建一个新的实体,其上下文与当前代码所在的上下文不同,因此无法获取当前的上下文信息。通过 useModal hook 可以获取到 Modal 的实例以及 contextHolder 节点,从而解决这个问题。

 类似资料:
  • 我的问题是,我的活动中的按钮需要单击两次,以使代码执行用onClick方法编写的代码。当我共享我的活动代码和布局文件代码时。请引导我解决这个问题。 活动(片段) 布局文件 而此片段正在另一个主要活动中初始化。

  • 问题内容: 我认为这个问题已经存在,但是我找不到。 我不明白,为什么必须要有一个功能接口才能使用lambda。考虑以下示例: 这可以正常工作,但是如果您取消注释行,则不会。为什么?以我的理解,编译器应该能够区分这两种方法,因为它们具有不同的输入参数。为什么我需要一个功能接口并炸毁我的代码? 编辑:链接的重复项没有回答我的问题,因为我在询问不同的方法参数。但是在这里,我得到了一些非常有用的答案,这要

  • 所以我的问题是,当我点击一个radiobutton来添加类“Completed”时,它执行了所要执行的操作,但是当我想要移除它时,我需要点击两次,我不知道为什么。如有任何帮助,我们将不胜感激。谢谢 HTML CSS JavaScript

  • 问题内容: 如果包含变音符号(ä,ö,ü)在我的Windows操作系统上不起作用。通过反复试验,我发现需要做一些工作。 但是,当我将其实时推送到服务器上(猜测它是某种Linux)时,它又返回了一个错误,因此我删除了,然后突然工作正常。 作为一种解决方法(因此,我不需要在每次更改代码时都手动更改此代码),我已经尝试过 因为这已经反过来解决了相同的问题()也有同样的问题,但是事实证明它在每个(服务器)

  • 输出 谁能告诉我这里发生了什么?有什么不同?

  • 问题内容: 据我了解,Lombok使用Java的注释处理器来生成其他方法。 与Maven 3.5它完全无需添加任何额外的配置,只需添加dependecy龙目岛,并把一些注解一样,。 但是,如果我在IntelliJ IDEA 2018.2中打开此项目,则生成的吸气剂/设置剂的所有用法都会突出显示为错误。我启用了注释处理,我试图在IntelliJ中构建项目或在Maven中构建,然后在IntelliJ中