Qui*_*der 10 javascript setstate reactjs
我在这篇官方文章中读过以下这些文章:
this.props并且this.state可以异步更新,您不应该依赖它们的值来计算下一个状态.
任何人都可以通过举例说明以下代码试图实现的内容.
this.setState((prevState, props) => ({
couter: prevState.counter + props.increment
}));
Run Code Online (Sandbox Code Playgroud)
Bru*_*rdo 25
他们说你应该这样做而不是下面的例子.
// Wrong
this.setState({
counter: this.state.counter + this.props.increment,
});
Run Code Online (Sandbox Code Playgroud)
如果你这样访问,他们无法保证状态将具有正确的值因为setState()将异步发生,可能会发生其他更新并更改值.如果你要根据以前的状态计算状态,你必须确保你有最后一个和最新的值,所以他们让setState()接受一个用prevState和props调用的函数,所以你可以具有更新状态的正确值,如下例所示.
// Correct
this.setState((prevState, props) => ({
counter: prevState.counter + props.increment
}));
Run Code Online (Sandbox Code Playgroud)
小智 5
根据之前的状态更新状态
\n假设年龄是 42 岁。该处理程序调用 setAge(age + 1) 三次:
\nfunction handleClick() {\n setAge(age + 1); // setAge(42 + 1)\n setAge(age + 1); // setAge(42 + 1)\n setAge(age + 1); // setAge(42 + 1)\n}\nRun Code Online (Sandbox Code Playgroud)\n然而,一点击,年龄就只有43岁,而不是45岁!这是因为调用 set 函数不会更新已运行代码中的年龄状态变量。因此,每个 setAge(age + 1) 调用都会变成 setAge(43)。
\n要解决此问题,您可以将更新程序函数传递给 setAge 而不是下一个状态:
\nfunction handleClick() {\n setAge(a => a + 1); // setAge(42 => 43)\n setAge(a => a + 1); // setAge(43 => 44)\n setAge(a => a + 1); // setAge(44 => 45)\n}\nRun Code Online (Sandbox Code Playgroud)\n这a => a + 1是您的更新程序功能。它获取待处理状态并从中计算下一个状态。
React 将您的更新器函数放入队列中。然后,在下一次渲染期间,它将以相同的顺序调用它们:
\na => a + 1将接收 42 作为待处理状态并返回 43 作为下一个状态。
a => a + 1将接收 43 作为待处理状态并返回 44 作为下一个状态。
a => a + 1将接收 44 作为待处理状态,并返回 45 作为下一个状态。\n没有其他排队更新,因此 React 最终将存储 45 作为当前状态。
按照惯例,通常将挂起状态参数命名为状态变量名称的第一个字母,例如 forage。不过,您也可以将其称为 prevAge 或您认为更清晰的其他名称。
\nReact 可能会在开发过程中调用您的更新程序两次以验证它们是否纯净。
\n| 归档时间: |
|
| 查看次数: |
9641 次 |
| 最近记录: |