ai问答:使用 Vue3 组合式API 和 TS 封装 websocket 断线重连

2023-06-28,,

这是一个使用 Vue3 组合式 API 和 TS 封装 websocket 的例子

这个组件在 setup 中:

创建了一个 WebSocket 连接
定义了 sendMessage 方法发送消息
监听 WebSocket 的开启、接收消息和关闭事件
暴露 sendMessage、onClose 方法给模板使用

import {ref} from 'vue'

export default {
setup() {
const ws = ref<WebSocket>()
const text = ref<number | string>(1)
const reconnect = ref<boolean>(false) function init() {
// http://www.websocket-test.com/
ws.value = new WebSocket('ws://121.40.165.18:8800') // 实例 - 打开连接
ws.value.onopen = () => {
console.log('WebSocket connected!')
reconnect.value = false
} // 实例 - 接受数据
ws.value.onmessage = ({data}) => {
console.log('Received message:', data)
} // 实例 - 监听关闭
ws.value.onclose = () => {
console.log('WebSocket closed!')
if (!reconnect.value) {
reconnect.value = true
setTimeout(init, 1000)
}
}
} // 实例 - 关闭连接
function onClose() {
ws.value?.close()
} // 实例 - 发送数据
function sendMessage(msg: any) {
text.value = msg + 1
ws.value?.send(msg + 1)
} init() return {text, sendMessage, onClose}
}
}

那么,可以通过组件:

输入消息(默认是数字)并点击 发送按钮
触发 sendMessage 方法,通过 WebSocket 连接发送消息
接收来自 WebSocket 服务端的响应消息
监听 WebSocket 状态变化
触发 onClose 方法,关闭 WebSocket 连接,测试断线重连功能

使用这个组件的模板:

<div class="parent">
<div>
<input v-model="text">
<button @click="sendMessage(text)">Send</button>
</div>
<div>
<button @click="onClose">断线重连</button>
</div>
</div>

这是一个基本的 WebSocket 断线重连示例:

在 setup 中处理逻辑
暴露需要在模板或外部使用的方法/数据
模板中可以直接使用这些方法/数据

完善的演示代码如下:

<template>
<div class="parent">
<div>
<input v-model="text">
<button @click="sendMessage(text)">Send</button>
</div>
<ul>
<li v-for="(num,idx) in list" key="idx" v-html="num"></li>
</ul>
<div v-if="active">
<button @click="onClose">断线重连</button>
</div>
</div>
</template>
import {ref} from 'vue'

export default {
setup() {
const ws = ref<WebSocket>()
const text = ref<number|string>(1)
const reconnect = ref<boolean>(false) const list = ref<any>([])
const active = ref(false)
const timer = ref(0) function init() {
// http://www.websocket-test.com/
ws.value = new WebSocket('ws://121.40.165.18:8800') // 实例 - 打开连接
ws.value.onopen = () => {
console.log('WebSocket connected!') // 断线重连 - 标记
reconnect.value = false // 断线重连 - 按钮
active.value = true // 停止重连
clearInterval(timer.value)
} // 实例 - 接受数据
ws.value.onmessage = ({data}) => {
console.log('Received message:', data)
list.value.push(data);
} // 实例 - 监听关闭
ws.value.onclose = () => {
console.log('WebSocket closed!')
if (!reconnect.value) {
connect();
}
}
} // 实例 - 关闭连接
function onClose() {
list.value = []
active.value = false
ws.value?.close()
} // 实例 - 发送数据
function sendMessage(msg: string) {
text.value = msg + 1
ws.value?.send(msg + 1)
} init() // 断线重连
function connect() {
reconnect.value = true
timer.value = setInterval(init, 1000)
} return {text, list, active, sendMessage, onClose}
}
}

ai问答:使用 Vue3 组合式API 和 TS 封装 websocket 断线重连的相关教程结束。

《ai问答:使用 Vue3 组合式API 和 TS 封装 websocket 断线重连.doc》

下载本文的Word格式文档,以方便收藏与打印。