react中的setState

176 阅读1分钟

1.setState传入的形式是对象

  (1) 在生命周期函数和绑定的事件函数中,setState是异步的(比所有的console.log或其他同步事件慢执行),并且即使调用setState多次,
  最终会合并为一次,相同的state值只执行最后一次,每次执行this.setState获取到的this.state的值不变,并且前面setState的更新都会
  被最后一次覆盖。
  例子:
  this.state = {count: 0}
  componentDidMount() {
  	console.log(this.state.count) // 0
  	this.setState({count: this.state.count+1}) // 其中this.state.count === 0,值不变
    this.setState({count: this.state.count+2}) // 其中this.state.count === 0,值不变
    this.setState({count: this.state.count+3}) // 其中this.state.count === 0,值不变
    console.log(this.state.count) // 0
  }
  render() {
  	console.log("render:",this.state.count)// 忽略componentDidMount函数执行前的第一次render,只看在componentDidMount执行后,render只执行一次。结果为 3
  }
  (2)在定时器、原生dom绑定的事件函数,promise then中,setState是同步执行的,每执行一次setState,就执行render一次。这种方式存在弊端, 多次渲染虚拟dom消耗性能。
  例子:
   this.state = {count: 0}
  componentDidMount() {
  	setTimeout(()=>{
    	console.log(this.state.count) // 0
  		this.setState({count: this.state.count+1}) // 其中this.state.count === 1,值不变
    	this.setState({count: this.state.count+2}) // 其中this.state.count === 2,值不变
   		this.setState({count: this.state.count+3}) // 其中this.state.count === 3,值不变
    	console.log(this.state.count) // 3
    })
  }
  render() {
  	console.log("render:",this.state.count) // 忽略componentDidMount函数执行前的第一次render,只看在componentDidMount执行后,render只执行一次。结果为 1,2,3
  }

2.setState传入的形式是回调函数

	(1)在生命周期函数和绑定的事件函数中,setState是异步的(比所有的console.log或其他同步事件慢执行),并且即使调用setState多次,最终会合并为一次,相同的state值只更新最后一次,每次setState获取到的this.state的值是变化的(与上述对象形式不同),并且前面setState的更新都会最后一次覆盖。
    	例子:将this.setState({count: this.state.count+1}) 改为 this.setState(state=>state.count+1),
        结果:在componentDidMount打印结果为 0 6, 在render中打印结果为 6