Javascript 是什么决定了这些组件的顺序'';安装';函数执行?
在我的代码中,Javascript 是什么决定了这些组件的顺序'';安装';函数执行?,javascript,reactjs,Javascript,Reactjs,在我的代码中,app是最高的(功能)组件。它呈现的是piggybank(这是一个类组件),它呈现的是piggychild(这是一个功能组件) 每个组件“console.logs”自身的名称(在类组件的render方法中;对于功能组件,仅在函数中),并具有“mount”函数(对于类组件,这意味着一个componentDidMount方法;对于函数组件,这意味着一个useffecthook,其回调的第二个参数是空数组),它将'mount'记录到控制台 如图所示,PiggyBank的挂载首先启动,
app
是最高的(功能)组件。它呈现的是piggybank
(这是一个类组件),它呈现的是piggychild
(这是一个功能组件)
每个组件“console.logs”自身的名称(在类组件的render
方法中;对于功能组件,仅在函数中),并具有“mount”函数(对于类组件,这意味着一个componentDidMount
方法;对于函数组件,这意味着一个useffect
hook,其回调的第二个参数是空数组),它将'mount'
记录到控制台
如图所示,
PiggyBank
的挂载首先启动,然后是PiggyChild
,然后是App
React中是否有规则管理组件“装载”函数的发生顺序
或者仅仅知道挂载函数发生在呈现所有组件之后就足够了吗?useEffect与componentDidMount的时间不同。最接近CDM的钩子实际上是useLayoutEffect 这里有一点来自: 他们在不同的时间跑步 首先,让我们讨论每个.componentDidMount运行的时间 组件挂载后。如文档所述,如果您设置状态 立即(同步)然后React知道如何触发额外的 渲染并使用第二个渲染的响应作为初始UI,以便 用户看不到闪烁。假设您需要读取一个屏幕的宽度 具有componentDidMount的DOM元素,并希望更新状态以反映 宽度。想象一下这一系列事件:
const{useffect,useLayoutEffect}=React;
函数App(){
console.log('App');
使用LayoutEffect(()=>console.log('App LayoutEffect'),[]);
useffect(()=>console.log('appeffect'),[]);
返回;
}
类PiggyBank扩展React.Component{
componentDidMount(){
console.log('PiggyBank Mount');
}
render(){
console.log(“PiggyBank”);
返回
}
}
函数PiggyChild(){
console.log('PiggyChild');
使用LayoutEffect(()=>console.log('PiggyChild LayoutEffect'),[]);
useffect(()=>console.log('PiggyChild Effect'),[]);
返回;
}
ReactDOM.render(,document.getElementById('root'))
实际上它是绝对有意义的,层次结构中的使用效果顺序与componentDidMount中的相同。 问题是,当所有子事件都挂载时(因此您将看到第一个子事件,然后只有父事件),componentDidMount将激发,其顺序与您看到的顺序相同
有关componentDidMount顺序的更多详细信息,您可以在这里看到-是的,我对此也很好奇。但可能useEffect返回函数在顺序方面与componentDidMount函数的工作方式不完全相同。因此,可能只使用一种类型的组件测试会更准确。添加太多组件会使事情变得复杂
useLayoutEffect
。如果您的示例只包括componentDidMount
和useEffect
的App
,PiggyBank
和PiggyChild
。然后解释了为什么,useLayoutEffect与componentDidMount运行在同一时间。总之,我添加了您要求的内容。您需要吗我可能误读了我得到的结果。当谈到“装载”时,我得到了中间;底部;顶部。你链接的文章只讨论类组件,而我的示例的特点是类和函数组件的混合