微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何正确使用 setState

如何解决如何正确使用 setState

我正在学习 react,根据 react doc,我发现 setState 有两种形式:

  • setState({someState: someValue}) #form1
  • setState((preState) => ({someState: doSomething(preState)})) # form2

#form1 直接设置状态,#form2 通过回调函数设置状态。

Using state correctly 部分,我被告知 form1 可能不安全,所以这是否意味着我应该始终正确使用 #form2 来 setState?但是我很快注意到有 another example here ,使用 #form1 来更新状态,这是一个错误的例子吗?

#form1 和 #form2 可能都正确,但在这种情况下使用 #form1 是完全安全的,并且 在什么情况下我应该使用#form2?

解决方法

形式的选择取决于下一个状态是否使用当前状态的值。

如果新状态依赖于当前状态,则使用形式 2。否则使用形式 1。

,

我在 setState 上写了一个便条。我希望它能帮助你正确使用它。如果你认真阅读并理解它,你会更好地使用它来管理状态。

设置状态

它是异步

state = { count: 0};
increment() {
    this.setState({ count: this.state.count + 1});
    this.setState({ count: this.state.count + 1});
    this.setState({ count: this.state.count + 1});
    console.log(this.state.count) // 0
}

increment() 
console.log(this.state.count); // 1

并且,this.state.count 的最终值在调用 incemenent() 完成后将为 1

因为 React 批处理所有调用,并找出结果,然后有效地进行更改。这种纯 JavaScript 代码,在最后一个获胜的地方合并

newState = Object.assign(
    {},firstSetStateCall,secondSetStateCall,thirdSetStateCall,);

所以,我们在这里可以说一切都与 JavaScript 对象合并有关。所以还有另一种很酷的方式,我们在 setState 中传递一个函数而不是对象。

state = { count: 0};
increment() {
    this.setState( (state) => {  return { count: state.count + 1} } );
    this.setState( (state) => {  return { count: state.count + 1} } );
    this.setState( (state) => {  return { count: state.count + 1} } );
}

increment();
console.log(this.state.count) // 3

这次我们将得到 3 个,因为之前可以合并对象,但不能合并函数,因此它像同步一样工作。

但是这种在 this.setState 中传递参数的方法的另一个很好的应用是您可以在从函数返回对象之前实现逻辑

this.setState( (state) => { if(state.count === 0) return { count: state.count + 1} } );

不仅如此,我们在 setState 内部传递的函数还需要另一个参数 props

this.setState((state,props) => { //play here })

但是,我们传递给它的函数可能会随着时间变得混乱,那又怎样?只需创建一个常规的 JavaScript 函数

并将其传递给 setState

this.setState(fn)

如果 SetState 是异步的,我们如何在状态更新后立即执行操作?

setState 实际上有两个参数,这两个中的第二个是回调函数,在状态更新后调用,

this.setState ( 
    (state,props) => { 
        // code here
    },() => {console.log("updated state",this.state)}
        
 )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?