У меня есть компонент с именем Parent , внутри которого есть еще один компонент с именем Child :
<Parent>
<Child/>
</Parent>
Таким образом, жизненный цикл выглядит следующим образом:
- Родительский конструктор
- Родительский рендер ()
- Дочерний конструктор
- Дочерний рендер ()
- Дочерний монтируется
- Родитель установлен
Можно ли как-нибудь выполнить дополнительную инициализацию Родителя после шага 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
определяет последовательность инициализации.Я должен инициализировать Parent сразу после того, как он появится в DOM, перед созданием любого дочернего элемента.
Если быть более точным, Parent
и Child
совместно используют один и тот же экземпляр класса ThirdPartyLib
.Я не могу поместить логику инициализации в функцию render()
Родителя, так как элемент еще не находится в DOM.Аналогично, я не могу инициализировать Parent
перед Child
, как это предлагается в комментариях через componentDidMount()
, поскольку Child
componentDidMount()
выполняется до Parent
.