news 2026/6/22 19:56:12

Vue 中使用 WebSocket

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue 中使用 WebSocket

在 Vue 中使用 WebSocket 核心是封装通用 WebSocket 工具类(保证复用性、统一管理连接状态),再在组件中调用,同时结合 Vue 生命周期管理连接的创建与销毁,避免内存泄漏和无效连接。以下是适配 Vue2的完整实现方案

方案一 使用Mixin

mixin文件websocket-mixin.js

// src/mixins/aiWebsocketMixin.jsexportdefault{data(){return{ws:null,wsConnected:false,wsReconnectTimer:null,wsReconnectCount:0,wsMaxReconnectAttempts:5,wsReconnectInterval:3000,// 心跳(可选,若后端不支持 ping/pong,可注释掉相关代码)wsHeartbeatTimer:null,wsHeartbeatInterval:30000,// 30秒wsPongTimeoutId:null,wsPongTimeout:10000,}},methods:{/** * 初始化 WebSocket 连接(传入完整 URL) * @param {string} wsUrl - 完整的 WebSocket 地址,含查询参数 */initAiWebSocket(wsUrl){this.closeAiWebSocket()try{this.ws=newWebSocket(wsUrl)this.ws.onopen=()=>{console.log('AI WebSocket connected')this.wsConnected=truethis.wsReconnectCount=0this.$emit('ws-open')// this.startHeartbeat()}this.ws.onmessage=(event)=>{letdatatry{data=JSON.parse(event.data)}catch(e){console.warn('Non-JSON message:',event.data)return}// 如果后端支持 pong,可保留;否则可删除此判断if(data.type==='pong'){this.handlePong()return}// 透传业务消息this.$emit('ws-message',data)}this.ws.onclose=()=>{console.log('AI WebSocket disconnected')this.wsConnected=falsethis.$emit('ws-close')this.stopHeartbeat()this.scheduleReconnect(wsUrl)}this.ws.onerror=(error)=>{console.error('AI WebSocket error',error)this.$emit('ws-error',error)}}catch(err){console.error('Failed to create WebSocket',err)}},sendAiMessage(payload){if(this.ws?.readyState===WebSocket.OPEN){this.ws.send(JSON.stringify(payload))}else{console.warn('WebSocket not open. Message not sent:',payload)}},// —— 心跳(按需启用)——startHeartbeat(){this.stopHeartbeat()// 如果后端不支持 ping/pong,可注释掉 send 部分或整个定时器this.wsHeartbeatTimer=setInterval(()=>{if(this.ws?.readyState===WebSocket.OPEN){// 可选:发送心跳包// this.ws.send(JSON.stringify({ type: 'ping' }))}},this.wsHeartbeatInterval)},handlePong(){if(this.wsPongTimeoutId){clearTimeout(this.wsPongTimeoutId)this.wsPongTimeoutId=null}},stopHeartbeat(){if(this.wsHeartbeatTimer){clearInterval(this.wsHeartbeatTimer)this.wsHeartbeatTimer=null}if(this.wsPongTimeoutId){clearTimeout(this.wsPongTimeoutId)this.wsPongTimeoutId=null}},// —— 重连 ——scheduleReconnect(wsUrl){if(this.wsReconnectCount<this.wsMaxReconnectAttempts){this.wsReconnectCount++console.log(`Reconnecting... (${this.wsReconnectCount}/${this.wsMaxReconnectAttempts})`)this.wsReconnectTimer=setTimeout(()=>{this.initAiWebSocket(wsUrl)},this.wsReconnectInterval)}},// —— 关闭 ——closeAiWebSocket(){this.stopHeartbeat()if(this.wsReconnectTimer){clearTimeout(this.wsReconnectTimer)this.wsReconnectTimer=null}if(this.ws){this.ws.close()this.ws=nullthis.wsConnected=false}}},beforeDestroy(){this.closeAiWebSocket()}}

使用

<template><div><button @click="handleSend">发送</button>{{message}}</div></template><script>importaiWebsocketMixinfrom'@/mixins/aiWebsocketMixin'exportdefault{name:'Websocket',mixins:[aiWebsocketMixin],data(){return{message:''}},mounted(){constwsUrl='ws://127.0.0.1:8000/chat'this.initAiWebSocket(wsUrl)},created(){this.$on('ws-message',this.handleMessage)},methods:{// —————— 发送消息 ——————handleSend(){constparams={message:'你好'}this.sendAiMessage(params)},// —————— 消息处理 ——————handleMessage(message){this.message=message},},beforeDestroy(){this.$off('ws-message',this.handleMessage)}}</script>

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/21 22:20:55

抖音商家如何快速精准的找到自己需要的达人?

从海量达人中锁定最适合的合作对象&#xff0c;抖音商家达人筛选全攻略在此。 在抖音电商生态中&#xff0c;达人合作已成为品牌获取流量、提升销量的重要途径。面对平台上数以万计的带货达人&#xff0c;许多商家却陷入“盲目寻找”或“选择困难”的困境。 如何从海量达人中找…

作者头像 李华
网站建设 2026/6/1 17:54:34

合格Java程序员必备:Spring全家桶技术!

Spring这个技术栈&#xff0c;在LZ心目中一直是最好的Java项目&#xff0c;没有之一。这玩意面试必考工作必用&#xff0c;是我们Java人的饭碗&#xff1b;它跟它后面诞生的一系列解决方案被我们亲切的成为Spring全家桶&#xff0c;如果你自诩是一名合格的Java程序员&#xff0…

作者头像 李华
网站建设 2026/6/20 4:43:08

大厂Java面试前复习的正确姿势(面试题+场景题)

金三银四还在继续&#xff0c;又是一个跳槽的好季节&#xff0c;准备跳槽的同学都摩拳擦掌准备大面好几场&#xff0c;今天为大家准备了互联网面试必备的 1 到 5 年 Java 面试者都需要掌握的面试题&#xff0c;分别 JVM&#xff0c;并发编程&#xff0c;MySQL&#xff0c;Tomca…

作者头像 李华
网站建设 2026/6/22 8:41:19

vscode的md文件显示memaid图

VSCode 支持在 Markdown 中显示 Mermaid 图&#xff0c;主要有两种方式&#xff1a;&#x1f680; 方式一&#xff1a;使用内置功能 (VSCode ≥ 1.75)新版本的 VSCode 已内置 Mermaid 支持&#xff0c;无需安装额外插件。确认版本&#xff1a;确保您的 VSCode 版本 ≥ 1.75。编…

作者头像 李华
网站建设 2026/6/21 18:39:12

基于微信小程序生猪养殖信息化管理系统(源码+论文+部署+安装)

感兴趣的可以先收藏起来&#xff0c;还有在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望可以帮到大家。 一、程序背景 随着我国社会经济发展&#xff0c;居民对猪肉食品安全和质量的关注度持续提升&#xff0…

作者头像 李华