vue如何优雅的使用全局WebSocket

 更新时间:2024年08月29日 10:57:29   作者:不应识  
这篇文章主要介绍了vue如何优雅的使用全局WebSocket问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

描述

项目需求是做一个全局聊天系统,随时接受新消息通知,实时更新聊天内容

方式就是做一个全局的ws属性,统一发送,统一接受,使用xuex存储需要的数据

代码步骤

第一步

utils下新建globalWs.js, 用来处理全部的ws事件,

代码如下:

//utils/globalWs.js
import { Notification } from 'element-ui'  //引入ui组件, 作消息通知
import router from '@/router/routers'  //引入router, 作页面跳转
import store from '@/store'  //引入store, 作聊天消息存储

export default {
  ws: {},
  //发送ws方法
  sendWs: function(data) {
    console.log(data, '发送的消息')
    this.ws.send(JSON.stringify(data))
  },
  //初始化ws
  initWs: function() {
    const that = this
    if ('WebSocket' in window) {
      // 打开一个 web socket
      const ws = new WebSocket(process.env.VUE_APP_WS_API)

      that.ws = ws
      ws.onopen = function() {
        console.log('ws.onopen')
        // Web Socket 已连接上,使用 that.sendWs() 方法发送数据, 例如
        that.sendWs({name:'张三'})
      }
      ws.onmessage = function(evt) {
        console.log('全局数据已接收...', evt.data)
        var receivedData = JSON.parse(evt.data)
        
        // 添加聊天记录代码
        // store.commit('ADD_CALL_LOG', data)

        //新消息通知
        //Notification.info({
        //  title: '消息',
        //  message: '您有一条新的消息',
        //  onClick: () => {
        //     if (router.currentRoute.fullPath != '/airobot/chat') {
        //      页面跳转
        //      router.push('/airobot/chat')
        //    }
        //  }
        //})
      }
    }
    // 异常断开重连(2023.4.12更新)
    ws.onerror = function(err) {
        console.log('websocket 断开: ' + err, ws.readyState)
        if (ws.readyState != 0) {
          setTimeout(() => {
            that.initWs()
          }, 1000)
        }
      }
  },
  //断开socked方法
  closeWs: function() {
    // 关闭定时器
    console.log('关闭定时器')
    clearInterval(this.heartbeat)
    console.log('关闭ws')
    this.ws.close()
  }
}

第二步

main.js中注册全局属性

//main.js
import globalWs from './utils/globalWs.js'
Vue.prototype.$globalWs = globalWs

优雅之处讲解

可以在任何时刻去选择初始化ws, 可以是app.vue中, 也可以是验证完用户信息后

可以随时使用globalWs.send()发送聊天消息

  • js中初始化:
import globalWs from '@/utils/globalWs.js'
globalWs.initWs()
  • vue中初始化:
this.globalWs.initWs()

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue实现无缝轮播效果

    Vue实现无缝轮播效果

    这篇文章主要为大家详细介绍了Vue实现无缝轮播效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • vue中 $forceUpdate的使用解析

    vue中 $forceUpdate的使用解析

    这篇文章主要介绍了vue中 $forceUpdate的使用解析,该方案是比较好的一种方式,比如说我们尝试直接给某个​​object​​增加一个属性,发现页面上没有效果;直接将length变成0来清空数组,下文详细资料需要的小伙伴可以参考一下
    2022-04-04
  • vue elementUI el-form 数据无法赋值且不报错的问题及解决方法

    vue elementUI el-form 数据无法赋值且不报错的问题及解决方法

    vue项目中使用elementUI的el-form组件,里面有部分后端数据遍历的字段和部分确定的字段,遇到个问题遍历的字段可以修改值但是确定的几个字段无法修改值,下面小编给大家分享vue elementUI el-form 数据无法赋值且不报错的问题及解决方法,感兴趣的朋友一起看看吧
    2023-12-12
  • maptalks+three.js+vue webpack实现二维地图上贴三维模型操作

    maptalks+three.js+vue webpack实现二维地图上贴三维模型操作

    这篇文章主要介绍了maptalks+three.js+vue webpack实现二维地图上贴三维模型操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 浅析vue-router jquery和params传参(接收参数)$router $route的区别

    浅析vue-router jquery和params传参(接收参数)$router $route的区别

    今天做项目时踩到了vue-router传参的坑(jquery和params),所以决定总结一下二者的区别。感兴趣的朋友跟随脚本之家小编一起看看吧
    2018-08-08
  • Vue项目中0.js过大导致首屏加载慢的问题解决方法

    Vue项目中0.js过大导致首屏加载慢的问题解决方法

    在 Vue 项目开发完成后,进行打包部署时,首屏加载速度是影响用户体验的关键因素之一,最近我在项目中就遇到了 0.js 过大导致首屏加载时间变慢的问题,经过一番排查和优化,成功解决了该问题,特此记录分享给大家,需要的朋友可以参考下
    2025-11-11
  • VSCode搭建Vue项目的方法

    VSCode搭建Vue项目的方法

    这篇文章主要介绍了VSCode搭建Vue项目的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • vue3 + Ant Design 实现双表头表格的效果(横向表头+纵向表头)

    vue3 + Ant Design 实现双表头表格的效果(横向表头+纵向表头)

    这篇文章主要介绍了vue3 + Ant Design 实现双表头表格(横向表头+纵向表头),需要的朋友可以参考下
    2023-12-12
  • vue2 web多标签输入框elinput是否当前焦点详解

    vue2 web多标签输入框elinput是否当前焦点详解

    这篇文章主要介绍了vue2 web多标签输入框elinput是否当前焦点的相关资料,讲解了如何在产品中实现用户输入文字后按下回车键生成标签并显示在页面上的功能,通过组件的使用和改造,解决了输入不连续的问题,需要的朋友可以参考下
    2025-01-01
  • vscode+vue cli3.0创建项目配置Prettier+eslint方式

    vscode+vue cli3.0创建项目配置Prettier+eslint方式

    这篇文章主要介绍了vscode+vue cli3.0创建项目配置Prettier+eslint方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10

最新评论