Tiêu đề nói lên tất cả. Tôi hiểu tại sao lại componentDidMount
phù 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 componentDidMount
phù 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:
componentDidMount
là cho các phản ứng phụ. Thêm trình nghe sự kiện, AJAX, thay đổi DOM, v.v.
componentWillMount
hiế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ỏ componentWillMount
khỏ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 createClass
các thành phần.
componentWillMount
? Tôi không thực sự thấy sự khác biệt.
componentWillMount
sẽ đượ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 componentDidMount
thì điều đó sẽ chỉ được thực hiện trên máy khách. Do đó, đặt những thứ componentWillMount
thự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 componentWillMount
như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 componentDidMount
cho các cuộc gọi ajax của mình.
setState
mộ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 componentWillMount
sẽ 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 Promise
cậ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ư componentWillMount
khô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.
componentWillMount
khô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.