Méthode 1: Utilisation de l'API de navigateur héritée - Navigator.onLine
Renvoie l'état en ligne du navigateur. La propriété renvoie une valeur booléenne, avec une vraie signification en ligne et une fausse signification hors ligne. La propriété envoie des mises à jour chaque fois que la capacité du navigateur à se connecter au réseau change. La mise à jour se produit lorsque l'utilisateur suit des liens ou lorsqu'un script demande une page distante. Par exemple, la propriété doit retourner false lorsque les utilisateurs cliquent sur des liens peu de temps après avoir perdu leur connexion Internet.
Vous pouvez l'ajouter à votre cycle de vie des composants:
Jouez avec le code ci-dessous à l'aide des outils de développement Chrome - passez de "En ligne" à "Hors ligne" sous l'onglet Réseau.
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>
Cependant, je pense que ce n'est pas ce que vous voulez, vous vouliez un validateur de connexion en temps réel .
Méthode 2: vérification de la connexion Internet en l'utilisant
La seule confirmation solide que vous pouvez obtenir si la connectivité Internet externe fonctionne est en l'utilisant. La question est quel serveur vous devez appeler pour minimiser le coût?
Il existe de nombreuses solutions sur Internet pour cela, tout point final qui répond avec un statut 204 rapide est parfait, par exemple:
- appel au serveur Google (car c'est le plus testé au combat (?))
- appeler son point de terminaison de script JQuery mis en cache (donc même si le serveur est en panne, vous devriez toujours pouvoir obtenir le script tant que vous avez une connexion)
- essayez de récupérer une image à partir d'un serveur stable (par exemple: https://ssl.gstatic.com/gb/images/v1_76783e20.png + horodatage de la date pour empêcher la mise en cache)
IMO, si vous exécutez cette application React sur un serveur, il est plus judicieux d'appeler sur votre propre serveur, vous pouvez appeler une demande de chargement /favicon.ico
pour vérifier la connexion.
Cette idée (d'appeler votre propre serveur) a été mis en œuvre par de nombreuses bibliothèques, telles que Offline
, is-reachable
et est largement utilisé dans la communauté. Vous pouvez les utiliser si vous ne voulez pas tout écrire par vous-même. (Personnellement, j'aime le package NPM is-reachable
pour être simple.)
Exemple:
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>
);
}
}
Je crois que ce que vous avez actuellement est déjà bien, assurez-vous simplement qu'il appelle le bon point de terminaison.
Questions SO similaires: