Метод первый: использование устаревшего API браузера - Navigator.onLine
Возвращает онлайн-статус браузера. Свойство возвращает логическое значение с истинным значением онлайн и ложным значением автономно. Свойство отправляет обновления всякий раз, когда способность браузера подключаться к сети изменяется. Обновление происходит, когда пользователь переходит по ссылкам или когда скрипт запрашивает удаленную страницу. Например, свойство должно возвращать значение false, если пользователи нажимают на ссылки вскоре после того, как теряют соединение inte rnet.
Вы можете добавить его в жизненный цикл компонента:
Играть с кодом ниже с помощью Chrome dev tools - переключите «Онлайн» на «Автономный» на вкладке «Сеть».
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>
Однако я думаю, что это не то, что вам нужно, вы хотели средство проверки подлинности в реальном времени.
Способ два: проверка соединения inte rnet с помощью него
Единственное подтверждение solid, которое вы можете получить, если работает внешнее соединение inte rnet, - используя Это. Вопрос в том, , на какой сервер вам следует позвонить, чтобы минимизировать стоимость?
Для этого есть много решений на rnet, любая конечная точка, которая отвечает с быстрым статусом 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>
);
}
}
I Верьте, что то, что у вас есть, уже хорошо, просто убедитесь, что оно вызывает правильную конечную точку.
Подобные вопросы SO: