Methode eins: Verwenden der Legacy-Browser-API - Navigator.onLine
Gibt den Online-Status des Browsers zurück. Die Eigenschaft gibt einen booleschen Wert zurück, wobei true online und false offline bedeutet. Die Eigenschaft sendet Aktualisierungen, wenn sich die Fähigkeit des Browsers, eine Verbindung zum Netzwerk herzustellen, ändert. Die Aktualisierung erfolgt, wenn der Benutzer Links folgt oder wenn ein Skript eine Remote-Seite anfordert. Beispielsweise sollte die Eigenschaft false zurückgeben, wenn Benutzer kurz nach dem Verlust der Internetverbindung auf Links klicken.
Sie können es Ihrem Komponentenlebenszyklus hinzufügen:
Spielen Sie mit dem folgenden Code mit den Chrome-Entwicklungstools - wechseln Sie auf der Registerkarte "Netzwerk" zu "Online" zu "Offline".
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>
Ich denke jedoch, dass dies nicht das ist, was Sie wollen, Sie wollten einen Echtzeit- Verbindungsprüfer.
Methode zwei: Überprüfen der Internetverbindung mithilfe dieser
Die einzige solide Bestätigung, die Sie erhalten können, wenn die externe Internetverbindung funktioniert, ist die Verwendung. Die Frage ist, welchen Server Sie anrufen sollten, um die Kosten zu minimieren.
Dafür gibt es im Internet viele Lösungen. Jeder Endpunkt, der mit einem schnellen 204-Status antwortet, ist perfekt, z.
- Aufrufen des Google-Servers (da dieser am kampferprobtesten ist (?))
- Aufrufen des zwischengespeicherten JQuery-Skriptendpunkts (selbst wenn der Server nicht verfügbar ist, sollten Sie das Skript dennoch abrufen können, solange Sie eine Verbindung haben).
- Versuchen Sie, ein Bild von einem stabilen Server abzurufen (z. B. https://ssl.gstatic.com/gb/images/v1_76783e20.png + Datumszeitstempel, um das Zwischenspeichern zu verhindern).
IMO, wenn Sie diese React-App auf einem Server ausführen, ist es am sinnvollsten, auf Ihrem eigenen Server anzurufen. Sie können eine Anforderung zum Laden Ihrer Server aufrufen /favicon.ico
, um die Verbindung zu überprüfen.
Diese Idee (von Ihrem eigenen Server aufruft) wird von vielen Bibliotheken, wie implementiert Offline
, is-reachable
und ist weit verbreitet in der Gemeinschaft verwendet. Sie können sie verwenden, wenn Sie nicht alles selbst schreiben möchten. (Ich persönlich mag das NPM-Paket, is-reachable
weil es einfach ist.)
Beispiel:
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>
);
}
}
Ich glaube, was Sie derzeit haben, ist bereits in Ordnung. Stellen Sie nur sicher, dass der richtige Endpunkt aufgerufen wird.
Ähnliche SO-Fragen: