ReactJS中this.state和this.setstate的区别是什么?
我想要改变hasSubmit
键的值,就像在First Code部分一样。 我知道这不是build议。 但第二个代码是asynchronous的,我不想使用setState
的callback函数。
-
this.state
和setState
什么区别? - 有没有办法改变状态值立即
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`.
加:
情况是这样的:
hasSubmit
在getInitialState()
设置为false
。- 当我点击
submit
button时,hasSubmit
会变成false
。- 提交时,
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
,如官方反应文档中所述。