3 回答
TA贡献1934条经验 获得超2个赞
以下是React文档所说的内容:
永远不要
this.state
直接变异,因为之后调用setState()可能会替换你所做的变异。把this.state看作是不可变的。
setState()
不会立即改变this.state但会创建一个挂起状态转换。this.state
调用此方法后访问可能会返回现有值。无法保证对setState的调用进行同步操作,并且可以对调用进行批处理以提高性能。
setState()
除非实现条件渲染逻辑,否则将始终触发重新渲染shouldComponentUpdate()
。如果正在使用可变对象并且无法实现逻辑
shouldComponentUpdate()
,则setState()
仅在新状态与先前状态不同时调用将避免不必要的重新呈现。
以设计方式使用API总是明智的。如果文档说不改变你的状态,那么你最好不要改变你的状态。
虽然setState()
技术上可能是异步的,但它肯定不会以任何明显的方式变慢。组件的render()
功能将以非常短的顺序调用。
直接设置状态的一个缺点是阵营的生命周期方法- ,,shouldComponentUpdate()
-依赖于状态转换被调用。如果直接更改状态并使用空对象调用,则无法再实现这些方法。componentWillUpdate()
componentDidUpdate()
setState()
setState()
另一个是它只是糟糕的编程风格。你在两个陈述中做了你可以做的一个。
而且,这里没有实际的好处。在这两种情况下,render()
直到调用setState()
(或forceUpdate()
)之后才会触发。
您声称有必要这样做而不实际解释需要的是什么。也许你想更详细地解决你的问题。可能有更好的解决方案。
最好使用框架而不是框架。
UPDATE
从下面的评论:
需要的是我想在下面使用改变的hasSubmit。
好的我现在明白了。如果您需要立即使用未来的州财产,最好的办法就是将其存储在本地变量中。
const hasSubmit = false;this.setState({ hasSubmit: hasSubmit});if (hasSubmit) { // Code that will use `hasSubmit` ...
TA贡献1875条经验 获得超3个赞
如果要更改状态并通过响应触发重新渲染: 使用第二个代码。
this.setState({ hasSubmit: false, });
第一个代码的问题/错误:
this.state.hasSubmit = false // Updates state directly: // You are not supposed to do this // except in ES6 constructors this.setState({}) // passes an empty state to react. // Triggers re-render without mutating state
添加回答
举报