为啥这被算作变异状态?

Posted

技术标签:

【中文标题】为啥这被算作变异状态?【英文标题】:Why is this counted as mutating state?为什么这被算作变异状态? 【发布时间】:2019-06-01 04:01:17 【问题描述】:
handleClick(event) 
let value = event.target.value;

this.setState( question: (this.state.question += value) );

我收到警告:

不要直接改变状态。使用 setState() 反应/无直接突变状态

如果我尝试使用此代码加载页面。 我该如何解决它,以免它给我这个警告? 它说使用this.setState,但这就是我正在做的。

【问题讨论】:

this.state.question + value 【参考方案1】:

错误就在这里:

this.state.question += value

+= 是用于将右操作数添加到左操作数的运算符。您正在尝试为 this.state.question 增加价值。

正确的做法是:

this.setState(previousState => ( question: previousState.question + value ));

【讨论】:

一般来说是的,不过我建议使用setState 的函数版本,因为它是根据之前的状态进行修改的。像这样的东西:this.setState(state => ( question: state.question + value ));。一旦 Concurrent React 发布,这将变得更加必要。 @Namoz 如果我这样做,那么状态只会更新我按下的最后一个按钮,而不是最后一个按钮。例如(它是一个计算器),当它是 += 时,它会显示我按下的最后一个按钮。当我将其更改为 + 时,它只显示倒数第二个按钮。【参考方案2】:

你正在做一个不必要的assignment addition 到this.state.question - 你只需要在这里添加。此外,当根据之前的值更新状态时,the docs state:

React 可以将多个 setState() 调用批处理到单个更新中以提高性能。因为 this.props 和 this.state 可能会异步更新,所以不应该依赖它们的值来计算下一个状态。

根据前一个值更新状态的正确方法是传入一个更新函数,该函数对前一个值起作用,即:

this.setState(prevState => ( question: prevState.question + value ));

【讨论】:

【参考方案3】:

这被认为是变异状态,因为您在表达式(this.state.question += value) 中为this.state.question 赋值。我已经粘贴了一个代码沙箱链接,您可以查看以了解如何正确实现此行为。

Code Sandbox

【讨论】:

以上是关于为啥这被算作变异状态?的主要内容,如果未能解决你的问题,请参考以下文章

React 的 setState(),嵌套结构的数据变异,为啥不直接修改状态呢?

html 使用深度冻结来测试状态是否发生变异

方法 --> 动作 --> 变异 --> 状态问题

如何在没有变异的情况下更新状态数组中的现有值?

优化求解基于matlab遗传算法结合粒子群算法求解单目标优化问题含Matlab源码 1659期

为啥屏幕旋转 180 度不算作配置更改?