vue中封装websocket,全局调用

项目场景:

项目中多个地方,多个页面的数据需要同一个websocket实时推送.


解决方案:

第一步,全局创建一个global.js,定义全局变量

javascript 复制代码
export default {
    ws: {},
    setWs: function(newWs) {
        this.ws = newWs
    }
}

第二步,在main.js中引入global.js,并将global的文件挂载在vue实例上

javascript 复制代码
import  global from "./utils/global.js";
Vue.prototype.$global = global

第三步,在入口也或者你的项目首页中初始化websocket,并在create()中调用

以app.vue为例

javascript 复制代码
created() {
//获取webscoket地址
  axios.get("/js/mapconfig.json").then((res) => {
    const { wsUrl } = res.data;
      const wsURL=wsUrl+this.UUID;//ws地址 UUID是随机数,我们需要链接上之后保持一致,将其存在vuex中
      this.localSocket(wsURL)
  });
},
methods:{
 // 初始化 webSocket 
    localSocket(url) {
      // return
      let that = this;
      if ("WebSocket" in window) {
        that.ws = new WebSocket(url);
        that.$global.setWs(that.ws);
        that.ws.onclose = function() {
          // 关闭 websocket
          setTimeout(() => {
            that.localSocket(url);
          }, 2000);
        };
      } else {
        // 浏览器不支持 WebSocket
        console.log("您的浏览器不支持 WebSocket!");
      }
    },
  }
复制代码
mapconfig.json的文件,在public/js下新建mapconfig.json,这样是vue出包后在dist包中能实时改地址
javascript 复制代码
{
    "wsUrl":"ws:\\123.58.106.147:20232/ws/connect/",
}

第四步,在需要发送消息的页面调用发送消息接口

javascript 复制代码
mounted(){
    let data = {
      "snCode":this.taskSessData.droneId,
      "moduleCode":"HOME_LINK",
      "open":true,//open:打开驾驶舱时传true 关闭时传false
      'id':this.UUId,
    };
    this.handdleMsg(data)
  },
  methods:{
    // 发送和接收消息
    handdleMsg(data) {
      let that = this;
      if (that.$global.ws && that.$global.ws.readyState == 1) {
        that.$global.ws.send(JSON.stringify(data));
      }
      that.$global.ws.onmessage = function(res) {
        const resData=JSON.parse(res.data);
        // moduleCode=="HOME_DATA"是驾驶舱飞行数据 HOME_VIDEO是驾驶舱视频流数据 HOME_WEB_MAP地图信息入口
        if (resData.moduleCode=="HOME_DATA") {
          that.FlightData=resData;
          // 更新飞机的在线离线状态
          that.$store.commit('setConnectStatusV',that.FlightData.connectStatus)
        }
        if (resData.moduleCode=="HOME_VIDEO") {
          that.videoData=resData.videoList;
        }
        if (resData.moduleCode=="HOME_WEB_MAP") {
          that.mapData=resData;
        }
      };
    },
  }

离开此页面发送关闭消息

javascript 复制代码
 destroyed() {
    let data = {
      "snCode":this.taskSessData.droneId,
      "moduleCode":"HOME_LINK",
      "open":false,//open:打开驾驶舱时传true 关闭时传false
      'id':this.UUId,
    };
    this.handdleMsg(data)
  },
相关推荐
小信丶12 分钟前
解决 pnpm dev 报错:系统禁止运行脚本的问题
前端·vue.js·windows·npm
૮・ﻌ・19 分钟前
Vue3:组合式API、Vue3.3新特性、Pinia
前端·javascript·vue3
前端不太难20 分钟前
RN + TypeScript 项目越写越乱?如何规范架构?
前端·javascript·typescript
神算大模型APi--天枢64620 分钟前
全栈自主可控:国产算力平台重塑大模型后端开发与部署生态
大数据·前端·人工智能·架构·硬件架构
苏打水com21 分钟前
第十五篇:Day43-45 前端性能优化进阶——从“可用”到“极致”(对标职场“高并发场景优化”需求)
前端·css·vue·html·js
@大迁世界28 分钟前
08.CSS if() 函数
前端·css
Moment35 分钟前
小米不仅造车,还造模型?309B参数全开源,深度思考完胜DeepSeek 🐒🐒🐒
前端·人工智能·后端
苏打水com38 分钟前
第十六篇:Day46-48 前端安全进阶——从“漏洞防范”到“安全体系”(对标职场“攻防实战”需求)
前端·javascript·css·vue.js·html
5C2440 分钟前
从思想到实践:前端工程化体系与 Webpack 构建架构深度解析
前端·前端工程化
咕噜企业分发小米1 小时前
如何平衡服务器内存使用率和系统稳定性?
java·服务器·前端