这个.state和this.setstate在ReactJS中有什么区别
What the difference of this.state and this.setstate in ReactJS?
我想更改hasSubmit
键的值,就像在"第一个代码"部分中一样。我知道不建议这样做。但是第二个代码是异步的,我不想使用 setState
的回调函数。
this.state
和setState
有什么区别?- 有没有办法立即更改状态值
hasSubmit
?
第一个代码:
this.state.hasSubmit = false
this.setState({})
//Code that will use `hasSubmit`.
第二个代码:
this.setState({
hasSubmit: false,
});
//Code that will use `hasSubmit`.
加:
场景是:
hasSubmit
getInitialState()
false
设置。- 当我单击
hasSubmit
按钮时submit
将更改为false
。- 提交后,
hasSubmit
将更改为true
。
第一次单击submit
没有问题,hasSubmit
将设置为 true
。
但是第二次点击submit
使用Second asynchronous code
会出错,因为hasSubmit
仍然是true
,而First Code
可以解决问题。
以下是 React 文档的内容:
切勿直接
this.state
突变,因为之后调用 setState() 可能会替换您所做的突变。将 this.state 视为不可变的。
setState()
不会立即改变 this.state,而是创建一个挂起的状态转换。调用此方法后访问this.state
可能会返回现有值。无法保证对 setState 的调用的同步操作,并且可以对调用进行批处理以提高性能。
setState()
将始终触发重新渲染,除非在shouldComponentUpdate()
中实现了条件渲染逻辑。如果使用可变对象并且逻辑无法在
shouldComponentUpdate()
中实现,则仅在新状态与先前状态不同时才调用setState()
将避免不必要的重新渲染。
以设计的方式使用 API 总是明智的。如果文档说不要改变你的状态,那么你最好不要改变你的状态。
虽然setState()
可能在技术上是异步的,但它肯定不会以任何明显的方式变慢。组件的render()
函数将在很短的时间内被调用。
直接设置状态的一个缺点是 React 的生命周期方法 - shouldComponentUpdate()
、componentWillUpdate()
、componentDidUpdate()
- 依赖于使用 setState()
调用的状态转换。如果直接更改状态并使用空对象调用setState()
,则无法再实现这些方法。
另一个是它只是糟糕的编程风格。你在两个语句中做了你可以在一个语句中做的事情。
此外,这里没有实际的好处。在这两种情况下,render()
直到调用setState()
(或forceUpdate()
)之后才会被触发。
你声称需要这样做,而没有实际解释这种需求是什么。也许您想更详细地说明您的问题。可能有更好的解决方案。
最好使用框架而不是反对它。
更新
从下面的评论:
需要的是我想在下面使用更改后的hasSubmit。
好的,我现在明白了。如果需要立即使用 future state 属性,最好的办法是将其存储在局部变量中。
const hasSubmit = false;
this.setState({
hasSubmit: hasSubmit
});
if (hasSubmit) {
// Code that will use `hasSubmit` ...
如果你想改变状态并通过 react 触发重新渲染:使用第二个代码。
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
this.setState
维护 react 组件的生命周期,看起来不像变异变量(即使它在内部确实变异状态)。因此,反应循环中的单向流动得以维持,没有任何副作用。
需要注意的是,使用 this.setState
不适用于 ES6 类中的构造函数。我们需要在 ES6 构造函数中使用this.state =
模式而不是this.setState
您永远不应该忽略文档建议。在撰写本文时,setState 允许第二个参数,该参数是 setState 和重新渲染完成后的回调函数。由于您从未向我们提供您的代码将如何使用hasSubmit值,我相信其他人在想要确保hasSubmit已更改时可能会发现这很有用。
您应该在第一个示例中使用 this.forceUpdate()
来强制更新状态。例如:
this.state.hasSubmit = false;
this.forceUpdate();
但是最好使用 this.setState
,因为它是 React 引擎的 init 本机检查状态 mecanizm,这比强制更新更好。
如果你只是直接更新this.state
的任何参数而不setState
react 渲染 mecanizm 将不知道某些状态参数已更新。
- 全局变量和全局对象的属性之间有什么区别吗
- 在ember/handlers中使用value和valueBinding有什么区别
- 这两个关于 JavaScript 作用域链的例子有什么区别?
- Math.min()和Math.max()之间有什么区别?在Javascript中
- angularjs中的ng网格和ui网格有什么区别
- webpack开发模式和生产构建模式之间有什么区别
- 缓存!saveLocations()和addLocation()函数有什么区别
- 关于承诺/A+规范,术语“当时可”和“承诺”之间有什么区别
- 以下两者在javascript中有什么区别
- jquery.js和jquery.lite.js有什么区别
- 通过Nuget安装Angular JS和Angular JS核心有什么区别
- XMLHttpRequest对象的open()和send()方法之间有什么区别
- 这两种不同的创建对象文字的方法有什么区别
- jQuery中这两个词有什么区别
- 在Javascript语法中:和::和:::有什么区别
- getElementById 和 getElementsByClassName 有什么区别?
- (typeof variable === “function”) 和 jQuery.isFunction() 有什么区别
- 在使用JS的Ajax调用中,ajaxComplete和beforesend之间有什么区别
- $(e.target).find和template.find('input').value之间有什么区别
- 在javascript中,在变量名之前使用var有什么区别/优势吗