利用websocket+Vuex完成一个实时聊天软件(前端部分)

利用websocket+Vuex完成一个实时聊天软件(前端部分)这篇文章主要利用 websocked 建立长连接 利用 Vuex 全局通信的特性 以及 watch computed 函数实时监听消息变化 展示 实现一个实时聊天平台

前言

这篇文章主要利用websocked 建立长连接,利用Vuex全局通信的特性,以及watch,computed函数监听消息变化,并驱动页面变化实现实时聊天。


一、效果如图

在这里插入图片描述

二、具体实现步骤

1.引入Vuex

代码如下(示例):

//安装vuex npm install vuex //main.js 中引入 import store from './store' new Vue({ 
     el: '#app', router, store, render: h => h(App) }) 

我对Vuex进行了简单的封装,如下图,各位小伙伴可以按照自己使用的习惯进行。
在这里插入图片描述

2.webscoked实现

webscoked实现主要分为一下几个部分:

  1. 建立连接
  2. 发送心跳包
  3. 失败或者出错之后重新链接
const state = { 
     url: '', webSocket: null, lockReconnect: false, messageList: [], msgItem: { 
    }, pingInterval: null, timeOut: null, } const mutations = { 
     [types.INIT_WEBSOCKET](state, data) { 
     state.webSocket = data }, [types.LOCK_RE_CONNECT](state, data) { 
     state.lockReconnect = data }, [types.SET_PING_INTERVAL](state, data) { 
     state.pingInterval = data }, [types.SET_MSG_LIST](state, data) { 
     state.messageList.push(data) state.msgItem = data }, } const actions={ 
     initWebSocket({ 
      state, commit, dispatch, rootState }) { 
     if (state.webSocket) { 
     return } const realUrl = WSS_URL + rootState.doctorBasicInfo.token const webSocket = new WebSocket(realUrl) webSocket.onopen = () => { 
     console.log('建立链接'); dispatch('heartCheck') } webSocket.onmessage = e => { 
     console.log('接收到消息', e); try { 
     if (typeof e.data === 'string' && e.data !== 'PONG') { 
     let res = JSON.parse(e.data) console.log('接收到内容', res); commit('SET_MSG_LIST', res) } } catch (error) { 
    } } webSocket.onclose = () => { 
     console.log('关闭'); dispatch('reConnect') } webSocket.onerror = () => { 
     console.log('失败'); dispatch('reConnect') } commit('INIT_WEBSOCKET', webSocket) }, // 心跳包 heartCheck({ 
      state, commit }) { 
     console.log(state, 'state'); const { 
     webSocket } = state const pingInterval = setInterval(() => { 
     if (webSocket.readyState === 1) { 
     webSocket.send('PING') } }, 20000) commit('SET_PING_INTERVAL', pingInterval) }, //重新链接 reConnect({ 
      state, commit, dispatch }) { 
     if (state.lockReconnect) { 
     return } commit('INIT_WEBSOCKET', null) commit('LOCK_RE_CONNECT', true) setTimeout(() => { 
     dispatch('initWebSocket') commit('LOCK_RE_CONNECT', false) }, 20000) }, } const getters = { 
     webSocket: state => state.webSocket, messageList: state => state.messageList, msgItem: state => state.msgItem, } export default { 
     namespaced: true, state, actions, mutations, getters } 
  1. 页面获取
methods: { 
     ...mapActions("webSocket", ["initWebSocket", "close"]), pushItem(item) { 
     const initMsg = item; this.msgList.push(initMsg); } } mounted() { 
     this.initWebSocket(); } watch: { 
     msgItem: function (item) { 
     this.pushItem(item); } }, computed: { 
     ...mapGetters("webSocket", ["messageList", "msgItem"]), }, 
  1. UI界面
 <li v-for="(item, i) in msgList" :key="i" class="msgBox"></li> 

