news 2026/7/16 8:07:29

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/7/1 11:48:52

webrtc中音频3A处理开关配置

webrtc中音频3A处理开关配置 1 音频引擎初始化的时对3A处理进行设置 WebRtcVoiceEngine::Init media/engine/webrtc_voice_engine.hWebRtcVoiceEngine::ApplyOptions media/engine/webrtc_voice_engine.hmodules/audio_processing/audio_processing_impl.h AudioProcessingImpl…

作者头像 李华
网站建设 2026/7/1 8:52:20

那些棘手问题往往不是在加班到深夜时解决的

有个挺玄的现象&#xff1a;那些困扰了好几天的棘手问题&#xff0c;往往不是在加班到深夜时解决的&#xff0c;反而是在放松喝咖啡、散步&#xff0c;甚至洗澡的时候突然想通的。这不是玄学&#xff0c;是真实的心理机制在起作用。焦虑会让大脑变窄如果带着焦虑和紧绷的情绪去…

作者头像 李华
网站建设 2026/7/15 7:36:47

Sora2 Pro 终于来了,国内开发者如何低成本、零门槛接入?

2026 年初&#xff0c;Sora2 Pro 的发布无疑是 AI 视频领域的“核弹级”消息。从文本直接生成电影级画质&#xff0c;支持物理模拟与多镜头控制&#xff0c;它不再只是工具&#xff0c;而是颠覆行业的“魔法”。 然而&#xff0c;对于国内开发者而言&#xff0c;想要使用官方 …

作者头像 李华
网站建设 2026/7/7 20:31:32

多项目并行?用云盒子企业网盘轻松搞定团队协作与信息同步!

在快节奏的企业环境中&#xff0c;多项目并行已成为常态。想象一下&#xff1a;一个客户经理同时跟进三个项目&#xff0c;项目管理过程中&#xff0c;如果信息不同步、资料散乱&#xff0c;团队效率将直线下降。而一些方案往往只需稍作修改&#xff0c;就能复用到其他项目上&a…

作者头像 李华
网站建设 2026/7/1 16:38:25

从零开始玩转金融LLM:12个数据集+8个模型+完整代码实战

温馨提示&#xff1a;若页面不能正常显示数学公式和代码&#xff0c;请阅读原文获得更好的阅读体验。 丁闪闪 (lianxhcn163.com) 曾咏新 厦门大学 (zengyongxinhpe163.com) 提要&#xff1a;本文系统整理了金融大语言模型 (LLM) 研究的核心资源&#xff0c;包括 12 个主流金融数…

作者头像 李华
网站建设 2026/7/14 17:53:01

NAS + 本地小参数模型:一套可落地的运行范式

如果你正在把这套思路落到真实项目里——比如合同审核、资料归档、结算核对、知识库建设——可以考虑用 RollCode 低代码平台 快速搭建文件驱动的流程页面、结果展示与 CPC 引流结构&#xff0c;把“状态型系统”与“业务转化路径”一次性设计清楚&#xff0c;避免只停留在概念…

作者头像 李华