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