Phương pháp một: Sử dụng API trình duyệt cũ - Navigator.onLine
Trả về trạng thái trực tuyến của trình duyệt. Tài sản trả về một giá trị boolean, với ý nghĩa thực sự trực tuyến và ý nghĩa sai ngoại tuyến. Thuộc tính sẽ gửi các bản cập nhật bất cứ khi nào khả năng kết nối với mạng của trình duyệt thay đổi. Cập nhật xảy ra khi người dùng theo liên kết hoặc khi tập lệnh yêu cầu một trang từ xa. Ví dụ: tài sản sẽ trả về false khi người dùng nhấp vào liên kết ngay sau khi họ mất kết nối internet.
Bạn có thể thêm nó vào vòng đời thành phần của bạn:
Chơi với mã bên dưới bằng các công cụ phát triển Chrome - chuyển "Trực tuyến" sang "Ngoại tuyến" trong tab Mạng.
class App extends React.PureComponent {
state = { online: window.navigator.onLine }
componentDidMount() {
window.addEventListener('offline', this.handleNetworkChange);
window.addEventListener('online', this.handleNetworkChange);
}
componentWillUnmount() {
window.removeEventListener('offline', this.handleNetworkChange);
window.removeEventListener('online', this.handleNetworkChange);
}
handleNetworkChange = () => {
this.setState({ online: window.navigator.onLine });
}
render() {
return (
<div>
{ this.state.online ? 'you\'re online' : 'you\'re offline' }
</div>
);
}
}
ReactDOM.render(
<App />
, document.querySelector('#app'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="app"></div>
Tuy nhiên, tôi nghĩ rằng đây không phải là những gì bạn muốn, bạn muốn một trình xác nhận kết nối thời gian thực.
Phương pháp hai: Kiểm tra kết nối internet bằng cách sử dụng nó
Xác nhận chắc chắn duy nhất bạn có thể nhận được nếu kết nối internet bên ngoài đang hoạt động là bằng cách sử dụng nó. Câu hỏi là máy chủ nào bạn nên gọi để giảm thiểu chi phí?
Có nhiều giải pháp trên internet cho việc này, bất kỳ điểm cuối nào phản hồi với trạng thái 204 nhanh là hoàn hảo, ví dụ:
- gọi tới máy chủ Google (vì đây là máy chủ được thử nghiệm nhiều nhất (?))
- gọi điểm cuối tập lệnh JQuery được lưu trong bộ nhớ cache của nó (vì vậy ngay cả khi máy chủ không hoạt động, bạn vẫn có thể nhận được tập lệnh miễn là bạn có kết nối)
- hãy thử tìm nạp hình ảnh từ một máy chủ ổn định (ví dụ: https://ssl.gstatic.com/gb/images/v1_76783e20.png + dấu thời gian ngày để ngăn chặn bộ đệm)
IMO, nếu bạn đang chạy ứng dụng React này trên máy chủ, việc gọi đến máy chủ của bạn là hợp lý nhất, bạn có thể gọi yêu cầu tải của bạn /favicon.ico
để kiểm tra kết nối.
Ý tưởng này (gọi máy chủ của riêng bạn) đã được thực hiện bởi nhiều thư viện, chẳng hạn như Offline
, is-reachable
và được sử dụng rộng rãi trên cộng đồng. Bạn có thể sử dụng chúng nếu bạn không muốn tự viết mọi thứ. (Cá nhân tôi thích gói NPM is-reachable
vì đơn giản.)
Thí dụ:
import React from 'react';
import isReachable from 'is-reachable';
const URL = 'google.com:443';
const EVERY_SECOND = 1000;
export default class App extends React.PureComponent {
_isMounted = true;
state = { online: false }
componentDidMount() {
setInterval(async () => {
const online = await isReachable(URL);
if (this._isMounted) {
this.setState({ online });
}
}, EVERY_SECOND);
}
componentWillUnmount() {
this._isMounted = false;
}
render() {
return (
<div>
{ this.state.online ? 'you\'re online' : 'you\'re offline' }
</div>
);
}
}
Tôi tin rằng những gì bạn hiện đang ổn, chỉ cần đảm bảo rằng nó đang gọi đúng điểm cuối.
Câu hỏi SO tương tự: