在哪获取数据:componentWillMount vs componentDidMount

前段时间被问到这个问题,就 google 里一下,发现这篇文章讲到了重点,就翻译出来和大家一起分享。

原文链接:Where to Fetch Data: componentWillMount vs componentDidMount

校对:Cherry

当你需要为 React 组件获取一些数据的时候,你会从什么地方获取呢?

这个问题一直都存在。

有两个常见的获取数据的地方:

  • componentWillMount
  • componentDidMount

我们应该都很清楚,render 方法肯定不是一个获取数据或者做任何有关异步操作的好地方,它会以某种方式改变 state,也可能会引起副作用。

让我们来看看这两种常见的选项以及他们的优缺点。

componentWillMount

这个方法在组件第一次渲染之前被调用,所以猛一看会觉得这是写数据请求的最好地方。

但是这里有一个“陷阱”:在组件渲染之前获取数据的异步调用不会返回出来数据。就是说组件将至少一次会伴随着空数据被渲染。

这是没有办法为了等待数据返回而去“暂停”渲染。你不能在 setTimeout 方法里从 componentWillMount 中返回一个 promise。 处理这个问题的正确方式是设置组件的初始 state 来确保组件的有效渲染。

在 ES6 风格的 class 组件中,它的构造函数和 componentWillMount 的功能是一样的,所以,如果你已经有一个构造函数方法,那就可以直接把代码写在这里。

componentDidMount

等到 componentDidMount 被调用的时候,组件已经被渲染一次了。

事实证明,componentDidMount发送数据请求的最好的位置,有以下两个原因:

1、使用 DidMount 能够清晰的看出,直到初始渲染之后,数据才会被加载。这就提醒你要适当的去设置初始的 state,就不会因为 state 为 undefined 而导致错误

2、如果你需要在服务端(SSR/同构/其他的流行用语)渲染应用,那么 componentWillMount 将会被调用两次 —— 一次在服务端,一次在客户端,当然,这应该是你不愿意看到的。那么把数据加载的代码放在 componentDidMount 中能确保只会从客户端获取数据。

总结

我希望在哪加载数据的这个问题已经讲清楚了。如果你仍然不确定调用 AJAX 请求和加载数据的最好方法是什么,请阅读我的这篇文章 在 React 中发送 AJAX 请求

支持原创