ReactJS 中的 componentWillMount 和 componentDidMount 有什么区别?

IT技术 reactjs
2021-04-12 04:52:03

我在 ( React.Component )上查看了 Facebook 的文档,它提到了如何componentWillMount在客户端/服务器componentDidMount上调用,仅在客户端上调用。这是什么componentWillMount做的服务器?

6个回答

componentWillMount 本质上是构造函数。您可以设置不影响渲染的实例属性,同步从存储中提取数据并使用它设置状态,以及在设置组件时需要运行的其他简单的无副作用代码。

它很少需要,对于 ES6 类根本不需要。

它与构造函数不同。例如,在 dev 的严格模式下,您的构造函数将被调用两次(对于两个不同的实例),但只有一个会调用 componentWillMount - stackoverflow.com/questions/61254372/...
2021-05-26 04:52:03

constructor方法是不一样的componentWillMount

根据 Redux 的作者,从构造函数分派动作是有风险的,因为它可能导致渲染时状态发生变化。

但是,从发送componentWillMount就好了。

来自github 问题

当一个组件的构造函数中的 dispatch() 导致另一个组件中的 setState() 时,就会发生这种情况。React 会跟踪此类警告的“当前所有者”——并且当技术上构造函数在应用程序的某些其他部分中导致 setState() 时,它认为我们正在构造函数中调用 setState()。我认为我们不应该处理这个问题——这只是 React 尽最大努力完成它的工作。正如您正确指出的那样,解决方案是在 componentWillMount() 中使用 dispatch() 代替。

这绝对不是在所有情况下都可以的,这取决于 in 中的内容componentXxxMount,例如,Ajax inwillMount可能会导致问题。
2021-05-25 04:52:03
@DaveNewton 我没有说在所有情况下都可以。我只是举了一个例子来证明答案“componentWillMount 本质上是构造函数”是错误的。谢谢你澄清
2021-05-26 04:52:03
@LiranBrimer 这个答案变得不准确,因为 componentWillMount 已被弃用,并将分别在 0.16 和 0.17 中停止运行,特别是关于“但是,从 componentWillMount 调度就好了”。陈述
2021-06-02 04:52:03

补充一下 FakeRainBrigand 所说的,componentWillMount在服务器和客户端上渲染 React 时会被调用,但componentDidMount仅在客户端上被调用。

@DaveNewton 怎么样?它没有说componentWillMount不会在客户端上调用
2021-06-05 04:52:03
componentWillMount将在服务器和客户端上调用。见:facebook.github.io/react/docs/...
2021-06-13 04:52:03
@AyushShanker IMO 提供非误导性信息很重要。由于不明确,因此存在误解的空间:文档是明确的。你是对的,它也没有明显矛盾。
2021-06-18 04:52:03

componentWillMountrender组件的 INITIAL 之前完成,用于评估 props 并根据它们执行任何额外的逻辑(通常还更新状态),因此可以在服务器上执行以获得第一个服务器端呈现的标记.

componentDidMount在初始renderDOM 更新后执行(但关键是在此 DOM 更新绘制到浏览器之前,允许您与 DOM 本身进行各种高级交互)。这当然只能发生在浏览器本身,所以不会作为 SSR 的一部分发生,因为服务器只能生成标记而不是 DOM 本身,如果使用 SSR,这是在它被发送到浏览器之后完成的

你说的与 DOM 的高级交互?Whaaaat??... 是的 - 在这一点上,因为 DOM 已经更新(但用户还没有在浏览器中看到更新),可以通过使用拦截实际绘制到屏幕上window.requestAnimationFrame,然后执行诸如测量实际将输出的 DOM 元素,您可以对其执行进一步的状态更改,非常有用,例如动画到具有未知可变长度内容的元素的高度(因为您现在可以测量内容并为动画分配高度),或者避免在某些状态更改期间出现内容场景。

但是要非常小心地保护任何状态的变化,componentDid...否则会导致无限循环,因为状态变化也会导致重新渲染,因此另一个componentDid...等等

我不认为将setStatecomponentDidMount会导致无限循环。
2021-05-29 04:52:03
否则会导致无限循环,因为状态更改也会导致重新渲染,因此会导致另一个 componentDidMount。等等等等”,这根本不是真的。状态更改会导致重新渲染,但不会componentDidMount一次又一次地调用componentDidMount 仅在组件安装时调用一次。
2021-06-21 04:52:03

根据文档(https://facebook.github.io/react/docs/react-component.html

will前缀的方法某事发生之前被调用并且

did前缀的方法某事发生后立即被调用