Чи викликається компонентDidMount з батьків після всіх компонентівДідМаунт дочірніх?


81

У моєму візуалізації батьків є код нижче

<div>           
{
    this.state.OSMData.map(function(item, index) {
        return <Chart key={index} feature={item} ref="charts" />
    })
}
</div>

І код нижче в моїй дитячій таблиці

<div className="all-charts">
    <ChartistGraph data={chartData} type="Line" options={options} />
</div>

Я думав, що батьківський компонентDidMount викликається лише після завантаження всіх дочірніх елементів. Але тут компонентDidMount батьківського викликається перед компонентомDidMount дочірнього.

Це так працює? Або я роблю щось не так.

Якщо все так працює, як я можу визначити, коли всі дочірні компоненти завантажуються з батьківського?


13
componentDidMount()Метод дочірніх компонентів викликаються до того , батьківські компоненти : Посилання .
Тахір Ахмед

1
Але коли я console.log і в батьківському, і в дочірньому компонентіDidMount (). Спочатку друкується текстова форма батьків console.log
Aakash Sigdel

Це дає правильний результат у скрипці. Можливо, це тому, що я отримую асинхронізацію даних у компоненті батьківського компонента і використовую масив, повернутий із виклику до циклу дочірньої OSMData, повертається викликом ajax.
Aakash Sigdel

так, отже, ви в основному використовували батьківські засоби componentDidMount()для виконання деяких маніпуляцій (AJAX або що завгодно) перед завантаженням дочірніх компонентів. Якщо ваші дочірні компоненти вже були викладені у батьківському режимі без залежності від зовнішніх даних, тоді дочірній componentDidMount()виклик буде викликаний раніше батьківського.
Тахір Ахмед

Я стикаюся з тією ж проблемою. Асинхронне завантаження даних порушує мій цикл componentDidMount (), оскільки спочатку відображається заповнювач. Я думаю, що немає способу обійтись. Можливо, реструктуризувати мої компоненти ...
larrydahooster

Відповіді:


70

Так, componentDidMountдіти викликаються перед батьками.

Запустіть код нижче!

в документації зазначено :

Викликається один раз, лише на клієнті (не на сервері), відразу після того, як відбувається початковий візуалізація. На цьому етапі життєвого циклу ви можете отримати доступ до будь-яких посилань для своїх дітей (наприклад, для доступу до базового представлення DOM). componentDidMount()Метод дочірніх компонентів викликаються до того , батьківські компоненти.

Це пов’язано з тим, що під час рендерингу ви повинні мати можливість посилатися на будь-які внутрішні / дочірні вузли, і спроба отримати доступ до батьківських вузлів не приймається.

Запустіть код нижче . Він показує вихід консолі.

var ChildThing = React.createClass({
  componentDidMount: function(){console.log('child mount')},
  render: function() {
    return <div>Hello {this.props.name}</div>;
  }
});

var Parent = React.createClass({
  componentDidMount: function(){console.log('parent')},
  render: function() {
    return <div>Sup, child{this.props.children}</div>;
  }
});

var App = React.createClass({
  componentDidMount: function(){console.log('app')},
  render: function() {
    return (
      <div>
        <Parent>
          <ChildThing name="World" />
        </Parent>
      </div>
    );
  }
});

ReactDOM.render(
  <App />,
  document.getElementById('container')
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="container">
    <!-- This element's contents will be replaced with your component. -->
</div>


1
Не могли б ви надати посилання, в якому сказано The componentDidMount() method of child components is invoked before that of parent components, що я не міг знайти його на сайті реакції.
Hendra Uzia

Здається, це більше не відображається в документах, оскільки єдині офіційні документи, які я бачу, componentDidMountзнаходяться тут: facebook.github.io/react/docs/…
Кріс В.

правильно, це було в попередній версії документів github.com/facebook/react/blob/v15.0.1/docs/docs/…
Блер Андерсон

FWIW componentWillMount () батьківського ВИКЛИКАТИСЯ перед будь-якою з дочірніх процедур componentWillMount () або componentDidMount (), тому саме тут ви хочете виконати будь-який код, який повинен там бути готовим. Ще більш божевільним є те, що навіть якщо у вашого батька є вираз, який відображається так: {codeThatNeedsToBeRunFirstBoolean? <mycomponent />: null}, а кодThatNeedsToBeRunFirstBoolean хибний, компонентDidMount () на mycompoment все одно викликається.
Дейв Коул
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.