要知道setState本质是通过一个队列机制实现state更新的。 执行setState时,会将需要更新的state合并后放入状态队列,而不会立刻更新state,队列机制可以批量更新state。
如果不通过setState而直接修改this.state,那么这个state不会放入状态队列中,下次调用setState时对状态队列进行合并时,会忽略之前直接被修改的state,这样我们就无法合并了,而且实际也没有把你想要的state更新上去。
所以这里不能依靠更改的state来获取state,因为他们可能在同一个队列里面,你不确定他的值到底是多少。
state是内部的(所以也叫作local state),只有组件自己能改变自己的state,别人想改变自己的state,都不可能!
后面要介绍Redux架构,所有组件自己的state越来越少用了,而是变为了Redux中的state,不要混淆。
备注:
this.setState是react类组件中最常用的一个react API,使用它可以改变state从而改变页面。今天我们就来详细的学习一下这个东西。
但是this.setState还有很多的知识点你没有了解,真正项目当中可能会出现很多你不理解的bug。
比如说:
this.setState是异步的
在你调用了this.setState后在他的下面输出他的结果还是没变的状态
this.setState({ count: this.state.count + 1 })
console.log(this.state.count) //结果还是之前的,而不是+1之后的
this.setState的第一个参数可以是一个对象,也可以是一个函数返回一个对象,函数的参数是上一次的state
示例:
this.setState((prevState) => ({ prevState.count + 1 }));
1
2
this.setState的第二个参数是它的回调函数,在前面重新给state赋值后执行
示例:
this.setState({
count: this.state.count + 1,
}, () => console.log(this.state.count)) //结果是+1之后的count
连续调用this.setState的结果
示例:
this.setState({ count: this.state.count + 1 })
this.setState({ count: this.state.count + 1 })
this.setState({ count: this.state.count + 1 })
虽然调用了三次 setState ,但是 count 的值还是为 1。因为多次调用会合并为一次,只有当更新结束后 state 才会改变,三次调用等同于如下代码
Object.assign(
{},
{ count: this.state.count + 1 },
{ count: this.state.count + 1 },
{ count: this.state.count + 1 },
)
如果想让最后的结果等于3请用上面介绍的this.setState()的参数为函数返回对象的形式
setTimeout(() => {
this.setState({ count: this.state.count + 1 })
this.setState({ count: this.state.count + 1 })
this.setState({ count: this.state.count + 1 })
}, 100)