setState 是异步操作的, 并不会立即更新状态

来源:7-20 加载更多-实现功能

慕姐3903896

2017-05-20

        console.log('isLoadingMore', this.state.isLoadingMore )
        this.setState({
            isLoadingMore: true
        })
        
        console.log('isLoadingMore', this.state.isLoadingMore )

        this.setState({
            isLoadingMore: false
        })
        console.log('isLoadingMore', this.state.isLoadingMore )

看打印出来的结果:

http://szimg.mukewang.com/591f2b1c0001810206560078.jpg

可以看到 setState 并没有立即更新组件状态.

这个问题, 我之前确实遇到过, 所以搜了一些资料:

https://zhuanlan.zhihu.com/p/20328570

然后在<深入react技术栈>这本书里看到了关于 setState 更新组件状态详细的解读.

大意是: setState 通过队列机制实现 state 的更新, 执行 setState 时会将需要更新的 state 合并后放入状态队列, 然后批量更新状态. 而不会立即更新 this.state.

书里讲有触发批量更新的条件, 可惜我看不大懂...

写回答

1回答

双越

2017-05-20

setState可以理解为就是异步执行的,不过在咱们的项目中,没有用到这个特性。


你可以考虑一下为何 setState不会立即执行而是批量触发?这肯定还性能有关系,如果一个页面频繁执行很多setState而每次都是立即执行 执行完之后还得去更新视图,这样会导致很慢。因此批量触发可以解决这一问题。

与之类似的还有:第一,在网页插入10个div,不能每个都插入,而是批量插入;第二,window.onscroll 往往会使用节流来提高流程性。等等……

0
0

React高级实战 打造大众点评Web App

已经对React Router4与Webpack2进行了项目升级

1711 学习 · 707 问题

查看课程