vue实现websocket客服聊天功能

 更新时间:2021年10月08日 17:32:41   作者:唯心所现,唯识所变  
这篇文章主要为大家详细介绍了vue实现websocket客服聊天功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文章主要介绍如何实现一个基本的聊天,后续会添加表情包,传照片等功能

其实刚开始接触的时候,我最大的疑惑是聊天功能的前期是否需要搭建什么框架、下载一些什么东西之类的,结果就是,其实websocket可以直接使用,然后前后端搭配,也是免费的,暂时没发现需要收费功能的东西。

实现效果图:

首先封装一个websocket.js文件(大家可以直接复制,然后把接收/发送数据之类的格式改成自己的就可以啦)

import store from '@/store'
var webSocket = null;
var globalCallback = null;//定义外部接收数据的回调函数

//初始化websocket
export function initWebSocket (url) {
  //判断浏览器是否支持websocket
  if ("WebSocket" in window) {
    webSocket = new WebSocket(url);//创建socket对象
  } else {
    alert("该浏览器不支持websocket!");
  }
  //打开
  webSocket.onopen = function () {
    webSocketOpen();
  };
  //收信
  webSocket.onmessage = function (msg) {
    webSocketOnMessage(msg);
  };
  //关闭
  webSocket.onclose = function () {
    webSocketClose();
  };
  //连接发生错误的回调方法
  webSocket.onerror = function () {
    console.log("WebSocket连接发生错误");
  };
}

//连接socket建立时触发
export function webSocketOpen () {
  console.log("WebSocket连接成功");
}

//客户端接收服务端数据时触发,e为接受的数据对象
export function webSocketOnMessage (e) {
  // 存储在store中,然后在聊天界面中监控变化 自动拿取收到的信息
  store.commit('user/SET_WS_MSG', e)
}

//发送数据
export function webSocketSend (data) {
  console.log('发送数据');
  //在这里根据自己的需要转换数据格式
  webSocket.send(JSON.stringify(data));
}

//关闭socket
export function webSocketClose () {
  webSocket.close()
  console.log("对话连接已关闭");
  // }
}


//在其他需要socket地方调用的函数,用来发送数据及接受数据
export function sendSock (agentData, callback) {
  globalCallback = callback;//此callback为在其他地方调用时定义的接收socket数据的函数,此关重要。
  //下面的判断主要是考虑到socket连接可能中断或者其他的因素,可以重新发送此条消息。
  switch (webSocket.readyState) {
    //CONNECTING:值为0,表示正在连接。
    case webSocket.CONNECTING:
      setTimeout(function () {
        console.log('正在连接。。。');
        webSocketSend(agentData, callback);
      }, 1000);
      break;
    //OPEN:值为1,表示连接成功,可以通信了。
    case webSocket.OPEN:
      console.log('连接成功');
      webSocketSend(agentData);
      break;
    //CLOSING:值为2,表示连接正在关闭。
    case webSocket.CLOSING:
      setTimeout(function () {
        console.log('连接关闭中');
        webSocketSend(agentData, callback);
      }, 1000);
      break;
    //CLOSED:值为3,表示连接已经关闭,或者打开连接失败。
    case webSocket.CLOSED:
      console.log('连接关闭/打开失败');
      // do something
      break;
    default:
      // this never happens
      break;
  }
}

//将初始化socket函数、发送(接收)数据的函数、关闭连接的函数export出去
export default {
  initWebSocket,
  webSocketClose,
  sendSock
};

在vuex中定义存储下接收的数据

store/modules/user.js

let state = {
 webSocketMsg: ''
};

//修改state
const mutations = {
    // 存储websocket推送的消息
    SET_WS_MSG: (state, msg) => {
        state.webSocketMsg = msg
    }
}
//提交异动mutations。 如果在接受块出现问题,可以把这个加上去看看
//const actions = {
 //   webSockets ({ commit }) {
 //      commit('SET_WS_MSG', 2)
 //   }
//}

store/getters.js

//获取state的状态
const getters = {
    webSocketMsg: state => state.user.webSocketMsg
}

