新的 React Context API 是否会触发重新渲染?

2023-12-03

我一直在尝试理解新的 React Context API 并正在使用它。我只是想检查一个简单的情况 - 当提供者的数据更新时,所有内容都会重新呈现。

Check Codesandbox 上的这个小例子

所以,在我的例子中,我有一个App组件 - 具有类似这样的状态 -

this.state = {
  number - A random number
  text - A static text
} 

我从这里创建一个新的 React 上下文,其中包含number and text从状态并将值传递给两个消费者Number and Text.

所以我的假设是,如果随机数更新,它将改变上下文,并且两个组件都应该触发重新渲染。

但实际上,该值正在更新,但没有发生重新渲染。

所以,我的问题是——

  1. 更新到的上下文不是通过通常的重新渲染传播的吗?因为当上下文发生变化时,我无法看到我的日志/颜色发生变化。

  2. 该提供者的所有消费者是否都已更新?


更新到的上下文不是通过通常的重新渲染传播的吗?因为当上下文发生变化时,我无法看到我的日志/颜色发生变化。

对上下文值的更新不会触发提供程序的所有子级的重新渲染,而只会触发从 Consumer 内部渲染的组件,因此在您的情况下,尽管 number 组件包含 Consumer,但 Number 组件不会重新渲染,而只是 Consumer 中的渲染函数,因此值会在上下文更新时发生变化。这样它的性能就相当高了,因为它不会触发所有子项的重新渲染。

该提供者的所有消费者是否都已更新?

该 Provider 的所有消费者都将经历一个更新周期,但是否重新渲染由 React 虚拟 DOM 比较决定。您可以在控制台中看到此演示sandbox

EDIT

您需要确保的是,组件被渲染为 ContextProvider 组件的子组件,并且您将处理程序传递给它,而不是内联渲染它们并更新 ContextProvider 的状态,因为这将触发内部所有组件的重新渲染这ContextProvider

高效使用

App.js

  constructor() {
    super();
    this.state = {
      number: Math.random() * 100,
      text: "testing context api"
      updateNumber: this.updateNumber,
    };
  }
  render() {
    return (
      <AppContext.Provider
        value={this.state}
      >
        {this.props.children}
      </AppContext.Provider>
    );
  }

index.js

