如何使用 useContext 更改 Context 的值?

2024-01-04

使用useContextReact 16.8+ 的 hook 效果很好。您可以创建组件、使用挂钩并利用上下文值,不会出现任何问题。

我不确定如何将更改应用于上下文提供程序值。

1) useContext 钩子严格来说是消费上下文值的一种手段吗?

2)是否有推荐的方法,使用React hooks来更新子组件的值,然后这将触发使用react hooks的任何组件的组件重新渲染useContext与这个上下文挂钩吗?

const ThemeContext = React.createContext({
  style: 'light',
  visible: true
});

function Content() {
  const { style, visible } = React.useContext(ThemeContext);

  const handleClick = () => {
    // change the context values to
    // style: 'dark'
    // visible: false
  }

  return (
    <div>
      <p>
        The theme is <em>{style}</em> and state of visibility is 
        <em> {visible.toString()}</em>
      </p>
      <button onClick={handleClick}>Change Theme</button>
    </div>
  )
};

function App() {
  return <Content />
};

const rootElement = document.getElementById('root');
ReactDOM.render(<App />, rootElement);
<div id="root"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.2/umd/react-dom.production.min.js"></script>

如何使用钩子更新上下文在如何避免向下传递回调? https://reactjs.org/docs/hooks-faq.html#how-to-avoid-passing-callbacks-downHooks 常见问题解答的一部分。

参数传递给createContext仅当组件使用时才会是默认值useContext has no Provider在它上面,在树上。您可以改为创建一个Provider供应的style and visibility以及切换它们的功能。

Example

const { createContext, useContext, useState } = React;

const ThemeContext = createContext(null);

function Content() {
  const { style, visible, toggleStyle, toggleVisible } = useContext(
    ThemeContext
  );

  return (
    <div>
      <p>
        The theme is <em>{style}</em> and state of visibility is
        <em> {visible.toString()}</em>
      </p>
      <button onClick={toggleStyle}>Change Theme</button>
      <button onClick={toggleVisible}>Change Visibility</button>
    </div>
  );
}

function App() {
  const [style, setStyle] = useState("light");
  const [visible, setVisible] = useState(true);

  function toggleStyle() {
    setStyle(style => (style === "light" ? "dark" : "light"));
  }
  function toggleVisible() {
    setVisible(visible => !visible);
  }

  return (
    <ThemeContext.Provider
      value={{ style, visible, toggleStyle, toggleVisible }}
    >
      <Content />
    </ThemeContext.Provider>
  );
}

ReactDOM.render(<App />, document.getElementById("root"));
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

<div id="root"></div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 useContext 更改 Context 的值? 的相关文章

