为什么React文档建议在componentDidMount中执行AJAX,而不是componentWillMount?

时间:2014-11-26 00:32:07

标签: reactjs

标题说明了一切。我理解为什么componentDidMount适用于任何需要DOM访问的东西,但AJAX请求不一定或通常不需要。

是什么给出了?

3 个答案:

答案 0 :(得分:60)

componentDidMount用于副作用。添加事件监听器,AJAX,改变DOM等。

componentWillMount很少有用;特别是如果你关心服务器端渲染(添加事件监听器会导致错误和泄漏,以及许多其他可能出错的东西)。

有关于从类组件中删除componentWillMount的讨论,因为它与构造函数的作用相同。它将保留在createClass组件上。

答案 1 :(得分:36)

我一开始也有同样的问题。我决定尝试在componentWillMount中提出请求,但最终会出现各种小问题。

当ajax调用完成新数据时,我正在触发渲染。在某些时候,组件的渲染比从服务器获取响应花费的时间更多,此时ajax回调在未安装的组件上触发渲染。这是一种边缘情况,但可能更多,因此坚持componentDidMount更安全。

答案 2 :(得分:3)

根据文档设置,componentWillMount中的状态不会触发重新呈现。 如果AJAX调用没有阻塞,并且您返回一个Promise,它会在成功时更新组件的状态,一旦组件被渲染,响应就有可能到来。 由于componentWillMount不会触发重新渲染,因此您将无法获得预期的行为,即使用请求的数据呈现的组件。

如果您使用任何磁通库并且所请求的数据最终存储在存储中,组件连接到(或从连接的组件继承),这不会成为问题,因为接收该数据很可能,最终改变道具。