方法1:レガシーブラウザAPIを使用する- Navigator.onLine
ブラウザのオンライン状態を返します。プロパティはブール値を返し、trueはオンライン、falseはオフラインを意味します。プロパティは、ネットワークに接続するブラウザーの機能が変更されるたびに更新を送信します。更新は、ユーザーがリンクをクリックしたとき、またはスクリプトがリモートページを要求したときに発生します。たとえば、ユーザーがインターネット接続を失った直後にリンクをクリックすると、プロパティはfalseを返します。
コンポーネントのライフサイクルに追加できます。
Chrome開発ツールを使用して以下のコードを試してください-[ネットワーク]タブで[オンライン]を[オフライン]に切り替えます。
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>
しかし、これはあなたが望むものではないと思います、あなたはリアルタイムの接続バリデーターを望んでいました。
方法2:インターネット接続を使用して確認する
外部インターネット接続が機能している場合に取得できる唯一の確実な確認は、それを使用することです。問題は、コストを最小限に抑えるためにどのサーバーを呼び出す必要があるかです。
これにはインターネット上に多くの解決策があり、204ステータスで応答するエンドポイントはすべて完璧です。例:
IMO、このReactアプリをサーバーで実行している場合、独自のサーバーを呼び出すのが最も理にかなって/favicon.ico
います。接続を確認するためにをロードするリクエストを呼び出すことができます。
(独自のサーバーを呼び出す)このアイデアは、次のような多くのライブラリによって実装されたOffline
、is-reachable
と広く社会全体で使用されています。自分ですべてを書きたくない場合は、それらを使用できます。(個人的には、is-reachable
シンプルなNPMパッケージが好きです。)
例:
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>
);
}
}
私はあなたが現在持っているものはすでに問題ないと信じています、それが正しいエンドポイントを呼び出していることを確認してください。
同様のSOの質問: