Skip to content

useWebSocket

类别
导出体积
1.44 kB
上次更改
5 days ago

响应式 WebSocket 客户端。

用法

js
import { useWebSocket } from '@vueuse/core'

const { status, data, send, open, close } = useWebSocket('ws://websocketurl')

有关更多选项,请参阅类型声明

immediate

默认启用。

在调用此组合时立即建立连接。

autoConnect

默认启用。

如果 URL 作为 ref 提供,当 URL 发生变化时,它将自动重新连接到新 URL。

autoClose

默认启用。

当触发 beforeunload 事件或关联的 effect 范围停止时,这将自动调用 close()

autoReconnect

在错误发生时自动重连 (默认禁用)。

js
const { status, data, close } = useWebSocket('ws://websocketurl', {
  autoReconnect: true,
})

或者具有更多控制其行为的选项:

js
const { status, data, close } = useWebSocket('ws://websocketurl', {
  autoReconnect: {
    retries: 3,
    delay: 1000,
    onFailed() {
      alert('重试 3 次后无法连接 WebSocket')
    },
  },
})

显式调用 close() 不会触发自动重新连接。

heartbeat

通常会在每隔一段时间发送一个小消息 (心跳) 以保持连接活动状态。在此函数中,我们提供了一个便利的辅助工具来执行此操作:

js
const { status, data, close } = useWebSocket('ws://websocketurl', {
  heartbeat: true,
})

或者具有更多控制:

js
const { status, data, close } = useWebSocket('ws://websocketurl', {
  heartbeat: {
    message: 'ping',
    interval: 1000,
    pongTimeout: 1000,
  },
})

子协议

要使用的一个或多个子协议列表,在这种情况下是 soap 和 wamp。

js
import { useWebSocket } from '@vueuse/core'

const { status, data, send, open, close } = useWebSocket('ws://websocketurl', {
  protocols: ['soap'], // ['soap', 'wamp']
})

类型声明

显示类型声明
typescript
export type WebSocketStatus = "OPEN" | "CONNECTING" | "CLOSED"
export type WebSocketHeartbeatMessage = string | ArrayBuffer | Blob
export interface UseWebSocketOptions {
  onConnected?: (ws: WebSocket) => void
  onDisconnected?: (ws: WebSocket, event: CloseEvent) => void
  onError?: (ws: WebSocket, event: Event) => void
  onMessage?: (ws: WebSocket, event: MessageEvent) => void
  /**
   * 每过 x 毫秒发送一次心跳。
   *
   * @default false
   */
  heartbeat?:
    | boolean
    | {
        /**
         * 心跳消息
         *
         * @default 'ping'
         */
        message?: MaybeRefOrGetter<WebSocketHeartbeatMessage>
        /**
         * 心跳的响应消息,如果未定义,将使用该消息
         */
        responseMessage?: MaybeRefOrGetter<WebSocketHeartbeatMessage>
        /**
         * 间隔时间,毫秒为单位
         *
         * @default 1000
         */
        interval?: number
        /**
         * 心跳响应超时时间,毫秒为单位
         *
         * @default 1000
         */
        pongTimeout?: number
      }
  /**
   * 启用自动重新连接
   *
   * @default false
   */
  autoReconnect?:
    | boolean
    | {
        /**
         * 最大重试次数。
         *
         * 或者你可以传递一个谓词函数(如果要重试,则返回 true)。
         *
         * @default -1
         */
        retries?: number | ((retried: number) => boolean)
        /**
         * 重新连接延迟,毫秒为单位
         *
         * @default 1000
         */
        delay?: number
        /**
         * 当达到最大重试次数时。
         */
        onFailed?: Fn
      }
  /**
   * Immediately open the connection when calling this composable
   *
   * @default true
   */
  immediate?: boolean
  /**
   * 当 URL 发生变化时自动连接到 WebSocket
   *
   * @default true
   */
  autoConnect?: boolean
  /**
   * 自动关闭连接
   *
   * @default true
   */
  autoClose?: boolean
  /**
   * 一个或多个子协议字符串的列表
   *
   * @default []
   */
  protocols?: string[]
}
export interface UseWebSocketReturn<T> {
  /**
   * WebSocket 最新接收到的数据的 ref,可以监听以响应传入的消息
   */
  data: Ref<T | null>
  /**
   * 当前 WebSocket 的状态,只能是以下之一:
   * 'OPEN','CONNECTING','CLOSED'
   */
  status: ShallowRef<WebSocketStatus>
  /**
   * 优雅地关闭 WebSocket 连接。
   */
  close: WebSocket["close"]
  /**
   * 重新打开 WebSocket 连接。
   * 如果当前连接处于活动状态,将在打开新连接之前关闭它。
   */
  open: Fn
  /**
   * 通过 WebSocket 连接发送数据。
   *
   * @param data
   * @param useBuffer 当套接字尚未打开时,将数据存储到缓冲区并在连接时发送。默认为 true。
   */
  send: (data: string | ArrayBuffer | Blob, useBuffer?: boolean) => boolean
  /**
   * WebSocket 实例的 ref。
   */
  ws: Ref<WebSocket | undefined>
}
/**
 * 响应式 WebSocket 客户端。
 *
 * @see https://vueuse.org/useWebSocket
 * @param url
 */
