我想更改hasSubmit键的值,就像在“第一个代码”部分中一样。我知道不推荐这样做。但是第二个代码是异步的,我不想使用setState的回调函数。


this.statesetState有什么区别?
有什么方法可以立即更改状态值hasSubmit



  第一个代码:


this.state.hasSubmit = false
this.setState({})
//Code that will use `hasSubmit`.



  第二个代码:


this.setState({
   hasSubmit: false,
});
//Code that will use `hasSubmit`.




加:

该方案是:


  
  hasSubmitfalse中设置getInitialState()
  当我单击hasSubmit按钮时,false将更改为submit
  提交后,hasSubmit将更改为true
  


第一次单击submit没问题,并且hasSubmit将设置为true

但是第二次单击submit使用Second asynchronous code是错误的,因为hasSubmit仍然是true,而First Code可以解决问题。

最佳答案

这是React docs所说的:


  切勿直接更改this.state,因为之后调用setState()可能会替换您所做的更改。将此this.state视为不可变的。
  
  setState()不会立即使this.state突变,而是创建一个挂起的状态转换。调用此方法后访问this.state可能会返回现有值。
  
  无法保证对setState的调用的同步操作,并且可能为提高性能而对调用进行批处理。
  除非在setState()中实现了条件渲染逻辑,否则shouldComponentUpdate()将始终触发重新渲染。
  
  如果正在使用可变对象,并且逻辑不能在shouldComponentUpdate()中实现,则仅当新状态不同于先前状态时调用setState()可以避免不必要的重新渲染。


按照API的设计方式使用API​​总是明智的。如果文档说不改变您的状态,那么最好不要改变您的状态。

尽管setState()从技术上讲可能是异步的,但以任何明显的方式肯定不会慢。该组件的render()函数将在很短的时间内被调用。

直接设置状态的一个缺点是React的生命周期方法-shouldComponentUpdate()componentWillUpdate()componentDidUpdate()-依赖于通过setState()调用的状态转换。如果直接更改状态并用空对象调用setState(),则无法再实现这些方法。

另一个是它只是不好的编程风格。您用两个语句执行的操作可能要执行一次。

而且,这里没有实际的好处。在这两种情况下,直到调用render()(或setState())之后,才会触发forceUpdate()

您声称需要执行此操作,而没有实际解释该需求是什么。也许您想进一步详细说明问题。可能有更好的解决方案。

最好使用框架而不是反对框架。

更新

从下面的评论:


  我需要在下面使用更改后的hasSubmit。


好的我现在明白了。如果您需要立即使用future状态属性,那么最好的选择就是将其存储在局部变量中。

const hasSubmit = false;

this.setState({
  hasSubmit: hasSubmit
});

if (hasSubmit) {
  // Code that will use `hasSubmit` ...

关于javascript - ReactJS中this.state和this.setstate有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42164720/

10-11 22:36
查看更多