Способ первый: использование устаревшего API браузера - Navigator.onLine
Возвращает онлайн-статус браузера. Свойство возвращает логическое значение с истинным значением онлайн и ложным значением автономно. Свойство отправляет обновления всякий раз, когда способность браузера подключаться к сети изменяется. Обновление происходит, когда пользователь переходит по ссылкам или когда скрипт запрашивает удаленную страницу. Например, свойство должно возвращать значение false, когда пользователи нажимают на ссылки вскоре после того, как теряют подключение к Интернету.
Вы можете добавить его в жизненный цикл вашего компонента:
Поиграйте с кодом ниже с помощью инструментов разработчика Chrome - переключите «Онлайн» на «Автономный» на вкладке «Сеть».
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>
Тем не менее, я думаю, что это не то, что вам нужно, вам нужен валидатор соединений в реальном времени .
Способ второй: проверка интернет-соединения с помощью него
Единственное надежное подтверждение, которое вы можете получить, если внешнее подключение к Интернету работает, - это использовать его. Вопрос в том, какой сервер вы должны назвать, чтобы минимизировать стоимость?
Для этого в Интернете существует множество решений, и любая конечная точка, которая отвечает с быстрым статусом 204, является идеальной, например:
- звонить на сервер Google (потому что он самый проверенный в бою (?))
- вызов его кэшированной конечной точки сценария JQuery (поэтому, даже если сервер не работает, вы все равно сможете получить сценарий, пока у вас есть соединение)
- попробуйте загрузить изображение со стабильного сервера (например, https://ssl.gstatic.com/gb/images/v1_76783e20.png + отметка времени даты для предотвращения кэширования)
IMO, если вы запускаете это приложение React на сервере, имеет смысл обратиться к вашему собственному серверу, вы можете вызвать запрос на загрузку вашего /favicon.ico
для проверки соединения.
Эта идея (вызова своего собственного сервера) реализована многие библиотеки, такие как Offline
, is-reachable
и широко используется в сообществе. Вы можете использовать их, если не хотите писать все самостоятельно. (Лично мне нравится пакет NPM is-reachable
за простоту.)
Пример:
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>
);
}
}
Я считаю, что то, что у вас есть, уже хорошо, просто убедитесь, что оно вызывает правильную конечную точку.
Подобные вопросы SO: