成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

通過JS獲取你當前的網絡狀況?建議大家學一學

開發 前端
我們可以自定義一個hook,用來獲取網頁當前的網絡狀態~需要具備以下要素:1、返回的數據所需的ts類、監聽網絡變化的enum。2、獲取網絡狀態。3、監聽網絡變化,并實時更新最新的網絡狀態。

前言

大家好,我是林三心,用最通俗易懂的話講最難的知識點是我的座右銘,基礎是進階的前提是我的初心。

檢測網速

想要在Web端檢測網速,其實很簡單,有一個全局的對象——navigation,我們來看看它的身上都有哪些東西:

圖片圖片

屬性

描述

類型

downlink

有效帶寬估算(單位:兆比特/秒)

number

effectiveType

effectiveType

slow-2g/2g/3g/4g

rtt

當前連接下評估的往返時延

number

saveData

用戶代理是否設置了減少數據使用的選項

boolean

useNetwork

我們可以自定義一個hook,用來獲取網頁當前的網絡狀態~需要具備以下要素:

1、返回的數據所需的ts類、監聽網絡變化的enum

2、獲取網絡狀態

3、監聽網絡變化,并實時更新最新的網絡狀態

第一步:所需的ts類型

說說NetworkState的各個參數:

  • since:記錄當時檢測的時間
  • oline:記錄是否有網絡
  • rtt:記錄時延
  • downlink:記錄帶寬
  • saveData:記錄用戶代理是否設置了減少數據使用
  • effectiveType:網絡連接類型
// hook返回的值
interface NetworkState {
  since?: Date;
  online?: boolean;
  rtt?: number;
  downlink?: number;
  saveData?: boolean;
  effectiveType?: string;
}

// 監聽網絡變化的事件名enum
enum NetworkEventType {
  ONLINE = 'online',
  OFFLINE = 'offline',
  CHANGE = 'change',
}

第二步:獲取網絡狀態

function getConnection() {
  const nav = navigator as any;
  if (typeof nav !== 'object') return null;
  return nav.connection || nav.mozConnection || nav.webkitConnection;
}

function getConnectionProperty(): NetworkState {
  const c = getConnection();
  if (!c) return {};
  return {
    rtt: c.rtt,
    saveData: c.saveData,
    downlink: c.downlink,
    effectiveType: c.effectiveType,
  };
}

第三步:實時更新網絡狀態

unction useNetwork(): NetworkState {
  const [state, setState] = useState(() => {
    return {
      since: undefined,
      online: navigator?.onLine,
      ...getConnectionProperty(),
    };
  });

  useEffect(() => {
    const onOnline = () => {
      setState((prevState) => ({
        ...prevState,
        online: true,
        since: new Date(),
      }));
    };

    const onOffline = () => {
      setState((prevState) => ({
        ...prevState,
        online: false,
        since: new Date(),
      }));
    };

    const onConnectionChange = () => {
      setState((prevState) => ({
        ...prevState,
        ...getConnectionProperty(),
      }));
    };

    window.addEventListener(NetworkEventType.ONLINE, onOnline);
    window.addEventListener(NetworkEventType.OFFLINE, onOffline);

    const connection = getConnection();
    connection?.addEventListener(NetworkEventType.CHANGE, onConnectionChange);

    return () => {
      window.removeEventListener(NetworkEventType.ONLINE, onOnline);
      window.removeEventListener(NetworkEventType.OFFLINE, onOffline);
      connection?.removeEventListener(NetworkEventType.CHANGE, onConnectionChange);
    };
  }, []);

  return state;
}

完整代碼

import { useEffect, useState } from 'react';

export interface NetworkState {
  since?: Date;
  online?: boolean;
  rtt?: number;
  downlink?: number;
  saveData?: boolean;
  effectiveType?: string;
}

enum NetworkEventType {
  ONLINE = 'online',
  OFFLINE = 'offline',
  CHANGE = 'change',
}

function getConnection() {
  const nav = navigator as any;
  if (typeof nav !== 'object') return null;
  return nav.connection || nav.mozConnection || nav.webkitConnection;
}

function getConnectionProperty(): NetworkState {
  const c = getConnection();
  if (!c) return {};
  return {
    rtt: c.rtt,
    saveData: c.saveData,
    downlink: c.downlink,
    effectiveType: c.effectiveType,
  };
}

function useNetwork(): NetworkState {
  const [state, setState] = useState(() => {
    return {
      since: undefined,
      online: navigator?.onLine,
      ...getConnectionProperty(),
    };
  });

  useEffect(() => {
    const onOnline = () => {
      setState((prevState) => ({
        ...prevState,
        online: true,
        since: new Date(),
      }));
    };

    const onOffline = () => {
      setState((prevState) => ({
        ...prevState,
        online: false,
        since: new Date(),
      }));
    };

    const onConnectionChange = () => {
      setState((prevState) => ({
        ...prevState,
        ...getConnectionProperty(),
      }));
    };

    window.addEventListener(NetworkEventType.ONLINE, onOnline);
    window.addEventListener(NetworkEventType.OFFLINE, onOffline);

    const connection = getConnection();
    connection?.addEventListener(NetworkEventType.CHANGE, onConnectionChange);

    return () => {
      window.removeEventListener(NetworkEventType.ONLINE, onOnline);
      window.removeEventListener(NetworkEventType.OFFLINE, onOffline);
      connection?.removeEventListener(NetworkEventType.CHANGE, onConnectionChange);
    };
  }, []);

  return state;
}

export default useNetwork;


責任編輯:武曉燕 來源: 前端之神
相關推薦

2017-03-19 22:13:10

WebAssemblyJavaScript編程

2020-04-01 17:50:02

Python編程語言

2011-08-22 16:39:15

iOS內存

2011-05-17 10:05:50

CSS

2013-01-25 13:55:26

Surface RT

2021-03-10 09:40:50

Linux命令文件

2018-10-15 17:31:00

網絡安全病毒網絡攻擊

2010-06-03 11:39:28

網絡性能

2012-04-20 13:27:17

NFC

2023-09-04 00:03:08

2020-05-25 10:05:26

Python 開發程序員

2021-04-15 09:18:57

鴻蒙HarmonyOS應用

2011-08-08 17:59:22

UIWebView網絡網頁

2022-06-07 09:59:21

網絡安全安全漏洞

2021-02-03 09:59:02

鴻蒙HarmonyOS應用開發

2019-03-19 15:28:30

Linux 系統 數據

2023-10-27 11:01:31

網絡性能VLAN

2021-05-27 10:07:49

網絡安全主管網絡安全網絡攻擊

2021-04-13 08:17:40

中國電信中國移動運營商

2020-09-02 15:00:36

Linux命令軟件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩一区二区在线观看视频 | 日本特黄a级高清免费大片 国产精品久久性 | 久久99国产精一区二区三区 | 99免费在线 | 中文字幕在线三区 | 欧美男人的天堂 | 亚洲精品视频免费看 | 国产亚洲一区二区在线观看 | 特一级毛片| 久久国产一区二区三区 | 一级毛片免费 | 日韩欧美在线一区 | 亚洲精品国产成人 | 日韩视频区 | 9久久婷婷国产综合精品性色 | 99免费看| 久久精品一区二区三区四区 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 日韩视频在线播放 | 国产一二区免费视频 | av国产精品 | 欧美精品一区在线发布 | 天天看夜夜 | chengrenzaixian| 精区3d动漫一品二品精区 | 911网站大全在线观看 | 免费黄色片在线观看 | 成人黄色在线视频 | 日韩精品一区二区三区在线播放 | www国产成人免费观看视频,深夜成人网 | 青春草91| 99久久精品免费看国产四区 | 国产精品伦一区二区三级视频 | 免费看的av| 一级视频在线免费观看 | 欧美亚洲国产成人 | 中文字幕 在线观看 | 中文字幕亚洲精品在线观看 | 91精品国产777在线观看 | 国产精品永久久久久久久www | 久久尤物免费一区二区三区 |