Tiêu đề nói lên tất cả. Tôi hiểu tại sao lại componentDidMountphù hợp với bất kỳ thứ gì yêu cầu quyền truy cập DOM, nhưng yêu cầu AJAX không nhất thiết hoặc thường cần điều này.
Đưa cái gì?
Tiêu đề nói lên tất cả. Tôi hiểu tại sao lại componentDidMountphù hợp với bất kỳ thứ gì yêu cầu quyền truy cập DOM, nhưng yêu cầu AJAX không nhất thiết hoặc thường cần điều này.
Đưa cái gì?
Câu trả lời:
componentDidMountlà cho các phản ứng phụ. Thêm trình nghe sự kiện, AJAX, thay đổi DOM, v.v.
componentWillMounthiếm khi hữu ích; đặc biệt nếu bạn quan tâm đến kết xuất phía máy chủ (thêm trình xử lý sự kiện gây ra lỗi và rò rỉ, và nhiều thứ khác có thể xảy ra sai sót).
Có một cuộc thảo luận về việc loại bỏ componentWillMountkhỏi các thành phần lớp vì nó phục vụ cùng mục đích với hàm tạo. Nó sẽ vẫn còn trên createClasscác thành phần.
componentWillMount? Tôi không thực sự thấy sự khác biệt.
componentWillMountsẽ được thực thi trên bản kết xuất phía máy chủ. Bánh xe nếu bạn đang sử dụng componentDidMountthì điều đó sẽ chỉ được thực hiện trên máy khách. Do đó, đặt những thứ componentWillMountthực hiện các tương tác bên ngoài hoặc liên kết với các sự kiện, v.v., không phải là một ý tưởng tuyệt vời. Nếu bạn không có kế hoạch hiển thị các thành phần của mình trên máy chủ, nó vẫn không phải là một ý tưởng hay chỉ vì khả năng di động của mã. Tất cả đều nằm ngoài lý do chính khiến nó tệ được giải thích trong câu trả lời của @daniula.
Tôi cũng gặp vấn đề tương tự ngay từ đầu. Tôi đã quyết định thử đưa ra các yêu cầu componentWillMountnhưng cuối cùng lại gặp nhiều vấn đề nhỏ khác nhau.
Tôi đã kích hoạt hiển thị khi cuộc gọi ajax kết thúc với dữ liệu mới. Tại một số thời điểm, việc hiển thị thành phần mất nhiều thời gian hơn là nhận được phản hồi từ máy chủ và tại thời điểm này, lệnh gọi lại ajax đang kích hoạt hiển thị trên thành phần chưa được gắn kết. Đây là loại vỏ có cạnh nhưng có lẽ còn nhiều hơn nữa, vì vậy sẽ an toàn hơn khi sử dụng componentDidMount.
componentWillMount, vì vậy bạn vẫn nên tiếp tục sử dụng componentDidMountcho các cuộc gọi ajax của mình.
setStatemột hàm tạo thành phần và bạn không có cách nào xác định khi nào lệnh gọi AJAX sẽ hoàn tất. twitter.com/dan_abramov/status/576453138598723585
Theo tài liệu, cài đặt trạng thái trong componentWillMountsẽ không kích hoạt hiển thị lại. Nếu lệnh gọi AJAX không bị chặn và bạn trả về một Promisecập nhật trạng thái của thành phần thành công, thì có khả năng phản hồi đến sau khi thành phần đã được hiển thị. Như componentWillMountkhông kích hoạt kết xuất lại, bạn sẽ không có hành vi như bạn mong đợi, đó là thành phần đang được hiển thị với dữ liệu được yêu cầu.
Nếu bạn sử dụng bất kỳ thư viện thông lượng nào và dữ liệu được yêu cầu kết thúc trong cửa hàng mà thành phần được kết nối (hoặc kế thừa từ một thành phần được kết nối) thì điều này sẽ không thành vấn đề vì việc nhận dữ liệu đó, rất có thể, sẽ thay đổi đạo cụ cuối cùng.
componentWillMountkhông kích hoạt kết xuất lại chỉ vì một trạng thái mới được xác định trước kết xuất đầu tiên. Nhưng nếu setStateđược gọi trong lệnh gọi lại AJAX, nó chắc chắn sẽ được gọi sau lần kết xuất đầu tiên và nó sẽ kích hoạt kết xuất lại.
componentWillMountđó sẽ thất bại vì thành phần đó ... không gắn kết.