当前位置: 首页 > 面试题库 >

多个setState不会累积到一个更新/渲染中吗?

呼延沈义
2023-03-14
问题内容

我记得当我发现它setState是异步的时,我感到非常惊讶。现在,我偶然发现了一种“怪异”的行为,这种行为不符合我对setState异步性的理解。

考虑下面的代码片段(由于某种原因导致Script Error,这是外部沙箱:https :
//codesandbox.io/s/zwrvkz74y3):

class SomeComponent extends React.Component {

  constructor(props) {

    super(props);

    this.state = {

      prop1: 1,

      prop2: 2

    };



    setTimeout(this.changeProp1.bind(this), 100);

  }



  componentDidUpdate() {

    console.info("componentDidUpdate called");

  }



  changeProp1() {

    this.setState({ prop1: 2 });

    this.changeProp2();

  }



  changeProp2() {

    this.setState({ prop2: 3 });

  }



  render() {

    const { prop1, prop2 } = this.state;

    return React.createElement('div', null, `prop1: ${prop1}, prop2: ${prop2}`);

  }

}



const rootElement = document.getElementById("root");

ReactDOM.render(React.createElement(SomeComponent), rootElement);


<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

如果运行此程序并检查控制台,您将看到该componentDidUpdate调用被两次调用,但是不应该setStates仅一次累积和更新Component吗?

更新 :我认为我的困惑来自ReactJS网站上的“ 状态更新可能是异步的”部分中的这个短语:

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


问题答案:

正如参考资料的链接部分所述,

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

至少在React 16中,它 不应该 批量更新状态。

正如React团队的Dan Abramov在相关答案中所广泛解释的那样,该状态当前仅从事件侦听器中进行批量更新,也可以setState在生命周期挂钩(componentDidMountcomponentDidUpdate)中进行同步调用。预计这将在React17中进行更改。

在React16中,unstable_batchedUpdates应该显式地使用它来无条件地批量更新状态(一个demo):

setTimeout(() => {
  ReactDOM.unstable_batchedUpdates(() => {
    this.changeProp1();
  });
}, 100);


 类似资料:
  • 我在一个应用程序的前端原型上工作,该应用程序具有给定的JS、React和CoreUI4 React技术栈。我来自Python背景,在网络开发和我给定的技术堆栈方面没有太多经验。当我不得不开始使用钩子时,这一点变得很明显。 问题 我真的不明白为什么它不更新我的和/或不渲染。我需要一个条件渲染,我也使用。 我试图: 从我的主应用程序中传递一个更大的状态,一旦我启动条件逻辑(挂钩规则)就无法工作。 当我

  • 尽管试图避免所有记录在案的陷阱,阻止React在状态更改后重新渲染,但我仍然无法解决我的问题: } 从每个长方体组件调用update函数,并触发长方体网格上新颜色的指定。 试图避免常见的错误: 颜色数组只有在通过扩展运算符从状态复制后才被修改 通过setState()传递新数组 此外,我还处理了两个组件中函数的实例绑定 但是,尽管onClick成功触发了状态更改,但不会进行重新渲染。我在这里缺少的

  • 在C 11中是否有可能累积许多s,每个都由给定的函数(其API我不能更改)返回到容器中,而无需复制任何元素? 注意1,即使元素没有move赋值操作符的move构造函数,也不能复制元素,例如示例中的int。因此,您可以移动一块元素(通过复制指针),但不能移动单个元素。 注意2,容器必须允许使用单个迭代器对所有累积元素进行迭代。So<代码>标准::向量 显然,编写一些允许这样做的容器或使用

  • 问题内容: 我正在做一个Flask应用程序。我有一个登录区域,一个博客区域。如果要获取用户的登录名,我将呈现登录模板。但这不会呈现必须显示在登录区域下方的博客模板。 我将尝试使其更加清晰: 现在我有一个扩展它,并进入登录块。我有一个进入。如何同时渲染两者?当我这样做时,我只能在login.html或之一上调用它。 请帮帮我。如果你需要,我会提供更多详细信息。 问题答案: 你可能会以错误的方式考虑布

  • 我试图在if语句中设置状态,但它不会这样做。结果,我需要从if语句中更新状态,在那个里我可以接收经度和纬度坐标,但它不会保存状态。若我在If语句之外的控制台中回显,我将只读取第一个setState值表单componentWillMount。有什么问题吗?我做错了什么?结构如下:

  • 我正在尝试为我的每个d3js元素使用reactjs组件。父组件绘制图形,子组件应在其周围绘制圆环。但是现在渲染函数将它们分开绘制。下面的代码显示了如何将图形svg追加到父组件中(在内部): 以下是父组件渲染函数的代码: 我认为子组件中存在一个问题,我尝试了选择(#容器),但它找不到它。所以我不得不使用将甜甜圈附加到一个单独的div: 我应该如何在子组件中更改它?是否需要更改父渲染函数?