Método 1: Usando a API do navegador herdado - Navigator.onLine
Retorna o status online do navegador. A propriedade retorna um valor booleano, com verdadeiro significado online e falso significado offline. A propriedade envia atualizações sempre que a capacidade do navegador de se conectar à rede mudar. A atualização ocorre quando o usuário segue os links ou quando um script solicita uma página remota. Por exemplo, a propriedade deve retornar false quando os usuários clicarem em links logo após perderem a conexão com a Internet.
Você pode adicioná-lo ao seu ciclo de vida do componente:
Jogue com o código abaixo usando as ferramentas de desenvolvimento do Chrome - alterne "Online" para "Off-line" na guia Rede.
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>
No entanto, acho que não é isso que você deseja, você queria um validador de conexão em tempo real .
Método 2: Verificando a conexão à Internet usando-o
A única confirmação sólida que você pode obter se a conectividade externa à Internet estiver funcionando é usando-a. A questão é: qual servidor você deve ligar para minimizar o custo?
Existem muitas soluções na Internet para isso, qualquer ponto de extremidade que responda com um status 204 rápido é perfeito, por exemplo:
- ligando para o servidor do Google (por ser o mais testado em batalha (?))
- chamando seu terminal de script JQuery em cache (portanto, mesmo se o servidor estiver inativo, você ainda poderá obter o script enquanto tiver uma conexão)
- tente buscar uma imagem de um servidor estável (por exemplo: https://ssl.gstatic.com/gb/images/v1_76783e20.png + data e hora para impedir o armazenamento em cache)
IMO, se você estiver executando este aplicativo React em um servidor, faz mais sentido ligar para o seu próprio servidor, você pode chamar uma solicitação para carregar o seu /favicon.ico
para verificar a conexão.
Essa idéia (de chamar o seu próprio servidor) foi implementada por muitas bibliotecas, como Offline
, is-reachable
, e é amplamente utilizado em toda a comunidade. Você pode usá-los se não quiser escrever tudo sozinho. (Pessoalmente, gosto do pacote NPM is-reachable
por ser simples.)
Exemplo:
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>
);
}
}
Acredito que o que você tem atualmente já está bom, apenas verifique se ele está chamando o endpoint correto.
Perguntas SO semelhantes: