react 中在componentDidMount中进行网络请求的原因
1, 在constructor请求
组件未挂载也可以发送请求,这里所影响的时间只有执行发送请求的时间,然后组件接着渲染,等异步数据返回后,再执行 setState 然后render重新渲染
constructor执行一次没错 但是网络请求是异步的 先用默认值渲染 网络请求回来后setState 后重新render
2,在componentWillMount请求
原理跟constructor是一样的,所影响的时间只有执行发送请求的时间,并不会阻塞组件的渲染,但不推荐使用 componentWillMount
是有其他的原因:
-
很重要的一点,React16.3后将会废弃掉componentWillMount、componentWillReceiveProps 以及 componentWillUpdate 三个周期函数
-
跟服务端渲染有关系(同构),如果在
componentWillMount
里获取数据,fetch data会执行两次,一次在服务端一次在客户端,使用componentDidMount
则没有这个问题----暂不理解。 - 可能被调用不止一次
至于前面说到的数据在组件挂载前返回导致不生效的,这种情况并不会发生,
因为 setState
是将更新的状态放进了组件的__pendingStateQueue队列中,react并不会立即响应更新,会等到组件挂载完成后,再统一更新组件
(setState
是异步的)
注意:
1 设置默认值
2页面数据发生闪动 (默认值->网络请求回来的值)
总结:
-
数据获取可以放在
constructor
或者componentDidmount
中, 但是为了更好的代码规范和可读性,建议统一放在componentDidmount
。 -
对于首次render没有数据,可能导致出错的。可以设置一个initial state,或者增加一个loading状态。