对 React 中的异步请求使用 componentWillMount 或 componentDidMount 生命周期函数

IT技术 javascript ajax reactjs
2021-02-26 02:19:55

我正在阅读 React 生命周期,但有点困惑。有些人建议使用 componentWillMount 进行 ajax 调用:

https://hashnode.com/post/why-is-it-a-bad-idea-to-call-setstate-immediately-after-componentdidmount-in-react-cim5vz8kn01flek53aqa22mby

在 componentDidMount 中调用 setState 将触发另一个 render() 调用,并可能导致布局抖动。

在其他地方,它说不要在 componentWillMount 中放置 ajax 调用:

https://medium.com/@baphemot/understanding-reactjs-component-life-cycle-823a640b3e8d

...在调用初始渲染之前,此函数可能会被多次调用,因此可能会导致触发多个副作用。由于这一事实,不建议将此功能用于任何引起副作用的操作。

哪个是对的?

3个回答

React 文档推荐componentDidMount用于发出网络请求

componentDidMount()在安装组件后立即调用。需要 DOM 节点的初始化应该在这里进行。如果您需要从远程端点加载数据,这是实例化网络请求的好地方。

调用setState()此方法将触发额外的渲染,但保证在同一滴答期间刷新。这保证即使render()在这种情况下将被调用两次,用户也不会看到中间状态。

根据以下情况componentWillMount

编辑:

这个生命周期废弃了,因为v16.3.0的react,并且不再鼓励usage.However其重命名为UNSAFE_componentWillUpdate和至少预计工作到V17的react

v16.3.0之前

在渲染发生之前,获取数据的异步调用不会返回。这意味着该组件将至少呈现一次空数据。

无法“暂停”渲染以等待数据到达。你不能componentWillMountsetTimeout某种方式返回Promise或争论处理这个问题的正确方法是设置组件的初始状态,使其对渲染有效。

把它们加起来

在实践中,componentDidMount是调用获取数据的最佳位置,原因有二:

  • 使用 DidMount 可以清楚地表明,直到初始渲染之后才会加载数据。这会提醒您正确设置初始状态,这样您就不会以undefined导致错误的状态结束
  • 如果你需要在服务器上渲染你的应用程序,componentWillMount实际上会被调用两次——一次在服务器上,一次在客户端——这可能不是你想要的。放入数据加载代码 componentDidMount将确保仅从客户端获取数据。
谢谢你的额外解释:)
2021-04-23 02:19:55
很高兴它有所帮助。
2021-04-27 02:19:55

componentDidMount是推荐的生命周期方法来进行 Ajax 调用,如他们的文档中所述

ComponentDidMount 就是这个地方。

但是,如果您有时间尝试查看 Redux 并在操作中发出请求,随着您的应用程序的增长,它将对管理应用程序状态有很大帮助。

;)

是的,我正在使用 redux 和调用操作,但它们必须在某个地方被调用……我试图找出将它们放在哪里的最佳位置。:)
2021-04-19 02:19:55
@RodolfoLeal 不要在答案部分写评论
2021-05-12 02:19:55