webscoked实现思路讲解

  • 1.首先在actions中创建ws链接。
  • 2.利用watch属性在在页面中监听state中对应的消息变化,当收到新的消息之后,改变页面展示的消息列表,利用双向绑定实现页面自动更新。
  • 3.发送消息的时候调用后端接口,并将新消息插入到页面展示的消息列表中
  • 4.因为ws是长链接一旦建立不会轻易断开,所以只要收到后端推送的消息,并判断是否具有消息内容,当有有消息内容只需要改变state中的消息列表,页面就会根据watch属性自动更新,完美实现即时通讯的功能。

总结

这篇文章主要利用websocked 建立长连接,利用Vuex全局通信的特性,以及watch,computed函数监听消息变化,并驱动页面变化实现实时聊天

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176290.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午10:17
下一篇 2026年3月26日 下午10:18


相关推荐

  • phpspreadsheet使用实例_php获取html中文本框内容

    phpspreadsheet使用实例_php获取html中文本框内容目录安装引用导入Excel获取日期格式安装composerrequirephpoffice/phpspreadsheet引用usePhpOffice\PhpSpreadsheet\Reader\Xlsx;usePhpOffice\PhpSpreadsheet\Reader\Xls;usePhpOffice\PhpSpreadsheet\IOFactory;usePhpOffice\PhpSpreadsheet\Cell\Coordinate;usePhpOffice\PhpS

    2025年12月14日
    4
  • 多位点序列分型_多位点序列分型(MLST)及其应用.pdf

    多位点序列分型_多位点序列分型(MLST)及其应用.pdfiseaseSurvei 塑生 旦箜 23 鲞箜 D ce 0ct 3 Vool 一 23 No 10DOh10 3784 issn 1003 9961 2008 10 020 综述 多位点序列分型及其应用张少敏 综述 徐建国 指导 摘要

    2026年3月20日
    3
  • 相机标定基础

    相机标定基础一.什么是摄像机标定从二维图像中恢复物体的三维信息,必须要知道空间坐标系中的物体点同它在图像平面上像点之间的对应关系,而这个对应关系是由摄像机的成像几何模型所决定的,这些几何模型参数就是摄像机参数。在大多数情况下这些参数必须通过实验才能得到,这个过程被称为摄像机标定。摄像机标定就是确定摄像机内部几何和光学特性(内部参数)以及摄像机坐标系相对于世界坐标系的三维位置和方向(外部参数)的过程。

    2022年5月11日
    61
  • 【全网世界区划最全整理输出之第四部分】全世界所有国家的行政区划整理,省市信息,已按照国家,省,市排好序,可直接复制使用,第四部分到17193行,总条数:21088「建议收藏」

    【全网世界区划最全整理输出之第四部分】全世界所有国家的行政区划整理,省市信息,已按照国家,省,市排好序,可直接复制使用,第四部分到17193行,总条数:21088「建议收藏」序号 国家 省 城市 12723 美国 华盛顿   12724 美国 华盛顿州   12725 美国 华盛顿州 东韦纳奇 12726 美国 华盛顿州 亚基马 12727 美国 华盛顿州 亚基马县 12728 美国 华盛顿州 代顿 12729 美国 华盛顿州 伊斯特桑 12730 美国 华盛顿州 伊瑟阔 12731

    2026年4月13日
    6
  • pytorch-DataLoader(数据迭代器)

    pytorch-DataLoader(数据迭代器)目录1.1dataset1.1.1Map-styledatasets实现方法一(简单直白法)实现方法二(借助TensorDataset直接将数据包装成dataset类)实现方法三(地址读取法)1.1.1Iterable-styledatasets我们一般使用一个for循环(或多层的)来训练神经网络,每一次迭代,加载一个batch的数据,神经网络前向反向传播各一次并更新一次参数。而这个过程中加载一个batch的数据这一步需要使用一个torch.utils.data.DataLoader对象,并且

    2022年6月11日
    83
  • Android经典完美退出方法

    Android经典完美退出方法,使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activit

    2021年12月25日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号