React:为啥我的上下文值没有更新?

Posted

技术标签:

【中文标题】React:为啥我的上下文值没有更新?【英文标题】:React: Why isn't my context value updated?React:为什么我的上下文值没有更新? 【发布时间】:2021-04-06 07:38:42 【问题描述】:

我正在使用 React Context API。我创建了一个简单的组件:

import React,  createContext, useContext  from 'react';

const MyContext = createContext(1);

const MyComponent = () => (
    <>
        <p>useContext(MyContext)</p>
        <MyContext.Provider value=2>
            <p>useContext(MyContext)</p>
        </MyContext.Provider>
    </>
);

export default MyComponent;

我收到了两个&lt;p&gt;1&lt;/p&gt;。为什么第二个上下文没有更新为2?我是否错误地使用了useContext()

【问题讨论】:

【参考方案1】:

您必须使用单独的组件才能使 Context 正常工作。

我已经提交了一个关于这个的错误;见https://github.com/facebook/react/issues/18629

只需使用 Context 将代码拆分为不同的组件。

const Inner = () => (
    <p>useContext(MyContext)</p>
);

const MyComponent = () => (
    <>
        <p>useContext(MyContext)</p>
        <MyContext.Provider value=2>
            <Inner />
        </MyContext.Provider>
    </>
);

这应该可以解决它。

【讨论】:

谢谢!我过去使用过 Context 并且没有任何问题。我现在正在尝试更好地理解它,我很惊讶我的例子没有按预期工作。我同意这似乎是一个错误! 我也有同样的感觉。浪费了大量时间试图找出原因。但是,如果我们的主和救主丹·阿布拉莫夫不认为这是一个错误,那么它不是。 (但是,请随意通过在问题中添加 +1 来向 Dan 施压,或在此处链接此 SO 问题) 嗯,React 中有更多令人困惑的东西,所以我猜这是设计使然 :D【参考方案2】:

您需要在上下文提供程序中渲染另一个组件以获得 2 的值。正如useContext 的文档所述:

接受一个上下文对象(从 React.createContext 返回的值)并返回该上下文的当前上下文值。当前上下文值由树中调用组件上方最近的 的 value prop 确定。

添加了重点。重要的一点是,在组件内调用 useContext 的位置并不重要 - 重要的是调用它的组件在树中的位置。

import React,  createContext, useContext  from "react";

const MyContext = createContext(1);

const ChildComponent = () => (
  <p>useContext(MyContext)</p>
)

const MyComponent = () => (
  <>
      <p>useContext(MyContext)</p>
      <MyContext.Provider value=2>
        <ChildComponent/>
      </MyContext.Provider>
  </>
);

export default MyComponent;

【讨论】:

很惊讶我在这里得到了接受,喜欢你在文档中的引用。

以上是关于React:为啥我的上下文值没有更新?的主要内容,如果未能解决你的问题,请参考以下文章

为啥当我使用 React 钩子和 React 上下文添加新帖子时,我的状态会替换我的帖子

从类组件更新 Reacts 上下文值

为啥 `useContext` 不重新渲染我的组件?

在 React 上下文中更新嵌套状态的最佳方法

上下文 API 中的 React useState 值始终使用初始值而不是更新值

React Native:在开玩笑的单元测试中更新上下文 api 值