reactjs / reactjs/react.dev

Confusing setState() documentation

未关闭
#715 8 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

主要语言
JavaScript
星标
11.8k
派生
7.9k
平均合并
1 天 11 小时
30 天内合并 PR
11

描述

I have a general question about setState() because the documentation about this is a little bit confusing:

I have a component with a state. This state should only be updated (re-rendered) when a condition met. If not then there is no need to re-render the component. Reading the docs about setState tells me that reading this.state right after calling setState() is a potential pitfall. Instead I should use setState with an updater function because there prevState is guaranteed to has the right value. So my first approach was:

class MyComponent extends React.Component {
  onSomething = () => {
    this.setState(prevState => {
      if (prevState.counter < 10) {
        return { counter: prevState.counter + 1 };
      }
      return prevState;
    });
  }
}

But with that approach my component always get re-rendered because setState() always forces a re-render (in the beginning I thought that when I return the same prevState object React does nothing. But I was wrong). So what else can I do to avoid re-rendering?

Again in the same doc we can read that calling setState() only when the new state differs from the previous state will avoid unnecessary re-renders. So I could re-write my code into following:

class MyComponent extends React.Component {
  onSomething = () => {
    if (this.state.counter < 10) {
      this.setState(prevState => {
        return { counter: prevState.counter + 1 };
      });
    }
  }
}

But then if (this.state.counter < 10) could have a different value than prevState.counter

So on the one side the docs recommend to not read from this.state directly because the calls to setState() could be batched and this.state has an outdated value but on the other side it recommends to call setState() only when the new state differs from the old state. But how can I check if the state differs when it could be potentially outdated?

In the end I don't know actually how to set my state and avoid a re-rerender when a condition met. Any help here would be great.

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

先查看链接的 setState() 文档和此 issue 中的示例,然后核实其中如何描述 updater 函数、批处理和重新渲染。当文档清楚地解决了表面上的矛盾,并解释如何在条件满足时避免不必要的重新渲染时,即视为完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
javascript, react
领域
documentation
Issue 类型
文档
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
需要澄清
新手友好度
35/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。