在react文档中,它建议在componentDidMount
方法中进行初始网络请求:
componentDidMount()
在装入组件后立即调用.需要DOM节点的初始化应该放在这里.如果需要从远程端点加载数据,这是实例化网络请求的好地方.在此方法中设置状态将触发重新渲染.
如果componentWillMount
在渲染组件之前调用,那么在这里发出请求并设置状态是不是更好?如果我这样做componentDidMount
,则渲染组件,发出请求,更改状态,然后重新呈现组件.为什么在呈现任何内容之前提出请求更好?
你应该做的请求componentDidMount
.
如果在渲染组件之前调用componentWillMount,那么在这里发出请求并设置状态不是更好吗?
不,因为无论如何,在组件呈现时请求都不会完成.
如果我在componentDidMount中执行此操作,则会呈现组件,发出请求,更改状态,然后重新呈现组件.为什么在呈现任何内容之前提出请求更好?
因为任何网络请求都是异步的.除非你缓存了数据,否则无论如何都无法避免第二次渲染(在这种情况下,您根本不需要触发请求).通过先前触发它,你无法避免第二次渲染.它无济于事.
在React的未来版本中,我们希望componentWillMount
在某些情况下会多次触发,因此您应该使用componentDidMount
网络请求.
您应该使用componentDidMount
。
为什么在呈现任何内容之前发出请求更好呢?
因为:
您的请求几乎肯定会在呈现组件之前完成(除非呈现大量标记,或者您处于零延迟量子纠缠连接),并且在大多数情况下,组件最终将需要重新呈现
componentWillMount
在服务器端渲染期间也会调用(如果适用)
但是,如果您要问的话,发起一个请求componentWillMount
(在没有实际处理的情况下)不是更好,我肯定会说是(ES6),我自己这样做是为了偶尔将加载时间缩短几毫秒:
componentWillMount() { // if window && window.XMLHttpRequest if (!this.requestPromise) { this.requestPromise = new Promise(resolve => { // ... perform request here, then call resolve() when done. }); } } componentDidMount() { this.requestPromise.then(data => ...); }
这将在期间开始预加载您的请求componentWillMount
,但是componentDidMount
无论请求是在那时完成还是仍在处理中,都仅在中处理该请求。