为什么不应该使用 componentWillMount?

IT技术 javascript reactjs redux react-redux
2021-04-19 01:34:58

触发服务器调用以在 componentWillMount 生命周期方法中获取数据是一种不好的做法?

以及为什么最好使用 componentDidMount。

5个回答

更新: componentWillMount 将很快被弃用


引用@Dan Abramov

React 的未来版本中,我们预计 componentWillMount在某些情况下会触发不止一次,所以你应该使用 componentDidMount 来处理网络请求。

在这里阅读更多

这是一个仅链接的答案,不解释问题的“为什么”上下文。任何其他回答都更好地回答了这个问题,所以这不应该是公认的答案。
2021-05-25 01:34:58
这是我在某个时候读到的,但从来没有一个合理的理由来解释为什么它会被多次调用。
2021-06-03 01:34:58
对不起,如果我的问题很愚蠢。如果我在componentWillMount中取数据,即使没有破坏第一次渲染的组件,`componentWillMount`中的取数据函数是否会比取数据的componentDidMount函数早一点调用,导致我们得到数据快一点?
2021-06-13 01:34:58

更新 - 2018 年 5 月
有一项新功能可用于在称为异步渲染的工作进度中做出react
作为react,v16.3.2这些方法使用起来并不“安全”:

  • 组件将挂载
  • 组件将接收props
  • 组件将更新

你可以在文档中阅读更多关于它的信息


作为一般规则,根本不要使用 componentWillMount(如果您使用 es6class语法)。改用该constructor方法。
这种生命周期方法适用于同步状态初始化。
componentDidMount另一方面有利于异步状态操作。

为什么
好吧,当您在constructor/ 中执行异步请求时,componentWillMount您会在render调用之前执行此操作,到异步操作完成时,该render方法很可能已经完成并且在此阶段设置“初始状态”没有意义,是吗?
我不确定这是您的情况,但开发人员希望异步启动状态的大多数情况componentWillMount是为了避免第二次render调用。但是你无法避免它,就像上面提到的那样,render在异步操作完成之前无论如何都会触发。
因此,调用异步操作的最佳时间是在render已调用并安装组件之后(您可以安装null或空<div/>) 然后获取您的数据,设置状态并使其分别重新渲染。

正确,异步调用示例的解释为不使用 componentwillmount 提供了足够的理由。谢谢,兄弟 :)
2021-05-30 01:34:58
@Sagivb.g:是的,非常感谢,所以,从构造函数、挂载到渲染结束的所有过程都是同步动作,对吗?那些会在异步操作之前进入调用堆栈?
2021-06-12 01:34:58
@DuyHưngAndrogyneTenor 所有用户的代码(setState例如不是 react 的代码)都是同步的。所以是的,我们的代码将在异步代码之前运行完成。当然,除非我们使用异步 API 之类的 setTimeout Promise等。
2021-06-13 01:34:58
@DuyHưngAndrogyneTenor 不,因为获取数据的时间并不重要,重要的是你什么时候可以用它做点什么。事实上,数据是在异步操作中处理的,它只会在所有同步工作完成后运行。所以我怀疑有区别。
2021-06-14 01:34:58
对不起,如果我的问题很愚蠢。如果我在componentWillMount中取数据,即使没有破坏第一次渲染的组件,`componentWillMount`中的取数据函数是否会比取数据的componentDidMount函数早一点调用,导致我们得到数据快一点?
2021-06-19 01:34:58

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

  1. UsingcomponentDidMount清楚地表明在初始渲染之后才会加载数据。您需要正确设置初始状态,以免获得undefined导致错误的状态。

  2. 如果您需要在服务器上呈现您的应用程序,componentWillMount将被调用两次(在服务器上和在客户端上再次调用),这可能不是您想要的。放入数据加载代码componentDidMount将确保仅从客户端获取数据。通常,您不应向componentWillMount.

我想在组件出现之前显示加载器
2021-06-09 01:34:58

根据我的理解,最大的原因之一与阅读代码的开发人员设置正确的期望有关

如果我们使用componentWillMount它很容易认为 fetch 有时间发生,然后组件“确实”挂载,然后第一次渲染将发生。但事实并非如此。如果我们执行异步调用(例如使用 Promise 的 API 调用),组件将render在 fetch 返回并设置组件状态(或更改 Redux 状态,或其他任何事情)之前实际运行

如果我们转而使用componentDidMount,那么很明显,该组件将呈现至少一次,你回来任何数据之前(因为部分已经安装)。因此,通过扩展,很明显我们必须以某种方式处理初始状态,以便组件不会在第一次(“空”)渲染时中断。

组件安装生命周期是

  • 构造函数()
  • componentWillMount() /UNSAFE_componentWillMount()(react 16)
  • 使成为()
  • 组件DidMount()

ConstructorcomponentWillMount都在负责页面渲染的 render() 调用之前调用。

由于异步调用,这里的 State 初始化是在 Constructor 中完成的,而 api 在 componentDidMount 中被调用。

当构造函数不存在时,ComponentWillMount 可以很好地初始化 ES6 之前的状态但是现在 ComponentWillMount 一无是处,React 团队在 React 17 之后开始考虑它。

除了上述之外,react 已经转移到 react纤维架构,为了避免不必要的重新渲染和提高性能,react 决定远离 componentWillMount、componentWillReciveProps 和 componentWillUpdate 方法。

它没有回答为什么 componentWillMount 不安全且不用于数据获取。
2021-05-25 01:34:58
这是 React 的官方声明。他们引入它是有充分理由的,现在因为 ES6 不再需要它,所以 React 团队自己宣布它是不安全的。并推荐使用 constructor() 而不是 componentWillMount()。
2021-05-27 01:34:58