Skip to content

Network 网络状态

用于展示当前网络质量、离线状态和主动探测结果。

何时使用

  • 页面需要提示用户当前网络是否可用、是否较慢。
  • 提交、同步等操作依赖网络质量,需要在变差时给出轻量提示。
  • 需要用业务自定义探测地址判断服务是否可达。

基础用法

--
vue
<template>
  <x-network />
  <x-network status="poor" />
  <x-network status="offline" />
  <x-network show-metrics ping="/logo.svg" />
</template>

尺寸

vue
<template>
  <x-network size="mini" status="good" />
  <x-network size="small" status="good" />
  <x-network size="medium" status="good" />
  <x-network size="large" status="good" />
</template>

受控状态

vue
<script setup lang="ts">
import { ref } from 'vue';

const status = ref<'good' | 'medium' | 'poor' | 'offline'>('medium');
</script>

<template>
  <x-network :status="status" />
  <x-button @click="status = 'good'">良好</x-button>
  <x-button @click="status = 'offline'">离线</x-button>
</template>

传入 status 后,Network 只负责展示,不会启动浏览器网络监听或主动探测。

状态颜色

vue
<template>
  <x-network status="good" :status-colors="{ good: '#0f766e' }" />
  <x-network status="poor" :status-colors="{ poor: '#dc2626' }" />
  <x-network status="medium" :signal-strength-color="['#2563eb', '#ea580c']" />
</template>

signalStrengthColor 保留旧版强/弱颜色配置;新项目更推荐使用 statusColors 按状态配置。

无障碍与悬浮提示

vue
<template>
  <x-network status="medium" aria-label="当前网络略慢" />
  <x-network
    status="poor"
    show-tooltip
    aria-label="当前网络较差,请稍后提交"
    aria-live="assertive"
  />
</template>

默认不会把状态文案渲染到页面上;需要悬浮提示时再开启 showTooltip,无障碍名称始终可通过 ariaLabel 定制。

主动探测和事件

--
vue
<script setup lang="ts">
import { ref } from 'vue';

const logs = ref<string[]>([]);

const pushLog = (status) => {
  logs.value = [`${status.quality} / ${status.source}`, ...logs.value].slice(0, 4);
};
</script>

<template>
  <x-network
    show-metrics
    ping="/logo.svg"
    :interval="8000"
    :timeout="3000"
    @change="pushLog"
    @probe="pushLog"
  />
</template>

未配置 ping 时,组件会读取 navigator.onLinenavigator.connection,并监听 onlineoffline 与连接变化事件。配置 ping 后,组件会以主动探测结果作为主要质量来源,并可显示本次探测的延迟和该探测资源的下载耗时估算。

探测失败和超时

--
vue
<script setup lang="ts">
import { ref } from 'vue';

const logs = ref<string[]>([]);

const pushLog = (status) => {
  logs.value = [`${status.quality} / ${status.reason}`, ...logs.value].slice(0, 3);
};
</script>

<template>
  <x-network
    show-metrics
    ping="/network-probe-missing.svg"
    :timeout="1000"
    @probe="pushLog"
  />
</template>

主动探测失败会标记为 probe-errorprobe-timeouthttp-error,不会直接等同于浏览器离线。

网络流速

--
vue
<template>
  <x-network
    show-metrics
    ping="/logo.svg"
    :interval="8000"
  />
</template>

开启 showMetrics 后会显示 9ms 42K/s 这种紧凑指标。这里的流速只来自本组件对 ping 资源的主动探测,不能检测用户真实下载任务或整机实时流量。

自定义展示

网络状态:poorinitial
vue
<template>
  <x-network>
    <template #default="{ quality, latency, refresh }">
      <span class="network-card">
        <strong>网络状态:{{ quality }}</strong>
        <span v-if="latency !== undefined">{{ latency }}ms</span>
        <button @click="refresh">重新检测</button>
      </span>
    </template>
  </x-network>
</template>

按需导入

ts
import { Network } from 'x-next';

Props

参数说明类型默认值
size信号图标尺寸'mini' | 'small' | 'medium' | 'large''medium'
status受控网络质量状态,传入后只展示不探测'unknown' | 'good' | 'medium' | 'poor' | 'offline'-
signalStrengthColor兼容旧版强/弱信号颜色[string, string]['var(--x-network-color-good)', 'var(--x-network-color-poor)']
statusColors按状态配置颜色Partial<Record<NetworkQuality, string>>{}
ping用于主动探测的 URL,需要支持 CORSstring-
interval主动探测间隔,单位毫秒number-
timeout主动探测超时时间,单位毫秒number5000
showMetrics是否显示主动探测指标,包含延迟和下载估算,需要配合 ping 使用booleanfalse
showTooltip是否把状态文案同步到 titlebooleanfalse
ariaLabel自定义无障碍文案string-
ariaLive状态变化播报策略'off' | 'polite' | 'assertive''polite'

Events

事件名说明回调参数
change网络状态刷新后触发status: NetworkStatus
online从离线恢复到非离线时触发status: NetworkStatus
offline从非离线进入离线时触发status: NetworkStatus
probe主动探测完成时触发status: NetworkStatus

Slots

插槽名说明参数
default自定义网络状态展示{ status, quality, online, latency, downloadSpeed, speedSource, source, reason, refresh }

Methods

方法名说明
refresh主动刷新网络状态;受控状态下只返回当前受控状态

状态对象

ts
type NetworkQuality = 'unknown' | 'good' | 'medium' | 'poor' | 'offline';

interface NetworkStatus {
  online: boolean;
  quality: NetworkQuality;
  latency?: number;
  downloadSpeed?: number;
  speedSource?: 'probe';
  downlink?: number;
  rtt?: number;
  effectiveType?: string;
  source: 'navigator' | 'connection' | 'probe' | 'manual';
  reason?: 'initial' | 'browser-offline' | 'connection-change' | 'probe-timeout' | 'probe-error' | 'http-error' | 'unsupported';
  lastCheckedAt: number;
}

已知限制

  • navigator.connection 是非标准能力,不是所有浏览器都支持;不支持时会按 navigator.onLine 返回保守状态。
  • ping 探测 URL 需要允许跨域访问,否则会被记录为 probe-error,不会直接等价为系统离线。
  • showMetrics 展示的是本组件主动探测请求推导出的延迟和下载估算值,不能检测用户真实下载任务或整机实时网络流量;未配置 ping 时不会得到完整指标。
  • 网络质量是近似判断,适合做用户提示,不应作为安全、计费或强一致业务判断。