我使用next.js作为我的React应用,因为它有服务器端呈现。当我通过日志检查时,方法ComponentWillMount
和getInitialProps
都在服务器端运行。所以我的问题是:这些方法之间有什么区别吗?我应该何时在ComponentWillMount
中投放,何时应该在getInitialProps
中投放。我没有看到Next.JS提到这件事。
答案 0 :(得分:71)
警告强> 50%的接受答案在这里是错误的,为什么,让我将我的答案分为两部分:
第1部分:
GetInitialProps通常是一个非常好的异步函数 服务器上的异步操作,并将数据传递给页面 道具。
- 醇>
在nextJs中,它总是在服务器上运行,如果使用Link调用页面,那么它只在客户端调用
错误,GetInitialProps在 BOTH 服务器和浏览器上执行(请记住Next.js的目标是制作通用JavaScript),这是文档所说的:
第2部分:
第二部分是更准确地回答实际问题,很明显OP在 ComponentDidMount 和 ComponentWillMount 之间感到困惑。因为在Next.js情况下,比较GetInitialProps VS ComponentDidMount更有意义,因为它们都能够进行异步调用以获取数据,并且它们也都允许后续渲染(在这种情况下不可能) ComponentWillMount )。
无论如何你使用其中一种,差别很小:
GetInitialProps :由Next.js提供,并不总是被触发,所以要小心,当你将1个组件包装在另一个组件中时会发生这种情况。如果父组件具有GetInitialProps,则永远不会触发子项的GetInitialProps,有关详细信息,请参阅this thread。
ComponentDidMount :是React实施,它总是在浏览器上触发。
你可能会问,“所以我何时应该使用这个或那个',实际上它非常混乱,同时非常简单,这是一个经验法则:
答案 1 :(得分:17)
<强> GetInitialProps 强>
GetInitialProps通常是一个异步函数,适用于
服务器上的异步操作,并将数据传递给页面
道具。
在nextJs中,它总是在服务器上运行,如果使用Link调用页面,则只在客户端调用它。
它只能用于不在组件中的页面。
ComponentWillMount
它是一个生命周期钩子,它在调用render方法之前被调用。在其中获取的数据不能作为prop传递。
可以在组件和页面中调用它。它不是一个进行异步调用的好地方,因为它不等待异步操作完成。因此,如果它在服务器上运行并且您的异步操作被写入其中..将无法完成,它将在没有获取数据的情况下进入客户端。
答案 2 :(得分:1)
componentWillMount
组件生命周期方法。
componentWillMount()
。它在render()
之前调用,因此在此方法中同步调用setState()
不会触发额外的渲染。通常,我们建议您使用constructor()
。
避免在此方法中引入任何副作用或订阅。对于这些用例,请改用componentDidMount()
。
这是服务器渲染上唯一的生命周期钩子。