watcheffect 适合响应式监听 websocket 连接状态并触发重连:通过 ref 管理 socketref、isconnected 等状态,封装安全重连函数,watcheffect 监听 isconnected 变 false 且非重连中时调用重连,事件回调中显式更新响应式变量以触发监听。

watchEffect 本身不直接管理 WebSocket 连接或重连逻辑,但它非常适合**响应式地监听连接状态变化,并触发重连行为**。关键在于:把 WebSocket 实例和连接状态(如 isConnected、retryCount)纳入响应式系统,再用 watchEffect 捕获状态变更并执行重连策略。
1. 建立响应式的 WebSocket 状态管理
用 ref 或 reactive 包裹连接相关状态,确保 watchEffect 能追踪到变化:
-
socketRef:存储 WebSocket 实例(可设为null初始值) -
isConnected:布尔值,标识当前是否已连接 -
retryCount:记录连续重试次数,用于退避控制 -
isReconnecting:避免重复触发重连
例如:
const socketRef = ref(null)const isConnected = ref(false)
const retryCount = ref(0)
const isReconnecting = ref(false)
2. 封装安全的重连函数
重连逻辑需判断当前状态,防止并发调用或无效重试:
- 先清空旧连接(
socketRef.value?.close()) - 重置
isConnected为false - 设置
isReconnecting为true,启动带延迟的重试(如指数退避) - 连接成功后重置
retryCount和isReconnecting
注意:不要在 watchEffect 内部直接写 new WebSocket(...) —— 应抽离为独立函数,便于测试和复用。
3. 用 watchEffect 监听并触发重连
监听 isConnected 的“假值”(即断开时),并在满足条件时调用重连函数:
if (!isConnected.value && !isReconnecting.value) {
reconnectWebSocket()
}
})
这样,只要 isConnected 变为 false(比如收到 onclose 或 onerror 事件后手动设置),且未处于重连中,就会自动触发重连流程。
4. 在 WebSocket 事件中更新响应式状态
必须在事件回调里显式更新响应式变量,否则 watchEffect 不会感知:
-
onopen→ 设置isConnected.value = true、retryCount.value = 0 -
onclose/onerror→ 设置isConnected.value = false,并可选增加retryCount.value++
示例片段:
socketRef.value = new WebSocket('wss://example.com')socketRef.value.onopen = () => {
isConnected.value = true
retryCount.value = 0
}
socketRef.value.onclose = () => {
isConnected.value = false
retryCount.value++
}
不复杂但容易忽略:watchEffect 的响应性依赖于你是否真正读取了响应式变量。只要在回调里访问了 isConnected.value,它就会被收集为依赖;断开时值变 false,effect 就会重新运行。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











