【发布时间】:2019-06-10 16:12:44
【问题描述】:
我有一个叫Parent的组件,里面还有一个叫Child的组件:
<Parent>
<Child/>
</Parent>
所以生命周期如下:
- 父构造函数
- 父级的 render()
- 子构造函数
- 孩子的 render()
- 孩子上车了
- 父级已挂载
我可以在第 2 步之后和第 3 步之前以某种方式进行额外的父初始化吗?
更新:
class ThirdPartyLib {
init(elementId) {
console.log(`initializing element: ${elementId}`);
// element with #id: elementId should exist!
// document.getElementById(elementId).style.color = "red";
}
}
class Parent extends React.Component {
constructor(props) {
super(props);
console.log("Parent's constructor");
}
render() {
console.log("rendering Parent");
new ThirdPartyLib().init("parent");
return (
<div id="parent">Parent: {this.props.name}
<Child name="Sara"/>
</div>
);
}
componentDidMount() {
console.log("Parent is mounted");
}
}
class Child extends React.Component {
constructor(props) {
super(props);
console.log(`Child ${this.props.name} constructor`);
}
render() {
console.log(`rendering Child: ${this.props.name}`);
return <div>Child: {this.props.name}</div>
}
componentDidMount() {
console.log(`Child ${this.props.name} is mounted`);
}
}
ReactDOM.render(<Parent name="Bob"/>, document.getElementById("app"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="app"></div>
在这里我做了一些简化——我不只是改变元素的颜色,我可以在componentDidMount() 方法中实现它。相反,ThirdPartyLib 的细节决定了初始化顺序。在创建任何子元素之前,我必须在父元素出现在 DOM 之后立即对其进行初始化。
更具体地说,Parent 和 Child 共享完全相同的 ThirdPartyLib 类实例。我无法将初始化逻辑放入 Parent 的 render() 函数中,因为该元素尚未在 DOM 中。同样,我无法在 Child 之前通过 componentDidMount() 建议在 cmets 中初始化 Parent,因为 Child 的 componentDidMount() 在 Parent 之前执行。
【问题讨论】:
-
什么样的初始化?什么函数调用?请更具体并解释您的情况。代码可以放在Parent的
render中,但要视情况是否合适。这可能是 XY 问题。 -
父级的渲染在子级的渲染完成之前无法完成,因为父级的标记是由子级的标记组成的。我不明白这怎么可能。
-
@estus 我正在使用第 3 方库,它需要元素的 #id 作为输入参数。 html 元素由 Parent 的
render()方法创建。我不能等到父母的componentDidMount()被执行,因为为时已晚。我也不能将初始化放在render()函数中,因为该元素还不存在(在 DOM 中)。 -
你有 XY 问题。您描述的事情应该发生在 componentDidMount 中。无论问题是什么,都应该从那方面解决。请使用特定代码更新问题。该解决方案可能特定于您使用的库。见stackoverflow.com/help/mcve。
-
@estus 查看更新后的问题。
标签: reactjs react-component react-lifecycle