ComponentDidMount của cha có được gọi sau tất cả componentDidMount của con không?


81

Tôi có mã dưới đây trong kết xuất phụ huynh của tôi

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

Và mã bên dưới trong Biểu đồ con của tôi

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

Tôi nghĩ rằng componentDidMount của cha mẹ chỉ được gọi sau khi tất cả các phần tử con được tải. Nhưng ở đây componentDidMount của cha được gọi trước componentDidMount của con.

Đây có phải là cách mọi thứ hoạt động? Hay tôi đang làm gì đó sai.

Nếu đây là cách mọi thứ hoạt động, làm cách nào để phát hiện khi tất cả các thành phần con được tải từ cha mẹ?


13
Các componentDidMount()phương pháp của các thành phần con được gọi trước đó của các thành phần cha mẹ : Liên kết .
Tahir Ahmed

1
Nhưng khi tôi console.log trong cả componentDidMount () cha và con. Văn bản cha mẹ hình thức console.log được in đầu tiên
Aakash Sigdel

Nó đang cho kết quả chính xác trong fiddle. Có thể là do tôi đang tìm nạp dữ liệu không đồng bộ trong componentDidMount của cha và sử dụng mảng được trả về từ lệnh gọi lặp qua OSMData con được trả về bởi lệnh gọi ajax.
Aakash Sigdel

yeah, vì vậy về cơ bản bạn đã sử dụng cha mẹ componentDidMount()để thực hiện một số thao tác (AJAX hoặc bất cứ điều gì) trước khi tải các thành phần con. Nếu các thành phần con của bạn đã được bố trí trong phần cha mẹ mà không phụ thuộc vào dữ liệu bên ngoài, thì phần tử con componentDidMount()sẽ được gọi trước phần tử cha mẹ.
Tahir Ahmed

Tôi đang đối mặt với vấn đề tương tự. Tải dữ liệu không đồng bộ phá vỡ chu kỳ componentDidMount () của tôi vì trình giữ chỗ được hiển thị đầu tiên. Tôi đoán không có cách nào để làm việc xung quanh. Có lẽ tái cấu trúc thành phần của tôi ...
larrydahooster

Câu trả lời:


70

Có, componentDidMountcon cái được gọi trước cha mẹ.

Chạy mã dưới đây!

tài liệu tuyên bố :

Được gọi một lần, chỉ trên máy khách (không phải trên máy chủ), ngay sau khi kết xuất ban đầu xảy ra. Tại thời điểm này trong vòng đời, bạn có thể truy cập bất kỳ tài liệu tham khảo nào cho con của bạn (ví dụ: để truy cập bản đại diện DOM cơ bản). Các componentDidMount()phương pháp của các thành phần con được gọi trước đó của các thành phần cha mẹ.

Điều này là do tại thời điểm hiển thị, bạn sẽ có thể tham chiếu đến bất kỳ nút nội bộ / nút con nào, việc cố gắng truy cập các nút mẹ không được chấp nhận.

Chạy mã dưới đây . Nó hiển thị đầu ra bảng điều khiển.

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
Bạn có thể cung cấp liên kết nói rằng The componentDidMount() method of child components is invoked before that of parent components, tôi không thể tìm thấy nó trong trang web phản ứng.
Hendra Uzia

Đây dường như không xuất hiện trong các tài liệu nữa, vì các tài liệu chỉ chính thức ive thấy trên componentDidMountđang ở đây: facebook.github.io/react/docs/...
Chris W.

sửa lại nó trong phiên bản cũ hơn của docs github.com/facebook/react/blob/v15.0.1/docs/docs/…
Blair Anderson

FWIW componentWillMount () của cha SẼ được gọi trước một trong các quy trình componentWillMount () hoặc componentDidMount () của con, vì vậy đó là nơi bạn muốn thực thi bất kỳ mã nào cần sẵn sàng ở đó. Điều điên rồ hơn nữa là ngay cả khi bạn có một câu lệnh trong cha của bạn hiển thị như sau: {codeThatNeedsToBeRunFirstBoolean? <mycomponent />: null} và codeThatNeedsToBeRunFirstBoolean là false, componentDidMount () trên mycompoment vẫn được gọi.
Dave Cole
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.