当前位置: 首页 > news >正文

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>

http://www.jsqmd.com/news/343899/

相关文章:

  • 那些棘手问题往往不是在加班到深夜时解决的
  • 新加坡收银系统新加坡 PDPA合规—支付代理商
  • 前缀和的前缀和
  • 2026年猫玩具激光笔核心厂商甄选与适配指南 - 2026年企业推荐榜
  • 抖音商家如何快速精准的找到自己需要的达人?
  • 2026年推荐海外GEO优化客户信赖 - 行业平台推荐
  • Python爬虫实现无限滚动页面的自动点击与内容抓取
  • 寒假日记
  • 2026浙江激光笔制造厂选型指南:晶瑞如何领跑市场? - 2026年企业推荐榜
  • 2026年河南花生种子直销可靠厂家综合评测与选购指南 - 2026年企业推荐榜
  • 她和撒贝宁同居多年,却转身投入富家怀抱,如今两人境况天差地别
  • webrtc中音频3A处理开关配置
  • 邓亚萍近况传来,让所有人都没料到!实在令人惊喜·····
  • 2026年正规的海外GEO热门优选 - 行业平台推荐
  • std::string打印原始字节查看是否乱码
  • 2026年温州红外线激光制造商综合评估与选择指南 - 2026年企业推荐榜
  • 当55岁周涛同框61岁李修平,素颜出镜,才知电台的审美有多绝
  • DevOps实战系列 - 集成GitLab+阿里云OSS实现Java项目自动化构建并将制品上传Aliyun OSS
  • Sora2 Pro 终于来了,国内开发者如何低成本、零门槛接入?
  • DevOps实战系列 - 集成Arbess+阿里云OSS,下载Aliyun OSS制品进行自动化部署
  • 企业“数字员工”生产线:机遇与挑战——红迅软件AI低代码平台的实践与思考
  • 刚刚:Anthropic官宣将永久保持无广告对话环境(Claude is a space to think)
  • 2026年武汉洪山区幼儿英语兴趣班深度评测与选型指南 - 2026年企业推荐榜
  • 天远车辆过户查询API集成指南:Node.js 全栈视角下的二手车数据挖掘
  • 2026年书桌品牌实力榜:三大厂商多维解析与选购指南 - 2026年企业推荐榜
  • 如何加热寿司
  • 跨域跨境电商的下一场硬仗:欧盟小包成本上行、产品安全责任加码、投放进入“弱个性化”
  • 跨域跨境电商新周期:成本上行只是表象,真正的分水岭是“系统能力”
  • 【MM25-华南理工】Omni-IML:迈向统一的图像篡改定位
  • 钛和检测冲刺港股:9个月营收5.9亿 净利同比降16%