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

在React componentDidUpdate中,道具和状态是否可以同时更改?

刘成礼
2023-03-14

在react组件中,通常不应在其中变异道具。此外,家长只能更改道具,不能直接更改状态。基于这两个事实,假设在任何componentDidUpdate调用中,例如。,

只读

这道具可能与prevProps不同,或者与此不同。状态可能与状态不同,但这两种情况不能同时发生?

共有2个答案

龙飞
2023-03-14

是的,实际上以下代码有时会输出true(取决于上下文)。

componentDidUpdate(prevProps, prevState) {
    const bothChanged = (prevProps !== this.props) && (prevState !== this.state);
    console.log(bothChanged);  // "true" (sometimes)
}
杭英杰
2023-03-14

从react文档:

React可以将多个setState()调用批处理到一个更新中以提高性能。

因此,基于这一点,我的最佳猜测是,出于性能原因,React可能会将道具和状态更新组合在一起,只执行一次更新,而不是两次更新。所以要回答你的问题:

这道具可能与prevProps不同,或者与此不同。状态可能与prevState不同,但这两种情况不能同时发生?

我认为这实际上可能会像前面所说的那样发生——出于性能原因。

 类似资料:
  • 我是新手,基本上我正在尝试立即更新父组件的状态及其子组件(和)道具。当前仅更新父组件的状态。我会一步一步地解释清楚。 这里我有一个父组件 这个组件有两个对象数组(和),分别作为道具发送到和组件。接收selectedPlayer和setSseltedPlayer。两个组件都有一个组件和一个选择输入。在组件中,用户将选择一个团队,他们将显示所选团队的球员,而在组件中,将选择一个球员,他们将显示选中的玩

  • 我有问题的反应形式和管理的状态适当。我在一个表单中有一个时间输入字段(在一个模态中)。初始值在中设置为状态变量,并从父组件传入。这本身就很好用。 当我想通过父组件更新默认的start_time值时,问题就来了。更新本身通过在父组件中发生。但是,在我的表单中,默认的start_time值从不更改,因为它只在中定义过一次。 我尝试使用通过强制更改状态,这确实起到了作用,但给了我错误。 所以我的问题是,

  • 问题内容: 的 多重嵌套视图 功能非常好-您可以轻松地从应用程序的一种 状态 跳到另一种 状态 。 有时您可能想更改URL,但有时不需要。我觉得 状态 的概念应该与 route 分开/可选。 这是一个说明我意思的朋克。 这是文档中的一个小工具的分支,下面有2个小更改: 这似乎可行-URL保持不变。同样,这里做了多少多余的工作?这是经过批准/测试的用法吗? 如果您可以省略某个州的信息,那就太好了。

  • 问题内容: 我在使用React表单和正确管理状态时遇到麻烦。我有一个形式为模式的时间输入字段。初始值在中设置为状态变量,并从父组件传递。这本身工作正常。 当我想通过父组件更新默认的start_time值时,就会出现问题。更新本身通过发生在父组件中。但是在我的表单中,默认的start_time值从不更改,因为它仅在中定义一次。 我尝试过通过强制进行状态更改,该更改确实有效,但给了我错误。 所以我的问

  • 我试图了解如何构建具有不同"页面"或"视图"的ReactJS应用程序。 我将以下组件作为我的基础应用程序,并且我正在React状态中使用currentState属性在视图中的活动组件之间切换。 它执行此任务,但在启动dataLoaded回调时,组件从不接收更新的recipes数组。 如何根据应用程序中的更新状态更新道具? 还是我处理这整件事的方式错了?

  • 在父组件中: 我有一个布尔状态: 我将其发送到子组件: 根据布尔值,我希望它呈现不同的组件。