天天看点

setState 说明1.11.21.3

1.1

此处更新 setState ⚠️:异步更新数据。 由于是异步的,紧跟其后去使用 this.state.count 还是默认值,并不是 setState 之后的值。

this.setState({
   // 1 + 1
    count: this.state.count + 1
})
console.log("count1", this.state.count) // 1
           
注意:

使用该语法时,后面的 setState() 不要依赖于前面的 setState()

原因:

因为 setState 是异步的,上面代码中可以看出,即使是 setState 执行了,

打印的还是 1,那么后面再执行 setState,相当于还是 1 + 1

this.setState({
   // 1 + 1
    count: this.state.count + 1
})
console.log("count1", this.state.count) // 1

this.setState({
   // 1 + 1
    count: this.state.count + 1
})
console.log("count2", this.state.count) // 1
           
注意:

当然,是可以多次调用 setState(),但只会触发一次重新渲染(render)

原因:

为什么这么做呢?其实是为了性能的考虑,如果 setState 一次,就 render 一次,那么性能是很差的。所以,会把多次调用的 setState() 汇总合并,最后一次性的把结果渲染的页面上,只 render 一次。这样的性能会高很多。

1.2

上面的异步问题,如果依赖前面的 setState会出现异步问题 那么,推荐使用

setState((state, props) => {}) 
           
参数state:

表示最新的state

参数props:

表示最新的props

注意:

这种语法也是异步更新 state 的

this.setState((state, props) => {
// 此时 state 是默认值
  return {
      // 1 + 1
      count: state.count + 1  // 2
  }
})
           

那么 setState((state, props) => {}) 与 this.setState({}) 有什么区别呢?

这个语法(setState((state, props) => {}) )跟上面的语法(this.setState({}) )的区别是参数是个回调函数,而回调函数中的参数 state 实际上表示的是最新的状态的。

什么意思呢?就是调用两次 setState() 的时候,第一次 state 是默认值,但第二次就不是默认值了,而是上一次 setState 之后的值

this.setState((state, props) => {
   // 此时 state 是默认值
    return {
        // 1 + 1
        count: state.count + 1  // 2
    }
})

this.setState((state, props) => {
    // 这次 state 是拿到调用之后的结果
    console.log('第二次调用',state)
    // 此时 state 的值是上面 setState 之后的值
    return {
        // 2 + 1
        count: state.count + 1  // 3
    }
})
           

1.3

setState 第二个参数

在状态更新(页面完成重新渲染)后立即执行某个操作

setState(undater,[callback])

this.setState((state, props) => {
 return {
        // 1 + 1
        count: state.count + 1 // 2
    }
},() => {//状态更新后并且更新渲染后,立即执行
    console.log("状态更新完成:", this.state.count) // 2
    //console.log(document.getElementById("title").innerHTML)
})
           

以上具体内容可去 gitHub 看代码更清晰

继续阅读