Tốt nhất là sử dụng callback trong Router.run
(http://rackt.github.io/react-router/#Router.run). Gọi lại bạn vượt qua để mà được gọi là bất cứ khi nào thay đổi url, và đó là trách nhiệm tái dựng hình, giống như ví dụ này lấy từ trang:
Router.run(routes, function (Root) {
// whenever the url changes, this callback is called again
React.render(<Root/>, document.body);
});
Trong chức năng đó, bạn có thể làm bất kỳ hoạt động async bạn cần trước khi gọi React.render()
, như sau:
Router.run(routes, function (Root) {
// whenever the url changes, this callback is called again
asyncStuff().then(function (data) {
React.render(<Root data={data} />, document.body);
});
});
Vấn đề với cách tiếp cận này là giao diện người dùng của bạn sẽ không phản ứng cho đến khi có dữ liệu đó. Thay vào đó, tôi khuyên bạn nên kết xuất thành phần của bạn với trạng thái trống và tìm nạp dữ liệu trong componentDidMount
rồi tái xuất hiện khi dữ liệu được nhập. Hoặc thậm chí tốt hơn, tách dữ liệu tìm nạp và hiển thị thành hai thành phần. Một thành phần tìm nạp dữ liệu và chuyển thành thành phần hiển thị dưới dạng thuộc tính. Các thành phần dữ liệu lấy thậm chí có thể tránh render các thành phần khác, trừ khi dữ liệu ở đó, một cái gì đó như:
render: function() {
if (this.state.data) {
return <TheComponent data={this.state.data} />;
} else {
return <Spinner />;
}
}
Đây là một mô hình phổ biến ở Phản ứng, với các thành phần mà đề với dữ liệu lấy và tiểu bang, và các thành phần mà làm cho tách trạng thái đó. Bạn muốn đẩy các thành phần có trạng thái lên cấp bậc cao nhất có thể bởi vì nó tạo ra một ranh giới logic. Các thành phần stateful là nơi mà 90% các lỗi xảy ra, và nó là tốt đẹp để có thể tập trung vào những người khi bạn đang săn lỗi.
Một vấn đề khác khi chờ đợi là người dùng có thể điều hướng nhanh chóng, nghĩa là cuộc gọi lại Router.run
được gọi lại trước khi dữ liệu đầu tiên được đưa vào. Vì vậy, bạn cần đảm bảo bạn hủy thao tác cuối cùng và không hiển thị điều đó.
Tôi thực sự đã kết thúc viết một giải pháp mà nó bắt chước mẫu phân giải của ui-router. Tôi sẽ chia sẻ như một câu trả lời ngay –
@MohamedElMahallawy Tôi thực sự sẽ quan tâm đến câu trả lời này mà bạn hứa sẽ "chia sẻ ngay" ... :-) – jbandi
Câu trả lời hay. Áp dụng cho tôi khi tôi đang học React đến từ một nền Angular. Chúng ta nên làm mọi thứ theo cách phản ứng trong mọi trường hợp ... Vì vậy, phương pháp Router.run đã hết câu hỏi. Nhưng những câu trả lời/câu hỏi đó giúp dễ dàng chuyển đổi cho chúng tôi, những người có góc cạnh. :) –