Reactjs 为什么React文档建议在componentDidMount而不是componentWillMount中使用AJAX?

Reactjs 为什么React文档建议在componentDidMount而不是componentWillMount中使用AJAX?,reactjs,Reactjs,我理解为什么componentDidMount适用于需要DOM访问的任何东西,但AJAX请求不一定或通常不需要这样做 提供了什么?组件didmount用于副作用。添加事件监听器、AJAX、修改DOM等 组件将挂载很少有用;特别是如果您关心服务器端呈现(添加事件侦听器会导致错误和泄漏,以及许多其他可能出错的事情) 有人说要从类组件中删除组件willmount,因为它与构造函数的作用相同。它将保留在createClass组件上。我在开始时也遇到了同样的问题。我决定尝试在组件willmount中发出请

我理解为什么
componentDidMount
适用于需要DOM访问的任何东西,但AJAX请求不一定或通常不需要这样做


提供了什么?

组件didmount
用于副作用。添加事件监听器、AJAX、修改DOM等


组件将挂载
很少有用;特别是如果您关心服务器端呈现(添加事件侦听器会导致错误和泄漏,以及许多其他可能出错的事情)


有人说要从类组件中删除
组件willmount
,因为它与构造函数的作用相同。它将保留在
createClass
组件上。

我在开始时也遇到了同样的问题。我决定尝试在
组件willmount
中发出请求,但最终会出现各种小问题


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

根据文档设置,
componentWillMount
中的状态不会触发重新渲染。 如果AJAX调用没有阻塞,并且您返回了一个
Promise
,在成功时更新组件的状态,那么在呈现组件之后,很可能会出现响应。
由于
componentWillMount
不会触发重新渲染,因此不会出现预期的行为,即使用请求的数据渲染组件


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

添加事件侦听器会在服务器上导致错误和泄漏,或者只在
组件中安装
?我真的看不出区别。@Alan-如果您在客户端和服务器端都使用React,您会发现
组件中的任何内容都将在服务器端渲染中执行。如果您使用的是
componentDidMount
,那么它只能在客户端执行。因此,将东西放入执行外部交互或绑定到事件等的组件willmount中并不是一个好主意。如果您不打算在服务器端呈现组件,那么仅仅考虑潜在的代码可移植性仍然不是一个好主意。这一切都超出了@daniula的回答中解释的糟糕的主要原因。componentWillMount在服务器上运行,但componentWillUnmount(删除侦听器的地方)不是。这将导致您添加侦听器而从不清理它们。React core团队的成员正在考虑从未来版本中删除componentWillMount。@AnkitSinghaniya这将破坏服务器渲染和浅层单元测试。好的,谢谢。我想可能是这样的,但你是对的,令人惊讶的是ajax请求可以在渲染完成之前完成。@daniula你确定吗?AJAX请求如何在渲染之前完成?这是浏览器异步世界。你不应该假设一个函数总是比其他函数快。正如我所提到的,这是一种边缘情况,可能意味着您应该优化渲染过程,但使用适当的生命周期方法将使您的生活更加轻松。@Soochenkoh ES6类构造函数相当于
componentWillMount
,因此,对于ajax调用,您仍然应该继续使用
componentDidMount
。@soochenkoh-绝对不应该在构造函数中执行任何导致必须设置状态的操作,这将导致客户端和服务器上的竞争条件。您不应该在组件构造函数中调用
setState
,并且您无法确定AJAX调用何时完成@FurkanO我认为他的意思是访问由组件呈现的DOM元素。他是完全正确的,因为如果您试图访问
componentWillMount
中的上述元素,那么如果组件……没有挂载,那么它将失败。@AlanH。删除了我的问题,当然您可以访问componentDidMount上的dom。这是一条规则,没有什么可解释的。谢谢。在我看来,我们之所以在componentDidMount之后调用Ajax函数,是因为我们必须首先确保元素在开始时能够顺利呈现。之后,我们可以进行ajax调用。如果我们先调用ajax,然后发生错误,则会导致呈现问题
componentWillMount
不会仅仅因为在第一次呈现之前定义了新状态而触发重新呈现。但是如果在AJAX回调中调用了
setState
,那么在第一次渲染之后肯定会调用它,并且会触发重新渲染。