1.setState的异步更新和i++
问题重现:
想实现一个点赞按钮,点击一次赞增加一次,用likes变量来保存赞的数目
当我使用i++在setState中自增时发现并不可以
image.png
效果: image.png
当我在控制台打印this.state.likes的值是,始终都是1
image.png
这就涉及到了setState的异步更新
解析:
likes:this.state.likes++
是先赋值再运算
先赋值likes=0
再运算this.state.likes=1
所以控制台里打印的this.state.likes=1,为什么一直是1呢,因为this.setState是异步更新的,setState只是把要修改的状态放在一个队列中,处于性能原因,可能会将setState的状态修改合并成一次修改,所以setState在最后又将this.state.likes的值更新为0,在下一次执行likes:this.state.likes++
时likes还是0,所以不要依赖当前的state值,而在控制台打印this.state.likes会一直是1。
setState是支持回调函数的
this.setState({likes:this.state.likes++},()=>console.log(this.state.likes));
这是控制台中就会一直打印0,可以看出setState是异步更新的。
话题跑回来,为了实现这个点赞功能,只要改为likes:++this.state.likes就可以啦
网友评论