vue+websocket,封装和页面实际使用情况

本文介绍了如何在Vue项目中封装WebSocket功能,包括初始化连接、接收和发送数据的处理,以及在页面实际使用中的调用方法。在main.js中全局引用并挂载到Vue原型上,以便在各个组件中使用。同时,展示了在组件生命周期中开启和关闭WebSocket连接的时机,以及处理接收到的数据回调函数的应用。
摘要由CSDN通过智能技术生成

vue+websocket,封装和页面实际使用情况

一、 封装的socket.js

let webSocket = null;
let globalCallback = null;//定义外部接收数据的回调函数
 
//初始化websocket
function initWebSocket(url,headers=[]) {
  if ("WebSocket" in window) {
    webSocket = new WebSocket(url,headers);//创建socket对象
    console.log(webSocket)
  } else {
    alert("该浏览器不支持websocket!");
  }
  //打开
  webSocket.onopen = function() {
    webSocketOpen();
  };
  //收信
  webSocket.onmessage = function(e) {
    webSocketOnMessage(e);
  };
  //关闭
  webSocket.onclose = function() {
    webSocketClose();
  };
  //连接发生错误的回调方法
  webSocket.onerror = function() {
    console.log("WebSocket连接发生错误");
  };
}
 
//连接socket建立时触发
function webSocketOpen(e) {
  if (e === "LOGIN") {
    const data = {
      type: "CONNECT",
      token: sessionStorage.getItem("token") || ""
    };
    sendSock(data, function() {});
  }
  console.log("WebSocket连接成功");
}
 
//客户端接收服务端数据时触发,e为接受的数据对象
function webSocketOnMessage(e) {
  const data = JSON.parse(e.data);//根据自己的需要对接收到的数据进行格式化
  globalCallback(data);//将data传给在外定义的接收数据的函数,至关重要。
  /*在此函数中还可以继续根据项目需求来写其他东西。 比如我的项目里需要根据接收的数据来判断用户登录是否失效了,此时需要关闭此连接,跳转到登录页去。*/
}
 
//发送数据
function webSocketSend(data) {
  webSocket.send(JSON.stringify(data));//在这里根据自己的需要转换数据格式
}
 
//关闭socket
function webSocketClose() {
  //因为我建立了多个socket,所以我需要知道我关闭的是哪一个socket,就做了一些判断。
  if (
    webSocket.readyState === 1 &&
    webSocket.url === "ws:"
  ) {
    webSocket.close();//这句话是关键,之前我忘了写,一直没有真正的关闭socket
    console.log("对话连接已关闭");
  }
}
 
//在其他需要socket地方调用的函数,用来发送数据及接受数据
function sendSock(agentData, callback) {
  globalCallback = callback;//此callback为在其他地方调用时定义的接收socket数据的函数,此关重要。
 
//此处先判断socket连接状态 
 
  switch (webSocket.readyState) {
    //CONNECTING:值为0,表示正在连接。
    case webSocket.CONNECTING:
      setTimeout(function() {
        webSocketSend(agentData, callback);
      }, 1000);
      break;
    //OPEN:值为1,表示连接成功,可以通信了。
    case webSocket.OPEN:
      webSocketSend(agentData);
      break;
    //CLOSING:值为2,表示连接正在关闭。
    case webSocket.CLOSING:
      setTimeout(function() {
        webSocketSend(agentData, callback);
      }, 1000);
      break;
    //CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
    case webSocket.CLOSED:
      // do something
      break;
    default:
      // this never happens
      break;
  }
}
 
//将初始化socket函数、发送(接收)数据的函数、关闭连接的函数export出去
export {
  initWebSocket,
  webSocketClose,
  sendSock
};

二、在main.js引用

```js
   //全局发送消息
	import * as socketApi from '@/utils/Socket'// 找到封装的socket.js文件
    Vue.prototype.socketApi = socketApi //将其挂在原型上,这样 $socketApi就在所有的 Vue 实例中可用了

三、应用页面

data(){
return{
  // websocket地址
      wsUrl: "ws://",//定义socket连接地址
}},
  mounted() {
    this.webSocketData();
  },
//离开页面关闭socket
 destroyed() {
     //在离开此页面的时候主动关闭socket
      this.socketApi.webSocketClose();
  },
    methods: {
      // 接收socket回调函数返回数据的方法
      getConfigResult(msg) {
       //服务端返回的数据
          // 业务逻辑处理
      this.sourceData = msg;
      },
       websocketSend(data) {
        //data为要发送的数据,this.getConfigResult为回调函数,用于在此页面接收socket返回的数据。
        //至关重要!我一开始没写这个,就蒙了,咋才能到拿到回来的数据呢。
        this.socketApi.sendSock(data, this.getConfigResult);
      },

    webSocketData() {
        //建立socket连接.
        const Authorization = getToken();
        this.socketApi.initWebSocket(this.wsUrl,Authorization);
         //data为和后端商量好的数据格式
        this.fun()
    },
    //发送消息得数据函数
    fun(){
         //data为和后端商量好的数据格式
       const queryRef = this.$refs.queryRef;
      if (queryRef) {
        const params = {
          satName: queryRef.formData.sat,
          dtS: queryRef.timeRange.length > 1 ? queryRef.timeRange[0] : "",
          dtE: queryRef.timeRange.length > 1 ? queryRef.timeRange[1] : "",
        };
         this.websocketSend(params);
      }
    },
    }
    
Vue3中,我们可以通过封装Websocket类来实现对Websocket使用。通过引用和可以得知,在Vue3中使用Websocket可以实现实时数据传输。为了方便使用,我们可以封装一个好用的Websocket类。具体步骤如下: 1. 首先,安装Websocket的依赖,可以通过npm或yarn等包管理工具进行安装。 2. 创建一个Websocket类,该类应该包含Websocket的连接、发送消息和接收消息的方法。可以参考引用中提到的封装Websocket类的方法。 3. 在Vue3中,可以将Websocket封装成一个Vue插件,以便全局使用。具体步骤如下: - 创建一个插件文件,例如`websocket-plugin.js`。 - 在插件文件中,引入Websocket类并创建一个Vue插件对象。 - 在插件对象的`install`方法中,将Websocket实例挂载到Vue的原型上,以便在组件中可以通过`this.$websocket`来访问Websocket实例。 - 最后,导出该插件对象。 - 示例代码如下: ```javascript import Websocket from './websocket.js'; const WebsocketPlugin = { install(Vue) { Vue.prototype.$websocket = new Websocket('ws://localhost:8080'); }, }; export default WebsocketPlugin; ``` 4. 在Vue项目中,将该插件引入并使用。可以在`main.js`或其他入口文件中使用`app.use()`方法来安装该插件。示例代码如下: ```javascript import { createApp } from 'vue'; import App from './App.vue'; import WebsocketPlugin from './websocket-plugin.js'; const app = createApp(App); app.use(WebsocketPlugin); app.mount('#app'); ``` 通过以上步骤,我们就可以在Vue3中封装Websocket,并在全局范围内使用了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [基于Vue3封装一个好用的Websocket](https://blog.csdn.net/qq_27244301/article/details/130098672)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值