随机推荐

  • 如何返回 NSJsonSerialization

    首先 我对 Objective C 一无所知 也就是说 以下代码应该从中获取数据异步存储 我已经做了类似的事情Android https stackoverflow com questions 48151030 how to read as
  • 使用 System.Drawing 编辑多页 TIFF 图像

    我试图通过从图像创建图形来编辑多页 tiff 但遇到了错误消息 无法从具有索引像素格式的图像创建 Graphics 对象 如何编辑多页 tiff 我写了一些东西来从多页 tiff 文件中提取单页 Load as Bitmap using B
  • Angular 多个 http post 请求给我错误:“net::ERR_INSUFFICIENT_RESOURCES”

    我正在导入一个 xlsx 文件 其中有 6000 个客户 我正在尝试循环客户并创建一个http post请求每个客户 但我收到此错误 net ERR INSUFFICIENT RESOURCES 我怎样才能插入这些客户 它们需要通过我的后端
  • React-router-dom useHistory() 不起作用

    The 使用历史记录 钩子在我的项目中不起作用 我把它放在不同的组件中 但它们都不起作用 我正在使用 react router dom 5 2 0 import useHistory from react router dom const
  • 在python中查找列表内的子列表

    我有一个数字列表 l 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  • 删除 JTable 中的单元格编辑器边框 (Windows LaF)

    我有一个基于 JTextField 的单元格编辑器 带有这个丑陋的黑色边框 忽略左侧的插入符号 有没有办法将其删除 使其看起来与此类似 创建表后 您可以尝试以下操作 DefaultCellEditor editor DefaultCellE
  • 如何制作复杂列表的完全非共享副本? (深拷贝是不够的)

    看一下这段 Python 代码 a 1 2 3 b 4 5 6 c a b b a 1 2 3 4 5 6 4 5 6 1 2 3 c 0 0 append 99 1 2 3 99 4 5 6 4 5 6 1 2 3 99 注意如何修改一个
  • 如何将 bean 注入 Spring Condition 类?

    我正在定义条件 稍后我将检查这些条件以动态加载我的服务接口的两个实现之一 Component public class IsPolicyEnabled implements Condition Autowired private MyPro
  • 如果可以构造 HttpContext 为什么要模拟它呢?

    我一直在 ASP NET 中以某种方式伪造 模拟 存根 HttpContext 在 ASP NET MVC MonoRail 中更容易 但我可以看到 HttpContext 本身可以轻松构建 只需几行代码即可 var tw new Stri
  • 我可以通过计算表达式来确定并可能设置为 null 的属性吗?

    我有一个服务 它接受一个对象 并根据其中的属性执行不同的操作 这样 这些属性中的任何一个都可以为 null 这意味着不执行此操作 我正在尝试创建一个非常简单易用的 API 来在某些属性可能深达多个级别的情况下执行此操作 这是当前实现的示例
  • 错误“命名空间不直接包含字段或方法等成员”

    我正在尝试构建我的 C 项目 但收到错误消息 命名空间不直接包含字段或方法等成员 它标记了 app config 文件的第一个字符 小于号 我检查了所有文件 查找命名空间内直接存在变量或函数的位置 但什么也没发现 app config 看起
  • 如何在 Django 中用 None 保存 FileField?

    我有带有 Avatar 字段的模型配置文件 使用 FileField class Profile models Model avatar models FileField Uploaded avatar of profile storage
  • 查找文件中包含重复字符的行

    我需要一些帮助来查找文本文件中包含重复字符的行 我更喜欢使用 bash 但任何其他方法都可以 一个小例子只是为了让事情变得清楚 文件 txt 1234 11234 abcd 12234 ab321 1233 zs11w 12w2 所需的输出
  • 这两种算法的结果有区别吗?

    这两种算法用于检查有效的会员号码 第一个是公司给我的 第二个是我设计的 从我的测试中我看不出它们在功能上有任何区别 有没有任何情况下任何人都可以看到他们会返回不同的输出 test input 6014355021355010 or 6014
  • 使用适用于 Amazon S3 存储桶的 Java SDK 下载大量文件

    我有大量文件需要从 S3 存储桶下载 我的问题类似于本文 https stackoverflow com questions 1051275 downloading a large number of files from s3除非我想用
  • UIWebView背景颜色

    我正在将 HTML 字符串加载到 UIWebView 中 以便能够查看富文本 到目前为止 一切都很好 但我有一个小问题 在我的 Nib 文件中 我将背景属性设置为绿色 然而 当它显示时 背景是白色的 然后 在类文件中 我添加了以下内容 my
  • Django 外键查询最佳实践

    模型 py class Category models Model name models CharField max length 50 class SubCatergory models Model parent category mo
  • Plotly:并排图之间的 shareX

    我想要两个并排的图共享相同的 X 轴和相同的工具栏 这意味着 通过放大第一个图 第二个图应自动调整大小到相同的缩放区域 一种方法是将图堆叠在另一个之上 使用shareX TRUE 但我需要他们并排 在 python 中似乎有一种方法可以做到
  • 便宜又令人愉快的 rand() 替换

    在对大型游戏程序进行分析后 我发现库函数 rand 消耗了总处理时间的相当一部分 我对随机数生成器的要求不是很繁重 它是否通过大量纯随机性统计测试并不重要 我只是想要一些便宜又令人愉快而且速度非常快的东西 有什么建议么 很少有常用的算法比L
  • 如何使用 useContext 更改 Context 的值?

    使用useContextReact 16 8 的 hook 效果很好 您可以创建组件 使用挂钩并利用上下文值 不会出现任何问题 我不确定如何将更改应用于上下文提供程序值 1 useContext 钩子严格来说是消费上下文值的一种手段吗 2