ReactJS中this.state和this.setstate的区别是什么?

我想要改变hasSubmit键的值,就像在First Code部分一样。 我知道这不是build议。 但第二个代码是asynchronous的,我不想使用setState的callback函数。

  • this.statesetState什么区别?
  • 有没有办法改变状态值立即hasSubmit

第一个代码: this.state.hasSubmit = false this.setState({}) //Code that will use `hasSubmit`.

第二个代码: this.setState({ hasSubmit: false, }); //Code that will use `hasSubmit`. this.setState({ hasSubmit: false, }); //Code that will use `hasSubmit`.


加:

情况是这样的:

  1. hasSubmitgetInitialState()设置为false
  2. 当我点击submitbutton时, hasSubmit会变成false
  3. 提交时, hasSubmit将变为true

首先点击submit没有问题,并已submit设置为true

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

以下是React文档的内容 :

切勿直接改变this.state ,因为之后调用setState()可能会取代你所做的变异。 把这个状态看作是不可变的。

setState()不会立即改变this.state,但会创build一个挂起的状态转换。 调用此方法后访问this.state可能会返回现有的值。

无法保证setState调用的同步操作,并且调用可能会批处理以提高性能。 setState()将始终触发重新呈现,除非在shouldComponentUpdate()实现了条件呈现逻辑。

如果正在使用可变对象,并且在shouldComponentUpdate()shouldComponentUpdate()逻辑, shouldComponentUpdate()只有在新状态与先前状态不同时调用setState()才能避免不必要的重新呈现。

以他们devise的方式使用API​​总是明智的。 如果文档说不改变你的状态,那么你最好不要改变你的状态。

虽然setState()在技​​术上可能是asynchronous的,但是显然不是很慢。 该组件的render()函数将以非常短的顺序被调用。

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

另一个是,这只是糟糕的编程风格。 你做了两个陈述,你可以在一个做什么。

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

你声称需要这样做,而没有真正解释需要什么。 也许你想更详细地描述你的问题。 可能有更好的解决scheme。

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

UPDATE

从下面的评论:

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

好的我现在明白了。 如果您需要立即使用未来的州财产,最好的办法就是将其存储在本地variables中。

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

您不应该忽略文档build议。 在写本文的时候,setState允许第二个参数是setState和re-render完成时的callback函数。 既然你从不向我们提供你的代码如何使用hasSubmit值,我相信其他人可能会发现这有用,当他们想确保hasSubmit已被改变。

您应该在第一个示例中使用this.forceUpdate()来强制更新状态。 例如:

 this.state.hasSubmit = false; this.forceUpdate(); 

但是使用this.setState会更好,因为它是React引擎的init本机检查状态this.setState ,它比强制更新更好。

如果你只是直接更新任何参数this.state没有setState反应渲染this.state不会知道一些参数的状态更新。

this.setState维护反应组件的生命周期,似乎并不像变异variables(即使在内部它确实是变异状态)。 所以反应循环中的单向stream动保持无任何副作用。

需要注意的是使用this.setState不能在ES6类中的构造函数中使用。 我们需要在ES6构造函数中使用this.state = pattern而不是this.setState

如果你想改变状态并通过反应触发重新渲染:

使用第二个代码BTW:这段代码不使用setStatecallback

  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 

如果您想在不触发重新渲染的情况下更改状态将第二个代码放在componentWillReceiveProps ,如官方反应文档中所述。