websocket+Vuex实现一个实时聊天软件

 更新时间:2021年08月06日 08:55:06   作者:小猿同学628  
这篇文章主要利用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实现主要分为一下几个部分:

建立连接

发送心跳包

失败或者出错之后重新链接

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
}

页面获取

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"]),
   
  },

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属性自动更新,完美实现即时通讯的功能。

总结

到此这篇关于websocket+Vuex实现一个实时聊天软件的文章就介绍到这了,更多相关websocket+Vuex实时聊天内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vuejs响应用户事件(如点击事件)

    vuejs响应用户事件(如点击事件)

    本篇文章主要介绍了vuejs响应用户事件(如点击),通过vuejs响应用户事件的技巧,具有一定的参考价值,有兴趣的小伙伴们可以参考一下。
    2017-03-03
  • vue.js内置组件之keep-alive组件使用

    vue.js内置组件之keep-alive组件使用

    keep-alive是Vue.js的一个内置组件。这篇文章主要介绍了vue.js内置组件之keep-alive组件使用,需要的朋友可以参考下
    2018-07-07
  • uniapp-vue3-弹出选择组件wo-pop-selector使用示例

    uniapp-vue3-弹出选择组件wo-pop-selector使用示例

    wo-pop-selector弹出选择组件采用uniapp-vue3实现, 支持H5、微信小程序,本文给大家介绍uniapp-vue3-弹出选择组件wo-pop-selector及使用示例,感兴趣的朋友一起看看吧
    2023-10-10
  • Vue自动生成组件示例总结

    Vue自动生成组件示例总结

    在Vue中,我们可以使用unplugin-generate-component-name插件自动基于目录名称生成组件名称,这个插件使得在大型代码库中找到和管理组件更加容易和直观,这篇文章主要介绍了Vue自动生成组件示例总结,需要的朋友可以参考下
    2023-12-12
  • 在antd4.0中Form使用initialValue操作

    在antd4.0中Form使用initialValue操作

    这篇文章主要介绍了在antd4.0中Form使用initialValue操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • vue3项目新用户引导组件driver.js示例详解

    vue3项目新用户引导组件driver.js示例详解

    好用的用户引导插件有 intro.js 和 driver.js 两个,对比了一下,最终还是使用了driver.js,这篇文章主要介绍了vue3项目新用户引导组件(driver.js),需要的朋友可以参考下
    2022-08-08
  • watch(监视属性)和computed(计算属性)的区别及实现案例

    watch(监视属性)和computed(计算属性)的区别及实现案例

    watch和computed是vue实例对象中的两个重要属性,watch是监视属性,用来监视vue实例对象上属性和方法的变化,computed被称为计算属性,可以将data对象中的属性进行计算得到新的属性,这篇文章主要介绍了watch(监视属性)和computed(计算属性)的区别,需要的朋友可以参考下
    2023-05-05
  • 深入理解Vue keep-alive及实践总结

    深入理解Vue keep-alive及实践总结

    这篇文章主要介绍了深入理解Vue keep-alive及实践总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • vue 如何设置背景颜色及透明度

    vue 如何设置背景颜色及透明度

    这篇文章主要介绍了vue 设置背景颜色及透明度的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Vue进度条progressbar组件功能

    Vue进度条progressbar组件功能

    progressbar组件在一个可以直接运行的npm包,通过Yeoman进行构建,再通过Gulp+Webpack构建工具。这篇文章给大家介绍了Vue进度条progressbar组件
    2018-04-04

最新评论