วิธีที่หนึ่ง: การใช้ API เบราว์เซอร์เดิม - Navigator.onLine
ส่งคืนสถานะออนไลน์ของเบราว์เซอร์ คุณสมบัติส่งคืนค่าบูลีนที่มีความหมายจริงแบบออนไลน์และความหมายที่ผิด ๆ แบบออฟไลน์ สถานที่ให้บริการส่งการปรับปรุงเมื่อใดก็ตามที่ความสามารถของเบราว์เซอร์ในการเชื่อมต่อกับการเปลี่ยนแปลงเครือข่าย การปรับปรุงเกิดขึ้นเมื่อผู้ใช้ติดตามลิงก์หรือเมื่อสคริปต์ร้องขอเพจระยะไกล ตัวอย่างเช่นพร็อพเพอร์ตี้ควรส่งคืนค่าเท็จเมื่อผู้ใช้คลิกลิงก์ในไม่ช้าหลังจากที่พวกเขาขาดการเชื่อมต่ออินเทอร์เน็ต
คุณสามารถเพิ่มลงในวงจรชีวิตส่วนประกอบของคุณ:
เล่นด้วยรหัสด้านล่างโดยใช้เครื่องมือพัฒนา 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>
อย่างไรก็ตามฉันคิดว่านี่ไม่ใช่สิ่งที่คุณต้องการคุณต้องการตัวตรวจสอบการเชื่อมต่อแบบเรียลไทม์
วิธีที่สอง: ตรวจสอบการเชื่อมต่ออินเทอร์เน็ตโดยใช้งาน
การยืนยันที่มั่นคงเพียงอย่างเดียวที่คุณจะได้รับหากการเชื่อมต่ออินเทอร์เน็ตภายนอกนั้นใช้งานได้โดยใช้งาน คำถามคือเซิร์ฟเวอร์ที่คุณควรโทรหาเพื่อลดค่าใช้จ่าย?
มีคำตอบมากมายบนอินเทอร์เน็ตสำหรับสิ่งนี้จุดสิ้นสุดใด ๆ ที่ตอบสนองด้วยสถานะ 204 ฉบับย่อนั้นสมบูรณ์แบบเช่น:
- โทรไปยังเซิร์ฟเวอร์ Google (เพราะเป็นเซิร์ฟเวอร์ที่ผ่านการทดสอบมากที่สุด (?))
- การเรียกจุดสิ้นสุดสคริปต์ JQuery ที่แคชไว้ (ดังนั้นแม้ว่าเซิร์ฟเวอร์จะไม่ทำงานคุณควรจะสามารถรับสคริปต์ได้ตราบใดที่คุณมีการเชื่อมต่อ)
- ลองดึงภาพจากเซิร์ฟเวอร์ที่มั่นคง (เช่น: https://ssl.gstatic.com/gb/images/v1_76783e20.png + เวลาประทับวันที่เพื่อป้องกันการแคช)
IMO หากคุณเรียกใช้แอป React นี้บนเซิร์ฟเวอร์การโทรไปยังเซิร์ฟเวอร์ของคุณเองเป็นเรื่องที่สมเหตุสมผลที่สุดคุณสามารถโทรขอให้โหลด/favicon.ico
เพื่อตรวจสอบการเชื่อมต่อได้
ความคิด (เรียกเซิร์ฟเวอร์ของคุณเอง) นี้ได้รับการดำเนินการโดยห้องสมุดจำนวนมากเช่นOffline
, is-reachable
และมีการใช้กันอย่างแพร่หลายทั่วชุมชน คุณสามารถใช้มันหากคุณไม่ต้องการเขียนทุกอย่างด้วยตัวเอง (โดยส่วนตัวแล้วฉันชอบแพคเกจ NPM is-reachable
สำหรับความเรียบง่าย)
ตัวอย่าง:
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 ที่คล้ายกัน: