Metodo 1: utilizzo dell'API del browser legacy - Navigator.onLine
Restituisce lo stato online del browser. La proprietà restituisce un valore booleano, con significato vero online e significato falso offline. La proprietà invia aggiornamenti ogni volta che cambia la capacità del browser di connettersi alla rete. L'aggiornamento si verifica quando l'utente segue i collegamenti o quando uno script richiede una pagina remota. Ad esempio, la proprietà dovrebbe restituire false quando gli utenti fanno clic sui collegamenti subito dopo aver perso la connessione a Internet.
È possibile aggiungerlo al ciclo di vita del componente:
Gioca con il codice seguente utilizzando gli strumenti di sviluppo di Chrome: passa da "Online" a "Offline" nella scheda Rete.
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>
Tuttavia, penso che questo non sia quello che vuoi, volevi un validatore della connessione in tempo reale .
Metodo due: controllo della connessione a Internet mediante l'utilizzo
L'unica conferma solida che puoi ottenere se la connettività Internet esterna funziona è usarla. La domanda è: quale server dovresti chiamare per minimizzare il costo?
Esistono molte soluzioni su Internet per questo, qualsiasi endpoint che risponde con un rapido stato 204 è perfetto, ad esempio:
- chiamando al server di Google (perché è il più testato in battaglia (?))
- chiamando l'endpoint dello script JQuery memorizzato nella cache (quindi, anche se il server è inattivo, dovresti comunque essere in grado di ottenere lo script fintanto che hai una connessione)
- prova a recuperare un'immagine da un server stabile (ad esempio: https://ssl.gstatic.com/gb/images/v1_76783e20.png + data e ora per evitare la memorizzazione nella cache)
IMO, se stai eseguendo questa app React su un server, ha più senso chiamare il tuo server, puoi chiamare una richiesta per caricare il tuo /favicon.ico
per verificare la connessione.
Questa idea (di chiamare il proprio server) è stato implementato da molte biblioteche, come Offline
, is-reachable
ed è ampiamente utilizzato in tutta la comunità. Puoi usarli se non vuoi scrivere tutto da solo. (Personalmente mi piace il pacchetto NPM is-reachable
per essere semplice.)
Esempio:
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>
);
}
}
Credo che ciò che hai attualmente vada bene, assicurati solo che stia chiamando l'endpoint giusto.
Domande SO simili: