【问题标题】:Use componentWillMount or componentDidMount lifecycle functions for async request in React在 React 中对异步请求使用 componentWillMount 或 componentDidMount 生命周期函数
【发布时间】:2018-05-03 17:24:09
【问题描述】:

我正在阅读 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() 调用它会导致布局抖动。

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

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

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

哪个是正确的?

【问题讨论】:

    标签: javascript ajax reactjs


    【解决方案1】:

    React 文档建议使用 componentDidMount 进行网络请求

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

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

    根据componentWillMount的情况:

    编辑:

    此生命周期自 v16.3.0 的 react 以来已被弃用,不再鼓励使用。但它已重命名为 UNSAFE_componentWillUpdate,预计至少在 v17 的 react

    之前都可以使用

    v16.3.0 之前

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

    没有办法“暂停”渲染以等待数据到达。你不能以某种方式从componentWillMount 返回承诺或在setTimeout 中争吵。处理这个问题的正确方法是设置组件的初始状态,使其对渲染有效。

    总结一下

    实际上,componentDidMount 是调用获取数据的最佳位置,原因有两个:

    • 使用 DidMount 可以清楚地表明,直到之后才会加载数据 初始渲染。这会提醒您设置初始状态 正确,因此您不会以undefined 状态结束导致 错误。
    • 如果您需要在服务器上渲染您的应用程序,componentWillMount 实际上是 调用了两次——一次在服务器上,一次在客户端上——即 可能不是你想要的。将数据加载代码放入 componentDidMount 将确保仅从 客户。

    【讨论】:

    • 感谢您的额外解释:)
    • 很高兴它有帮助。
    【解决方案2】:

    ComponentDidMount 是这个地方。

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

    ;)

    【讨论】:

    • 是的,我正在使用 redux 和调用动作,但它们必须在某个地方调用......我正在尝试找出放置它们的最佳位置。 :)
    • @RodolfoLeal 不要在答案部分写 cmets
    【解决方案3】:

    componentDidMount 是进行 Ajax 调用的推荐生命周期方法,如 their docs 中所述

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-17
      • 2020-05-10
      • 2021-06-12
      • 2018-10-05
      • 2020-09-19
      • 2019-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多