Tôi có một usecase nơi tôi cần phải tháo gắn kết thành phần phản ứng của tôi. Nhưng trong một số trường hợp, thành phần phản ứng cụ thể được tháo lắp bằng một chức năng khác. Do đó, tôi cần kiểm tra xem thành phần có được gắn trước khi tháo gắn nó hay không.Có cách nào để kiểm tra xem thành phần phản ứng đã được tháo chưa?
Trả lời
Kể từ isMounted()
đã được chính thức phản đối, bạn có thể làm điều này trong thành phần của bạn:
componentDidMount() {
this._ismounted = true;
}
componentWillUnmount() {
this._ismounted = false;
}
mô hình này của việc duy trì biến state
của riêng bạn là chi tiết trong tài liệu ReactJS: https://facebook.github.io/react/blog/2015/12/16/ismounted-antipattern.html
tôi phát hiện ra rằng thành phần sẽ được bỏ gắn kết, tạo điền vào ô này
if(!this._calledComponentWillUnmount)this.setState({vars});
Tôi đã đến đây vì tôi đang tìm cách ngăn chặn polling
API.
react docs không bao gồm trường hợp websocket
, nhưng không bao gồm trường hợp bỏ phiếu.
Cách tôi làm việc xung quanh nó
// React component
let allowPolling = true
React.createClass({
poll() {
if (!allowPolling) {
return
}
// otherwise, call the api
}
componentWillMount() {
allowPolling = true
}
componentWillUnmount() {
allowPolling = false
}
})
nó hoạt động. Hy vọng nó giúp
Xin vui lòng, cho tôi biết nếu bạn biết bất kỳ trường hợp thử nghiệm thất bại cho điều này =]
Tôi nghĩ rằng Shubham Câu trả lời là một cách giải quyết đề nghị của phản ứng cho những người mà cần phải chuyển mã của họ ngừng sử dụng các isMounted
chống mẫu.
Điều này không hẳn là xấu, nhưng đáng để liệt kê các giải pháp thực sự cho vấn đề này.
The article linked by Shubham cung cấp 2 đề xuất để tránh mẫu chống này. Một trong những bạn cần phụ thuộc vào lý do tại sao bạn đang gọi setState khi các thành phần được unmounted.
nếu bạn đang sử dụng một cửa hàng Flux trong thành phần của bạn, bạn phải ngừng đăng ký trong componentWillUnmount
class MyComponent extends React.Component {
componentDidMount() {
mydatastore.subscribe(this);
}
render() {
...
}
componentWillUnmount() {
mydatastore.unsubscribe(this);
}
}
Nếu bạn sử dụng ES6 hứa hẹn, bạn có thể cần phải quấn lời hứa của mình để làm cho nó có thể hủy bỏ.
const cancelablePromise = makeCancelable(
new Promise(r => component.setState({...}}))
);
cancelablePromise
.promise
.then(() => console.log('resolved'))
.catch((reason) => console.log('isCanceled', reason.isCanceled));
cancelablePromise.cancel(); // Cancel the promise
Đọc về nhiều makeCancelable
trong bài viết liên kết.
Tóm lại, đừng cố gắng vá lỗi này bằng cách đặt biến và kiểm tra xem thành phần có được gắn kết hay không, đi tới gốc của sự cố. Hãy bình luận với các trường hợp thông thường khác nếu bạn có thể đưa ra bất kỳ trường hợp nào.
- 1. Cách kiểm tra xem WaitHandle đã được đặt chưa?
- 2. Cách kiểm tra xem LogWriter đã được đặt chưa?
- 3. Có cách nào để kiểm tra xem android WindowManager đã có chế độ xem chưa?
- 4. Cách kiểm tra xem thư đã được gửi thành công chưa
- 5. Làm cách nào để kiểm tra xem thiết bị USB đã được cắm chưa?
- 6. Làm cách nào để kiểm tra xem máy quét đã được cắm chưa (C#, .NET TWAIN)
- 7. Kiểm tra xem hằng số đã được xác định chưa
- 8. Làm cách nào để kiểm tra xem CGPoint đã được khởi tạo chưa?
- 9. Làm cách nào để kiểm tra xem jQuery đã có trong bộ nhớ cache chưa?
- 10. Cách kiểm tra xem một viewStub đã tăng cao chưa?
- 11. Kiểm tra xem e-mail đã được nhập đúng chưa
- 12. Làm cách nào để kiểm tra xem mô-đun Perl đã được cài đặt chưa?
- 13. Làm cách nào để kiểm tra xem session_start đã được nhập chưa?
- 14. Làm cách nào để kiểm tra xem biến `let` đã được khai báo trên ES6 chưa?
- 15. Làm cách nào để kiểm tra xem biến đã được khởi tạo chưa
- 16. Làm cách nào để kiểm tra xem biến Smarty đã được gán chưa?
- 17. Làm thế nào để kiểm tra xem một sợi đã hoàn thành trong Rust chưa?
- 18. Cách kiểm tra xem tài liệu đã sẵn sàng chưa?
- 19. Cách tốt nhất để kiểm tra xem UIAlertController đã được trình bày chưa?
- 20. Làm thế nào để kiểm tra xem re.sub() đã thay thế thành công trong python chưa?
- 21. Python Selenium: Cách kiểm tra xem WebDriver đã thoát() chưa?
- 22. Cách kiểm tra Backbone.history đã được bắt đầu chưa?
- 23. Kiểm tra xem phần tử đã có bộ đếm date jQuery chưa
- 24. Làm thế nào để kiểm tra xem một FB AppRequest đã được nhấp vào hay chưa?
- 25. NHibernate có thể kiểm tra xem lược đồ db đã được tạo chưa?
- 26. Làm thế nào để bạn kiểm tra xem một trường hợp realm đã được đóng chưa?
- 27. Làm thế nào để kiểm tra xem hình ảnh đã được tải bằng Javascript chưa?
- 28. Kiểm tra xem các thành phần hình ảnh của Windows đã được cài đặt chưa (đăng ký wic)
- 29. Làm thế nào để kiểm tra xem tai nghe đã được cắm vào hay chưa?
- 30. Thuật toán nào nhanh hơn để kiểm tra xem một bit đã được đặt chưa?
Cảm ơn mẹo ... từ tài liệu ... Chỉ cần đặt thuộc tính _isMounted thành true trong componentDidMount và đặt thành false trong componentWillUnmount ... tuy nhiên, bằng cách sử dụng tính năng này.setState ({mounted: false}); có thể kích hoạt quá muộn để ngăn chặn cảnh báo vì thay đổi trạng thái không xảy ra ngay lập tức - tốt hơn là chỉ sử dụng thuộc tính lớp cho điều này ... this.mounted = false - thanks tho, điều này đã chỉ cho tôi đúng hướng – danday74
@ danday74, vâng bạn đúng. Có lẽ tôi đã bỏ lỡ điểm khi tôi viết câu trả lời. Xem xét upvoting câu trả lời nếu nó đã giúp –
Vâng tôi upvoted nó 10 ngày trước :) – danday74