ReactJS中componentWillMount和componentDidMount有什么区别?

Blu*_*xir 86 reactjs

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

Bri*_*and 69

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

它很少需要,而且根本不需要ES6课程.

  • 这不是100%真实.请阅读下面的答案 (13认同)

Lir*_*mer 63

constructor方法是不一样的componentWillMount.

根据Redux的作者,从构造函数调度操作是有风险的,因为它可能导致在渲染时改变状态.

但是,派遣componentWillMount就好了.

来自github问题:

当一个组件的构造函数中的dispatch()导致另一个组件内的setState()时,会发生这种情况.React跟踪这些警告的"当前所有者" - 它认为我们在构造函数中调用setState(),当技术构造函数在应用程序的某个其他部分内导致setState()时.我认为我们不应该处理这个 - 只是React尽力做好自己的工作.正如您所正确指出的那样,解决方案是在componentWillMount()内调度().

  • @DaveNewton我并不是在所有情况下都说得很好。我只是举了一个例子,其中有一个差异可以证明答案“ componentWillMount本质上是构造函数”是错误的。感谢您澄清 (2认同)

And*_*ahl 35

要添加到FakeRainBrigand所说的内容,componentWillMount在服务器和客户端上呈现React时会被调用,但componentDidMount只在客户端上调用.

  • `componentWillMount`将在服务器和客户端上调用.请参阅:https://facebook.github.io/react/docs/component-specs.html#mounting-componentwillmount (10认同)
  • @AyushShanker IMO提供非误导性信息非常重要.如果不明确,就有误解的余地:文档是明确的.你是对的,它也没有明显的矛盾. (7认同)

ale*_*ill 28

componentWillMount在INITIAL之前完成render的部件的,并用于评估道具和做在他们基于(通常也更新状态)的任何额外的逻辑,并且因此可以在服务器上,以便得到所述第一服务器侧呈现的标记来进行.

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

你说与DOM的高级互动?Whaaaat ?? ...是的-在这一点上,因为DOM已经更新(但用户还没有看到在浏览器中还没有更新),可以通过使用拦截实际画到屏幕上window.requestAnimationFrame,然后做这样的事情措施的实际DOM元素将被输出,向其中可以执行进一步的状态变化,例如动画到具有未知长度可变内容的元件的高度(如你现在可以测量的内容和由高度分配给动画)超级有用,或者在某些状态更改期间避免内容闪现.

要非常小心,虽然保守国家改变任何componentDid...作为否则会造成无限循环,因为状态的改变也将导致重新绘制,因此另一个componentDid...和和和


小智 9

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

前缀的方法被称为右侧前三长两短

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

  • 从名称`did`和`will`中可以清楚地看出;) (3认同)