Is componentDidMount lifecycle method independent from sibling components? From example below it seems like it is invoked only after all sibling components have been mounted.
Let's say we have a top level component which renders 2 child components, first having simple render() and another having relatively slower render().
Sample to reproduce: https://codesandbox.io/s/j43klml9py?expanddevtools=1
TL;DR:
class SlowComponent extends Component {
  componentDidMount() {
    // perf mark
  }
  render() {
    // Simulate slow render
    // Takes 50ms
    return <h3>Slow component</h3>;
  }
}
class FastComponent extends Component {
  componentDidMount() {
    // perf mark
  }
  render() {
    return <h3>Fast component</h3>;
  }
}
class App extends Component {
  constructor(props) {
    super(props);
    // perf mark start
  }
  componentDidMount() {
    // perf mark
    // measure all marks and print
  }
  render() {
    return (
      <div>
        <FastComponent />
        <SlowComponent />
      </div>
    );
  }
}
ReactDOM.render(<App />, document.getElementById('root'));
I expect componentDidMount timings to be like this:
FastComponent10 msSlowComponent50 msApp52 ms
But in reality what I get is both fast and slow component componentDidMount callbacks are fired at the same time, i.e.
FastComponent50 msSlowComponent51 msApp52 ms
Current sample and repro code uses mount callback but same applies to componentDidUpdate.
Full source:
import ReactDOM from "react-dom";
import React, { Component } from "react";
class SlowComponent extends Component {
  componentDidMount() {
    performance.mark("slow-mounted");
  }
  render() {
    // Simulate slow render
    for (var i = 0; i < 10000; i++) {
      for (var j = 0; j < 100; j++) {
        const b = JSON.parse(
          JSON.stringify({
            test: "test" + i,
            test1: i * i * i
          })
        );
      }
    }
    return <h3>Slow component</h3>;
  }
}
class FastComponent extends Component {
  componentDidMount() {
    performance.mark("fast-mounted");
  }
  render() {
    return <h3>Fast component</h3>;
  }
}
class App extends Component {
  constructor(props) {
    super(props);
    performance.mark("init");
  }
  componentDidMount() {
    performance.mark("app-mounted");
    performance.measure("slow", "init", "slow-mounted");
    performance.measure("fast", "init", "fast-mounted");
    performance.measure("app", "init", "app-mounted");
    console.clear();
    console.log(
      "slow",
      Math.round(performance.getEntriesByName("slow")[0].duration)
    );
    console.log(
      "fast",
      Math.round(performance.getEntriesByName("fast")[0].duration)
    );
    console.log(
      "app",
      Math.round(performance.getEntriesByName("app")[0].duration)
    );
    performance.clearMarks();
    performance.clearMeasures();
  }
  render() {
    return (
      <div>
        <h1>Demo</h1>
        <FastComponent />
        <SlowComponent />
      </div>
    );
  }
}
ReactDOM.render(<App />, document.getElementById("root"));