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

我查看了Facebook的文档https://facebook.github.io/react/docs/component-specs.html ,它提到了如何在客户机/服务器上调用componentWillMount,而componentDidMount只在客户机上调用。 componentWillMount对服务器做了什么?

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

这是很less需要的,而不是ES6类。

constructor方法与componentWillMount

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

但是,从componentWillMount调度就好了。

来自github的问题 :

当一个组件的构造函数中的dispatch()派生一个setState()在另一个组件内时,会发生这种情况。 React跟踪这个警告的“当前所有者” – 当技术上的构造函数在应用程序的某个其他部分内导致setState()时,它认为我们在构造函数内部调用了setState()。 我不认为我们应该处理这个,只是React尽力而为而已。 正如您正确地指出的那样,解决scheme是派生()在componentWillMount()内部。

要添加到FakeRainBrigand所说的内容,在服务器上渲染React时会调用componentDidMount ,但仅在客户端上调用componentDidMount

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

发生什么事情之前调用带有前缀的方法

事件发生后,did为前缀的方法称为right

componentWillMountcomponentWillMount的INITIAL render之前完成,并用于评估道具并基于它们做任何额外的逻辑(通常也用于更新状态),因此可以在服务器上执行以获得第一个服务器端渲染的标记。

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

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

要非常小心,以防止在任何componentDid...状态变化,否则可能会导致无限循环,因为状态更改也会导致重新呈现,因此另一个componentDid...和等等。

componentWillMount https://daveceddia.com/where-fetch-data-componentwillmount-vs-componentdidmount/

虽然有一个“陷阱”:在呈现发生之前,asynchronous调用获取数据不会返回。 这意味着组件将至less用空数据进行一次渲染。

没有办法“暂停”渲染以等待数据到达。 你不能从componentWillMount中返回一个promise,或者以某种方式在setTimeout中进行争吵。

https://developmentarc.gitbooks.io/react-indepth/content/life_cycle/birth/premounting_with_componentwillmount.html

我们的组件将无法访问本机用户界面(DOM等)。 我们也不会接触到子女的参考,因为他们还没有创build。 componentWillMount()是我们处理configuration,更新状态的一个机会,并且通常为第一次渲染做准备。 这意味着我们可以开始执行基于prop值的计算或过程。