export default getters

然后在聊天界面中开始使用啦 websocket.vue

<script>
import { initWebSocket, sendSock, webSocketClose } from '@/utils/websocket.js'
export default {
  data() {
    return {
     // 这个地址是后端给的,用来连接websocket。 加密wss 未加密ws
      wsUrl:'ws://地址',
    }
  },
  // 从store中获取接收到的信息
  computed: {
    getSocketMsg() {
      return this.$store.state.user.webSocketMsg
    },
  },
  //监控 getSocketMsg 是否有接收到数据
  watch: {
    getSocketMsg: {
      handler: function (val) {
        this.getConfigResult(val)
      },
    },
    //这一步是我对我聊天框的css设计,大家可以不用写,需要的时候再参考。
    //我将接收到的信息和发出的信息都存储到obList中,然后通过监控数值变化,使聊天定位始终位于底部(css中 overflow: auto;)
    obList: {
      handler: function (val) {
        this.$nextTick(() => {
          this.$refs.chatContent.scrollTop = this.$refs.chatContent.scrollHeight
        })
      },
    },
    immediate: true,
  },
  methods: {
    // 点击按钮-建立聊天连接
    customerDialog() {
      initWebSocket(this.wsUrl)
    },
    // 接收socket回调函数返回数据的方法,这个函数是我在监控接受数据的时候调用的(上面的watch中)
    getConfigResult(val) { },

 // 点击发送按钮 发送信息---发送信息的格式要和后端确认
    sending() {
      sendSock('发送的信息')
    },
    // 处理聊天框关闭事件
    handleClose() {
     //关闭连接
      webSocketClose()
    },
  },
}
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • vue指令以及dom操作详解

    vue指令以及dom操作详解

    本篇文章主要介绍了vue指令以及dom操作详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • 解决vue路由发生了跳转但是界面没有任何反应问题

    解决vue路由发生了跳转但是界面没有任何反应问题

    这篇文章主要介绍了解决vue路由发生了跳转但是界面没有任何反应问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • Vue2中的过滤器filter使用及注意说明

    Vue2中的过滤器filter使用及注意说明

    这篇文章主要介绍了Vue2中的过滤器filter使用及注意说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • VUE的tab页面切换的四种方法

    VUE的tab页面切换的四种方法

    这篇文章主要介绍了VUE的tab页面切换的四种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 详解Vue.js自定义tipOnce指令用法实例

    详解Vue.js自定义tipOnce指令用法实例

    这篇文章主要介绍了详解Vue.js自定义tipOnce指令用法实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • vue基于element-china-area-data插件实现省市区联动

    vue基于element-china-area-data插件实现省市区联动

    省市区联动在日常开发中用的非常多,本文就介绍一下vue基于element-china-area-data插件实现省市区联动,具有一定的参考价值,感兴趣的可以了解一下
    2022-04-04
  • vue实现输入框自动跳转功能

    vue实现输入框自动跳转功能

    这篇文章主要为大家详细介绍了vue实现输入框自动跳转功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Vue使用axios图片上传遇到的问题

    Vue使用axios图片上传遇到的问题

    后端写个上传图片的接口可不是很简单,只需要让这个字段限制为图片格式,后台做个保存的逻辑就完事了,前端处理还要牵扯到请求头,数据格式的处理等等问题,按照老传统把图片按照字符串往接口put发现返回的全是400错误,直到我知道了前端的FormData方法!
    2021-05-05
  • Vue响应式原理模拟实现原理探究

    Vue响应式原理模拟实现原理探究

    这篇文章主要介绍了Vue响应式原理,响应式就是当对象本身(对象的增删值)或者对象属性(重新赋值)发生了改变的时候,就会运行一些函数,最常见的示render函数
    2022-09-09
  • Vue中使用crypto-js AES对称加密算法实现加密解密

    Vue中使用crypto-js AES对称加密算法实现加密解密

     在数字加密算法中,通过可划分为对称加密和非对称加密,本文主要介绍了Vue中使用crypto-js AES对称加密算法实现加密解密,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论