我在 ( React.Component )上查看了 Facebook 的文档,它提到了如何componentWillMount
在客户端/服务器componentDidMount
上调用,而仅在客户端上调用。这是什么componentWillMount
做的服务器?
ReactJS 中的 componentWillMount 和 componentDidMount 有什么区别?
componentWillMount 本质上是构造函数。您可以设置不影响渲染的实例属性,同步从存储中提取数据并使用它设置状态,以及在设置组件时需要运行的其他简单的无副作用代码。
它很少需要,对于 ES6 类根本不需要。
该constructor
方法是不一样的componentWillMount
。
根据 Redux 的作者,从构造函数分派动作是有风险的,因为它可能导致渲染时状态发生变化。
但是,从发送componentWillMount
就好了。
来自github 问题:
当一个组件的构造函数中的 dispatch() 导致另一个组件中的 setState() 时,就会发生这种情况。React 会跟踪此类警告的“当前所有者”——并且当技术上构造函数在应用程序的某些其他部分中导致 setState() 时,它认为我们正在构造函数中调用 setState()。我认为我们不应该处理这个问题——这只是 React 尽最大努力完成它的工作。正如您正确指出的那样,解决方案是在 componentWillMount() 中使用 dispatch() 代替。
补充一下 FakeRainBrigand 所说的,componentWillMount
在服务器和客户端上渲染 React 时会被调用,但componentDidMount
仅在客户端上被调用。
componentWillMount
在render
组件的 INITIAL 之前完成,用于评估 props 并根据它们执行任何额外的逻辑(通常还更新状态),因此可以在服务器上执行以获得第一个服务器端呈现的标记.
componentDidMount
在初始render
DOM 更新后执行(但关键是在此 DOM 更新绘制到浏览器之前,允许您与 DOM 本身进行各种高级交互)。这当然只能发生在浏览器本身,所以不会作为 SSR 的一部分发生,因为服务器只能生成标记而不是 DOM 本身,如果使用 SSR,这是在它被发送到浏览器之后完成的
你说的与 DOM 的高级交互?Whaaaat??... 是的 - 在这一点上,因为 DOM 已经更新(但用户还没有在浏览器中看到更新),可以通过使用拦截实际绘制到屏幕上window.requestAnimationFrame
,然后执行诸如测量实际将输出的 DOM 元素,您可以对其执行进一步的状态更改,非常有用,例如动画到具有未知可变长度内容的元素的高度(因为您现在可以测量内容并为动画分配高度),或者避免在某些状态更改期间出现内容场景。
但是要非常小心地保护任何状态的变化,componentDid...
否则会导致无限循环,因为状态变化也会导致重新渲染,因此另一个componentDid...
等等
根据文档(https://facebook.github.io/react/docs/react-component.html)
以will为前缀的方法在某事发生之前被调用,并且
以did为前缀的方法在某事发生后立即被调用。