在渲染Component的所有子孙以滚动到其中一个子孙之后,我需要执行一段代码。结构如下:
`<GrandParent>
<IntermediateParent>
<IntermediateParent2>
<GrandChild/>
<GrandChild/>
<GrandChild/>
<GrandChild/>
</IntermediateParent2>
</IntermediateParent>
</GrandParent>`
GrandParent
的render方法如下所示:render() {
if (!this.props.listOfGrandchildren) { // still loading data from server
return <div>LOADING...</div>
}
return <IntermediateParent grandchildren={this.props.listOfGrandchildren} />
}
显然,由于
ComponentDidMount
显然是行不通的,因为从服务器加载数据后,子代会在以后的时间挂载。在这种情况下,GrandParent
的CDM将在任何GrandChild
的CDM之前触发我可以将一个方法从顶部传递到CDM会调用的每个
GrandChild
。在GrandParent上,我将等待所有GrandChild
通过使用计数器来调用该方法,一旦计数器等于孙子的数量,我就可以调用我的代码以滚动到所需的孙子,但这就像一个很多麻烦。我想在数据从服务器下降之前加载
GrandParent
,以呈现一个占位符/加载元素。我正在寻找一种更优雅的方法来解决这个问题。
更新:
Is componentDidMount of parent called after all componentDidMount of children?
我知道为什么
GrandChild
的CDM在只是看起来有不同的行为之后触发我的GrandParent
ren的CDM 最佳答案
最后,最整洁的解决方案是:
我在ComponentDidMount
上设置了IntermediateParent
(也可以与IntermediateParent2
一起使用),该调用调用设置标志loadedX = true
的动作创建者。
然后,在GrandParent
的ComponentWillReceiveProps
中等待loadedX
道具变为true。发生这种情况时,请手动调用所需的“回调”功能。我使用loadedX
将GrandParent
道具注入到connect
中。
希望这也可以帮助其他人。如果您需要更多详细信息,请在评论中提问。我还可以为一些更真实的示例提供一些代码。