跳到内容

useWebSocket

类别
导出大小
1.44 kB
最近更改
5 天前

响应式 WebSocket 客户端。

用法

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

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

查看 类型声明 以获取更多选项。

immediate

默认启用。

在调用 composable 时立即建立连接。

autoConnect

默认启用。

如果 url 作为 ref 提供,当 url 更改时,它将自动重新连接到新 url。

autoClose

默认启用。

beforeunload 事件被触发或关联的效果作用域停止时,这将自动调用 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('Failed to connect WebSocket after 3 retries')
    },
  },
})

显式调用 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
  /**
   * Send heartbeat for every x milliseconds passed
   *
   * @default false
   */
  heartbeat?:
    | boolean
    | {
        /**
         * Message for the heartbeat
         *
         * @default 'ping'
         */
        message?: MaybeRefOrGetter<WebSocketHeartbeatMessage>
        /**
         * Response message for the heartbeat, if undefined the message will be used
         */
        responseMessage?: MaybeRefOrGetter<WebSocketHeartbeatMessage>
        /**
         * Interval, in milliseconds
         *
         * @default 1000
         */
        interval?: number
        /**
         * Heartbeat response timeout, in milliseconds
         *
         * @default 1000
         */
        pongTimeout?: number
      }
  /**
   * Enabled auto reconnect
   *
   * @default false
   */
  autoReconnect?:
    | boolean
    | {
        /**
         * Maximum retry times.
         *
         * Or you can pass a predicate function (which returns true if you want to retry).
         *
         * @default -1
         */
        retries?: number | ((retried: number) => boolean)
        /**
         * Delay for reconnect, in milliseconds
         *
         * @default 1000
         */
        delay?: number
        /**
         * On maximum retry times reached.
         */
        onFailed?: Fn
      }
  /**
   * Immediately open the connection when calling this composable
   *
   * @default true
   */
  immediate?: boolean
  /**
   * Automatically connect to the websocket when URL changes
   *
   * @default true
   */
  autoConnect?: boolean
  /**
   * Automatically close a connection
   *
   * @default true
   */
  autoClose?: boolean
  /**
   * List of one or more sub-protocol strings
   *
   * @default []
   */
  protocols?: string[]
}
export interface UseWebSocketReturn<T> {
  /**
   * Reference to the latest data received via the websocket,
   * can be watched to respond to incoming messages
   */
  data: Ref<T | null>
  /**
   * The current websocket status, can be only one of:
   * 'OPEN', 'CONNECTING', 'CLOSED'
   */
  status: ShallowRef<WebSocketStatus>
  /**
   * Closes the websocket connection gracefully.
   */
  close: WebSocket["close"]
  /**
   * Reopen the websocket connection.
   * If there the current one is active, will close it before opening a new one.
   */
  open: Fn
  /**
   * Sends data through the websocket connection.
   *
   * @param data
   * @param useBuffer when the socket is not yet open, store the data into the buffer and sent them one connected. Default to true.
   */
  send: (data: string | ArrayBuffer | Blob, useBuffer?: boolean) => boolean
  /**
   * Reference to the WebSocket instance.
   */
  ws: Ref<WebSocket | undefined>
}
/**
 * Reactive WebSocket client.
 *
 * @see https://vueuse.org.cn/useWebSocket
 * @param url
 */
export declare function useWebSocket<Data = any>(
  url: MaybeRefOrGetter<string | URL | undefined>,
  options?: UseWebSocketOptions,
): UseWebSocketReturn<Data>

来源

Source文档

贡献者

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 于 2025/3/5
7432f - feat(types): 弃用 MaybeRefMaybeRefOrGetter,支持 Vue 的原生类型 (#4636)
9ba07 - fix: 如果连接已激活,则不在 pongTimeout 时调用 close() ... (#4608)
73e6d - feat: 将 retried 传递给 autoReconnect.retries (#4604)
v12.4.0 于 2025/1/10
dd316 - feat: 在所有可能的地方使用被动事件处理程序 (#4477)
v12.3.0 于 2025/1/2
59f75 - feat(toValue): 弃用来自 @vueuse/sharedtoValue,支持 Vue 的原生类型
v12.2.0-beta.1 于 2024/12/23
230f8 - feat(useEventSource): 新增 autoConnect 选项,与 useWebSocket 对齐 (#4204)
ffa00 - fix: 连接后清除 retryTimer (#4383)
v12.1.0 于 2024/12/22
ece6a - fix: 在 WebWorker 修复中关闭 socket 连接 (#4229)
05e75 - feat: 引入 autoConnect 选项以控制 url 更改时的自动连接 (#4417)
a72c0 - feat(useWebsocket): 支持 ref 或 getter 作为消息 (#4116)
v12.0.0-beta.1 于 2024/11/21
0a9ed - feat!: 删除 Vue 2 支持,优化捆绑包并清理 (#4349)
v11.2.0 于 2024/10/30
08412 - fix: ws 关闭时自动重新连接 (#4314)
v11.0.2 于 2024/8/24
3c2fc - fix: 应在建立连接时重置重试计数 (#4164)
e0e99 - fix: 仅在当前 ws socket 时重新连接 (#4161)
v11.0.0-beta.2 于 2024/7/17
adbe0 - feat: 允许不同的心跳响应消息 (#3950)
v10.10.0 于 2024/5/27
c2f92 - fix: urlRef 更改未被跟踪 (#3870)
v10.8.0 于 2024/2/20
93b96 - fix: immediate 应该只应用一次,关闭 #3676
9a47a - fix: 在关闭时重置 wsRef,修复 #3706 (#3707)
v10.6.0 于 2023/11/9
9b014 - fix: webworker 支持 (#3469)
v10.5.0 于 2023/10/7
c3a69 - fix: ssr 支持 (#3370)
v10.4.0 于 2023/8/25
aea27 - fix(useWebsocket): 在关闭时重置 pongTimeout (#3324)
93372 - fix(useWebsocket): pongTimeout 自动重新连接不起作用 (#3321)
v10.0.0-beta.4 于 2023/4/13
4d757 - feat(types)!: 将 MaybeComputedRef 重命名为 MaybeRefOrGetter
10e98 - feat(toRef)!: 将 resolveRef 重命名为 toRef
v9.12.0 于 2023/1/29
13924 - feat: 允许未定义的 ref 用于 url (#2473)

在 MIT 许可证下发布。