2 回答
TA贡献1786条经验 获得超13个赞
这就是 react 的工作方式。
render()每次更新都会调用生命周期方法。而且它之前也被调用过componentDidMount。根据生命周期名称componentDidMount意味着在组件安装后调用函数。并且由于组件已经获得mounted,所以render()方法已经在方法之前被调用componentDidMount。
因此,当您第一次获得空白数据时,即 before componentDidMount,render()以初始状态被调用,即,[]
第二次,可能在weekAgendaLogicHandler()函数中可能正在更新某些东西,因为它再次render()被空白[]数组调用,即初始状态。
现在,第三次,this.setState 正在发生状态正在更新,然后render()您将获得所需的数组。
所以,这就是render()生命周期方法的工作原理。
现在,如果您只想使用render数据而不是null数据。然后,您可以显示某种加载程序。
IE,
render(){
if(this.state.currentMonth.length){
return(
<div className="App">
<h1>Testing componentDidMount</h1>
</div>
)
}
else{
return(
<p>Loading data...</p>
)
}
}
TA贡献1817条经验 获得超6个赞
不确定我是否理解您想要完成的任务?也许看看之后的状态如何this.calendarLogicHandler(); this.weekAgendaLogicHandler();?
如果是这种情况,请使用componentDidUpdate. componentDidMount你只能看到组件在 dom 中挂载时的状态。
所以你console.log按照这个顺序做并不重要:
this.calendarLogicHandler();
this.weekAgendaLogicHandler();
console.log(
"getting current month in componentDidMount",
this.state.currentMonth
);
...您仍然像以前一样记录状态并被解雇calendarLogicHandler。weekAgendaLogicHandler
更新:
如果你不想打电话weekAgendaLogicHandler(componentDidMount因为你还没有你需要的状态),那么你可以使用这样的东西:
componentDidUpdate(prevProps, prevState) {
if(/* check that state is previously updated by `calendarLogicHandler` */) {
this.weekAgendaLogicHandler();
}
}
但是,使用大量时间(挂钩到生命周期事件)会使您的代码变得不必要的复杂。如果我是你,会选择使用setState回调来调用this.weekAgendaLogicHandler();
添加回答
举报