From 86013c46dc4cf753931672b59ad8c5af617430e5 Mon Sep 17 00:00:00 2001 From: Dan Rose Date: Tue, 8 Nov 2022 08:01:39 -0600 Subject: [PATCH] feat(useWebsocket): url to be ref/computed (#2367) --- packages/core/useWebSocket/index.md | 2 ++ packages/core/useWebSocket/index.ts | 17 +++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/core/useWebSocket/index.md b/packages/core/useWebSocket/index.md index 4fa9c1b9c11..fa6e16fc70b 100644 --- a/packages/core/useWebSocket/index.md +++ b/packages/core/useWebSocket/index.md @@ -22,6 +22,8 @@ Auto-connect (enabled by default). This will call `open()` automatically for you and you don't need to call it by yourself. +If url is provided as a ref, this also controls whether a connection is re-established when its value is changed (or whether you need to call open() again for the change to take effect). + ### Auto-close Auto-close-connection (enabled by default). diff --git a/packages/core/useWebSocket/index.ts b/packages/core/useWebSocket/index.ts index 48e68da7d12..a79459db79a 100644 --- a/packages/core/useWebSocket/index.ts +++ b/packages/core/useWebSocket/index.ts @@ -1,7 +1,7 @@ import type { Ref } from 'vue-demi' -import { ref } from 'vue-demi' -import type { Fn } from '@vueuse/shared' -import { tryOnScopeDispose, useIntervalFn } from '@vueuse/shared' +import { ref, watch } from 'vue-demi' +import type { Fn, MaybeComputedRef } from '@vueuse/shared' +import { resolveRef, tryOnScopeDispose, useIntervalFn } from '@vueuse/shared' import { useEventListener } from '../useEventListener' export type WebSocketStatus = 'OPEN' | 'CONNECTING' | 'CLOSED' @@ -143,7 +143,7 @@ function resolveNestedOptions(options: T | true): T { * @param url */ export function useWebSocket( - url: string, + url: MaybeComputedRef, options: UseWebSocketOptions = {}, ): UseWebSocketReturn { const { @@ -159,6 +159,7 @@ export function useWebSocket( const data: Ref = ref(null) const status = ref('CLOSED') const wsRef = ref() + const urlRef = resolveRef(url) let heartbeatPause: Fn | undefined let heartbeatResume: Fn | undefined @@ -206,7 +207,7 @@ export function useWebSocket( if (explicitlyClosed) return - const ws = new WebSocket(url, protocols) + const ws = new WebSocket(urlRef.value, protocols) wsRef.value = ws status.value = 'CONNECTING' @@ -281,9 +282,6 @@ export function useWebSocket( heartbeatResume = resume } - if (immediate) - _init() - if (autoClose) { useEventListener(window, 'beforeunload', () => close()) tryOnScopeDispose(close) @@ -296,6 +294,9 @@ export function useWebSocket( _init() } + if (immediate) + watch(urlRef, open, { immediate: true }) + return { data, status,