在我的反应应用程序中,我有一个app.jsx
组件,我在其中执行基本功能,例如获取窗口大小,通过调用API函数读取用户信息等。
这实际上是入口点的顶级组件。这就是我的切入点:
render (
<Provider store={store}>
<App>
<HomePageComponent />
</App>
</Provider>,
document.getElementById('app')
);
我感到困惑的是,在主页组件中,我有一堆子组件。看起来主页内的子组件的componentDidMount()
函数正在执行 componentDidMount()
组件的App
函数之前。
这是应该的方式吗?从里到外?我正在设置一些基本的内务管理功能,例如在App
组件中获取用户信息,认为它将首先执行。
答案 0 :(得分:1)
是的,这是应该的方式。这不是一个像JSX那样的React问题。 JSX只是转换为函数调用。例如,您的代码变为:
React.createElement(
Provider,
{ store: store },
React.createElement(
App,
null,
React.createElement(HomePageComponent, null)
)
);
就像下面这样:
doSomethingSecond(doSomethingFirst());
在该示例中,doSomethingFirst
将首先执行,结果将作为参数传递给doSomethingSecond
。类似地,在JSX转换的代码中,React.createElement(HomePageComponent, null)
将首先执行,结果将作为参数传递给包装React.createelement
调用,依此类推。
您可以更好地了解JSX如何在Babel's site上转换为JS。
答案 1 :(得分:0)
是的,这是预期的行为。在this问题中有关于它的讨论。
一些亮点:
如果componentDidMount执行parent-first,那么你唯一能找到的就是你的节点,因为此时所有子节点都没有被挂载。这使得componentDidMount对大多数用例无用(例如,计算offsetWidth,附加第三方非React插件等)。的(gaearon)强>
这不是一个错误,但可能令人困惑的文档。它是DOM元素的创建顺序。它与文档中的内容无关,因为无论如何我们无法保证(因为根目录可能不在文档中)。的(sebmarkbage)强>
从技术上讲,生命周期方法只能保证您的特定组件已安装。对于它的孩子,它没有做出任何承诺。依赖此顺序通常表明您正在打破组件的封装边界。的(sebmarkbage)强>
答案 2 :(得分:0)
使用
constructor()方法,用于加载cookings的初始操作。 稍后提供你的componentDidMount()操作等等。
为了更好地理解,请参阅 React Component Life Cycle