class Data extends React.Component {
  render() {
    return (
      <div>
        <h1>Welcome to React</h1>
        <Number />
        <Text />
        <TestComp />
        <AppContext.Consumer>
          {({ updateNumber }) => (
            <button onClick={updateNumber}>Change Number </button>
          )}
        </AppContext.Consumer>
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(
  <App>
    <Data />
  </App>,
  rootElement
);

性能使用较少

App.js

class App extends Component {
  constructor() {
    super();
    this.state = {
      number: Math.random() * 100,
      text: "testing context api"
    };
  }

  updateNumber = () => {
    const randomNumber = Math.random() * 100;
    this.setState({ number: randomNumber });
  };

  render() {
    return (
      <AppContext.Provider value={this.state}>
        <div>
          <h1>Welcome to React</h1>
          <Number />
          <Text />
          <TestComp />
          <button onClick={this.updateNumber}>Change Number </button>
        </div>
      </AppContext.Provider>
    );
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新的 React Context API 是否会触发重新渲染? 的相关文章

  • Jqplot 中两个系列数据的不同颜色条

    我想知道如何在 Jqplot 中为两个系列制作不同的颜色条 如果我只有一个系列数据 它的工作原理如下图所示 红色和绿色基于其值 但是 如果我有两个系列数据 我无法为每个系列数据配置两个系列颜色 目前我只能做这个图 我希望两个系列图可以根据其
  • Vue js按钮冻结dom

    我试图在按下按钮时切换包含加载动画的跨度 直到使用 v if 函数完成 但是当我按下按钮时 DOM 冻结并且 span 元素保持不变 直到函数调用结束 如何让 DOM 不冻结并显示加载图标 非阻塞按钮按下可能是一个解决方案 HTML
  • 将参数传递给 jquery 单击事件中的回调函数[重复]

    这个问题在这里已经有答案了 直接进入正题 我有一个 jquery 事件监听器 如下所示 number click printNumber 和一个回调函数 function printNumber number console log num
  • TypeScript 中类和命名空间的区别

    到底有什么区别classes and namespaces在打字稿中 我知道 如果您创建一个带有静态方法的类 您可以在不实例化该类的情况下访问它们 这正是我猜想的命名空间的要点之一 我还知道你可以创建多个同名的命名空间 并且它们的方法在编译
  • 赋予 d3 序数轴标签与尺度名称不同

    我有一个序数scale具有不同值的某些标签 我想显示该比例的轴 其中轴标签与比例标签不同 我有这个代码 var width 1000 var height 600 var margins left 100 40 right 25 botto
  • Material UI 切换按钮 - 选择时无法更改背景颜色

    我正在尝试使用类似于单选按钮的 Material UI 切换按钮 为用户提供针对给定问题的 2 个选择 它的功能基本符合预期 但是当尝试调整选择每个切换按钮时的样式时 我无法更改切换按钮的背景颜色 我在 ToggleButton 组件上使用
  • jQuery UI 对话框使用 setTimeout 自动关闭

    我试图让对话框在打开后三秒自动关闭 我尝试过以下方法 setTimeout mydialog dialog close 3000 这是在上下文中 acknowledged dialog dialog height 140 modal tru
  • 通过电子邮件发送在 HTML5 画布上创建的图像

    我有一个画布 用户可以通过交互来更改设计 现在 用户完成更改后 可以提交他的设计及其电子邮件 ID 但为了提交设计 我使用以下方法将画布转换为图像http www nihilogic dk labs canvas2image http ww
  • Google Maps JS Api - b.get 不是函数错误(isLocationOnEdge)

    我想检查我的路线上是否有标记 所以我尝试使用 isLocationOnEdge 但收到 TypeError b get 不是函数 错误 这是我的代码 我尝试了几次更改但无法解决问题 var directionsDisplay new goo
  • jQuery live() 和ready() 之间的区别?

    两者之间的确切区别是什么live and ready 编辑 发现die http docs jquery com Events die是相反的live ready http docs jquery com Events ready让你注册一
  • Flot 0.8.2 折线图 - 颜色错误

    我正在使用 Flot 折线图并设置它们的颜色 我发现了一个奇怪的错误 在前 3 种颜色之后 绘图对所有其他线条使用最后一种颜色 这不是正确的行为 更有趣的是图例显示了正确的颜色 这是一个已知的错误 var dataSet label d1
  • NodeJS 中的缩进多行日志记录

    我要打印JSON stringify d 反对控制台 将上下文作为 Mocha 测试套件输出的一部分 当测试缩进时 我希望对象日志行向右缩进足够远 例如 3 4 个制表符空格 以便它们可以识别地位于右侧describe group 我怎样才
  • 如何在 Astro 中的组件之间共享状态?

    我相信我在代码中采用了错误的方法 如何在按钮单击中设置客户端首选项 该按钮单击用作全局 astro 组件中的道具 或者我应该怎么做 我知道这是可能的 因为 astro js 本身在他们的文档网站中这样做了 下面是我的尝试的解释 我目前正在开
  • router.navigate 使用查询参数 Angular 5

    我在使用查询参数路由到路由时遇到问题我有一个像这样的函数 goToLink link this router navigate link split 0 queryParams this sortParams link 和这个功能 sort
  • 在 HTML5 画布上创建颜色选择器

    如何在 HTML5 画布上绘制颜色选择器 一个基本的例子是使用getImageData http jsfiddle net eGjak 60 http jsfiddle net eGjak 60 var ctx cv get 0 getCo
  • jVectorMap - 向下钻取地图 - 自定义背景

    我正在使用 jVectorMap 中的向下钻取地图 并且尝试将自定义背景颜色设置为地图的第二层 为了自定义主级别 我使用 main 参数 但我不知道如何将其扩展到地图的较低级别 提前致谢 马切伊 None
  • Webpack:如何使用动态捆绑组合两个完全独立的捆绑包

    我花了很多时间研究这个问题 但毫无结果 我知道代码分割和动态捆绑在 Webpack 中如何使用import承诺API 然而 我的用例是我有两个完全独立的包 使用不同的 webpack 版本分别生成 为了给您提供视角 我正在构建 React
  • 网页执行回发时如何停止在注册表单上?

    我正在做我的最后一年的项目 其中 我在一页上有登录和注册表单 WebForm 当用户点击锚点时Sign Up下拉菜单ddlType 隐藏 和文本框 txtCustName txtEmail and txtConfirmPassword 显示
  • 如何制作饼图聚合数据源?

    Using 适用于 ASP NET MVC 的 Kendo UI 完整版 http www kendoui com 版本 2013 3 1119 2013年11月20日 如果我有这段代码 status chart kendoChart da
  • ES6解构对象赋值函数参数默认值

    您好 我正在查看在传递函数参数时使用对象解构的示例对象解构演示 https developer mozilla org en US docs Web JavaScript Reference Operators Destructuring

随机推荐

  • Android ListView ArrayList 上的空指针异常

    我有一个显示数组列表内容的列表视图 我正在使用一个简单的适配器来实现这一点 就像这样 public static ArrayList
  • Docker 使用 Java 实现两个容器之间的通信

    有两个java文件 Server java和Client java 两者都在单独的容器中 码头工人文件 我用于服务器的 dockerfile 在名为 服务器 的文件夹中 是 FROM java 8 COPY Server java RUN
  • 会话过期后从数据库中删除它吗?

    这可能是一个愚蠢的问题 但我想知道每 15 分钟从数据库中删除所有过期的 会话 是否是一个好主意 或者只是把它留在那里 会话在 X 分钟后过期 不再有用 似乎只是占用空间 当我的团队在 NET 应用程序中部署 SQL Server 会话状态
  • 使用 NSGlyph 和内存分配

    在跟踪换行符的方法中频繁地 for a NSTextView visibleRect 我正在分配内存NSGlyph to use NS布局管理器 getGlyphs range 我应该 可以找出这应该有多少内存 因为我有范围的参考 不影响布
  • FindAll 包含涉及复杂的多对多关系 (sequelizejs)

    这有软件工程 SE 中的一个兄弟问题 考虑Company Product and Person 之间存在多对多的关系Company and Product 通过联结表Company Product 因为给定的公司可能生产不止一种产品 例如
  • init_fs_encoding:无法获取文件系统编码的Python编解码器

    我正在 apache 上运行 Django 网站 这是我的尾巴httpd conf file ServerName 127 0 0 1 8080 Django Project LoadFile c python39 python39 dll
  • 在 Linux 上使用可滚动 x(时间/水平)轴绘制数据

    我想绘制 x 轴较长的数据 如果我绘制整个 x 轴 那么绘图就会缩小并且几乎无法读取 我发现了this回答 SO 指向下列的scipy matplotlib 代码 但是当我尝试运行上述代码时 出现以下错误 Traceback most re
  • Java-不透明颜色

    我正在尝试画一些线 问题在于颜色 例如 我有几条红色线 然后我画了一条蓝色线 或相反 有时 对于最后一个来说 那条线更多 是不透明的 我尝试制作新颜色并使用 alpha 复合 0 7 设置颜色 对于更多线条 我保留默认的一种颜色 不透明 a
  • 如何使用 iOS 获取 UIKeyboard 大小

    有没有办法以编程方式获取 UIKeyboard 大小 横向高度为 216 0f 高度为 162 0f 以下似乎已被弃用 有没有某种方法可以在 3 0 iPhone OS SDK 和 4 0 iPhone OS SDK 中没有任何警告的情况下
  • 在Python中动态定义/更新ctypes结构

    我已经在 ctypes 中创建了子结构和结构 如下所示 我在结构内部定义了具有某种预定义大小的子结构数组 根据要求SIZE可以设置为0最初 可能会根据用户输入而变化 from ctypes import class MySubStructu
  • 使用回调将 C 库 (GSL) 包装在 cython 代码中

    我是新手cython and c 我想使用 cython 来加快代码的性能 我想用gsl integration我的代码中的库用于集成 更新 test gsl pyx cdef extern from math h double log d
  • 如何在Android中每分钟获取gps坐标?

    我想每分钟获取我的坐标 即使用户没有移动 所以我使用 requestLocationUpdates 和以下参数 locMgr requestLocationUpdates LocationManager GPS PROVIDER 60000
  • NSMutableArray 内的块泄漏 (ARC)

    我有一些在块内的操作 此操作 仅更新一个UIImage像这样 UIImage image self myImage image 我的图像是通过访问互联网来计算的NSURLConnection 当我从互联网上收到图像时 我称该块为NSMuta
  • 如何优化在 postgresql 中查询这些数据?

    我的查询对于特定行来说速度很慢 Postgres 选择做一个Seq Scan而不是使用Index Scan对于某些行 我认为是因为它实际上比使用索引更快 以下是针对正常工作负载使用索引的查询计划 http explain depesz co
  • 高效构建FEM/FVM矩阵

    这是 FEM FVM 方程系统的典型用例 因此可能会引起更广泛的兴趣 从三角形网格 la 我想创建一个scipy sparse csr matrix 矩阵行 列表示网格节点处的值 该矩阵在主对角线上以及两个节点通过边连接的地方都有条目 这是
  • 本地化 MPMoviePlayerViewController 的“完成”按钮

    我正在使用 MPMoviePlayerViewController 来呈现视频 一切都按预期工作 但如果我将设备的语言切换为例如德语 完成 按钮未本地化 我尝试访问该按钮并将其设置为我自己的按钮实现 如下所示 MPMoviePlayerVi
  • 使 openGL 线连接起来

    现在我创建了一个多边形 然后我做了同样的事情 但使用 line loop 来绘制轮廓 我现在的问题是 如果我将线条粗细设置为高 则线条不会连接 它们的末端需要更长 线宽 有没有办法解决这个问题 Thanks glMatrixMode GL
  • Rails 条件验证

    所以我这里有两个模型 class Screen lt ActiveRecord Base belongs to user validates screen size numericality gt less than or equal to
  • 在 c 可执行文件中运行数据 shellcode

    我正在研究这个c 程序 我在 64 位 x64 linux 上用 gcc 编译它 include
  • 新的 React Context API 是否会触发重新渲染?

    我一直在尝试理解新的 React Context API 并正在使用它 我只是想检查一个简单的情况 当提供者的数据更新时 所有内容都会重新呈现 Check Codesandbox 上的这个小例子 所以 在我的例子中 我有一个App组件 具有