export declare function useWebSocket<Data = any>(
  url: MaybeRefOrGetter<string | URL | undefined>,
  options?: UseWebSocketOptions,
): UseWebSocketReturn<Data>

源码

源码文档

贡献者

Anthony Fu
一纸忘忧
IlyaL
Fernando Fernández
Anthony Fu
Ivan Demidov
Shinigami
freakbite
Dan Rose
Antério Vieira
Antoine Lassier
Vida Xie
Robin
RT
SnowGuest
James Garbutt
lavolpecheprogramma
HengJing Wang
Evan
Vanweiping
alipay404
shanyi-front
丶远方
Johann Kellerman
Dan Rose
cn.shperry
azaleta
Mikhailov Nikita
Jelf
Ernest
Roland Doda
Shangbu Li
webfansplz
Jan-Henrik Damaschke
Joacim de la Motte
Alex Kozack
iGalaxyz

更新日志

v12.8.0 on 3/5/2025
7432f - feat(types): deprecate MaybeRef and MaybeRefOrGetter in favor of Vue's native (#4636)
9ba07 - fix: don't call close() on pongTimeout if connection al… (#4608)
73e6d - feat: pass the retried to the autoReconnect.retries (#4604)
v12.4.0 on 1/10/2025
dd316 - feat: use passive event handlers everywhere is possible (#4477)
v12.3.0 on 1/2/2025
59f75 - feat(toValue): deprecate toValue from @vueuse/shared in favor of Vue's native
v12.2.0-beta.1 on 12/23/2024
230f8 - feat(useEventSource): new autoConnect option to align with useWebSocket (#4204)
ffa00 - fix: clear retryTimer when connected (#4383)
v12.1.0 on 12/22/2024
ece6a - fix: close socket connection inside WebWorker fix (#4229)
05e75 - feat: introduce autoConnect options to control auto connections on url changes (#4417)
a72c0 - feat(useWebsocket): support ref or getter as message (#4116)
v12.0.0-beta.1 on 11/21/2024
0a9ed - feat!: drop Vue 2 support, optimize bundles and clean up (#4349)
v11.2.0 on 10/30/2024
08412 - fix: autoreconnect when ws close (#4314)
v11.0.2 on 8/24/2024
3c2fc - fix: should reset retry count when connection is established (#4164)
e0e99 - fix: only reconnect if is the current ws socket (#4161)
v11.0.0-beta.2 on 7/17/2024
adbe0 - feat: allow different heartbeat response message (#3950)
v10.10.0 on 5/27/2024
c2f92 - fix: urlRef changes were not being tracked (#3870)
v10.8.0 on 2/20/2024
93b96 - fix: immediate should only be applied once, close #3676
9a47a - fix: reset wsRef on close, fix #3706 (#3707)
v10.6.0 on 11/9/2023
9b014 - fix: webworker support (#3469)
v10.5.0 on 10/7/2023
c3a69 - fix: ssr support (#3370)
v10.4.0 on 8/25/2023
aea27 - fix(useWebsocket): reset pongTimeout on close (#3324)
93372 - fix(useWebsocket): pongTimeout auto-reconnect no work (#3321)
v10.0.0-beta.4 on 4/13/2023
4d757 - feat(types)!: rename MaybeComputedRef to MaybeRefOrGetter
10e98 - feat(toRef)!: rename resolveRef to toRef