websocket+Vuex實(shí)現(xiàn)一個(gè)實(shí)時(shí)聊天軟件
前言
這篇文章主要利用websocked 建立長(zhǎng)連接,利用Vuex全局通信的特性,以及watch,computed函數(shù)監(jiān)聽(tīng)消息變化,并驅(qū)動(dòng)頁(yè)面變化實(shí)現(xiàn)實(shí)時(shí)聊天。
一、效果如圖
二、具體實(shí)現(xiàn)步驟
1.引入Vuex
代碼如下(示例):
//安裝vuex npm install vuex //main.js 中引入 import store from './store' new Vue({ el: '#app', router, store, render: h => h(App) })
我對(duì)Vuex進(jìn)行了簡(jiǎn)單的封裝,如下圖,各位小伙伴可以按照自己使用的習(xí)慣進(jìn)行。
2.webscoked實(shí)現(xiàn)
webscoked實(shí)現(xiàn)主要分為一下幾個(gè)部分:
建立連接
發(fā)送心跳包
失敗或者出錯(cuò)之后重新鏈接
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('接收到內(nèi)容', res); commit('SET_MSG_LIST', res) } } catch (error) {} } webSocket.onclose = () => { console.log('關(guān)閉'); 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 }
頁(yè)面獲取
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實(shí)現(xiàn)思路講解
1.首先在actions中創(chuàng)建ws鏈接。
2.利用watch屬性在在頁(yè)面中監(jiān)聽(tīng)state中對(duì)應(yīng)的消息變化,當(dāng)收到新的消息之后,改變頁(yè)面展示的消息列表,利用雙向綁定實(shí)現(xiàn)頁(yè)面自動(dòng)更新。
3.發(fā)送消息的時(shí)候調(diào)用后端接口,并將新消息插入到頁(yè)面展示的消息列表中
4.因?yàn)閣s是長(zhǎng)鏈接一旦建立不會(huì)輕易斷開,所以只要收到后端推送的消息,并判斷是否具有消息內(nèi)容,當(dāng)有有消息內(nèi)容只需要改變state中的消息列表,頁(yè)面就會(huì)根據(jù)watch屬性自動(dòng)更新,完美實(shí)現(xiàn)即時(shí)通訊的功能。
總結(jié)
到此這篇關(guān)于websocket+Vuex實(shí)現(xiàn)一個(gè)實(shí)時(shí)聊天軟件的文章就介紹到這了,更多相關(guān)websocket+Vuex實(shí)時(shí)聊天內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文詳解websocket在vue2中的封裝使用
- Vue項(xiàng)目中Websocket的使用實(shí)例
- 前端之vue3使用WebSocket的詳細(xì)步驟
- vue3.0中使用websocket,封裝到公共方法的實(shí)現(xiàn)
- vue3+ts+Vuex中使用websocket協(xié)議方式
- Vue項(xiàng)目使用Websocket大文件FileReader()切片上傳實(shí)例
- vue項(xiàng)目使用websocket連接問(wèn)題及解決
- Vue?websocket封裝實(shí)現(xiàn)方法詳解
- vue使用websocket概念及示例
- vue基于websocket實(shí)現(xiàn)智能聊天及吸附動(dòng)畫效果
- Flask使用SocketIO實(shí)現(xiàn)WebSocket與Vue進(jìn)行實(shí)時(shí)推送
- vue+flv.js+SpringBoot+websocket實(shí)現(xiàn)視頻監(jiān)控與回放功能
- vue項(xiàng)目中使用websocket的實(shí)現(xiàn)
- vue 項(xiàng)目中使用websocket的正確姿勢(shì)
- vue實(shí)現(xiàn)websocket客服聊天功能
- Vue+Websocket簡(jiǎn)單實(shí)現(xiàn)聊天功能
- vue使用WebSocket模擬實(shí)現(xiàn)聊天功能
- 使用WebSocket+SpringBoot+Vue搭建簡(jiǎn)易網(wǎng)頁(yè)聊天室的實(shí)現(xiàn)代碼
相關(guān)文章
基于uniapp+vue3自定義增強(qiáng)版table表格組件「兼容H5+小程序+App端」
uv3-table:一款基于uniapp+vue3跨端自定義手機(jī)端增強(qiáng)版表格組件,支持固定表頭/列、邊框、斑馬紋、單選/多選,自定義表頭/表體插槽、左右固定列陰影高亮顯示,支持編譯兼容H5+小程序端+App端,H5+小程序+App端,多端運(yùn)行一致2024-05-05調(diào)用createApp?時(shí)Vue工作過(guò)程原理
這篇文章主要為大家介紹了調(diào)用createApp?時(shí)Vue工作過(guò)程原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Vue2實(shí)現(xiàn)自適應(yīng)屏幕大小的兩種方法詳解
這篇文章主要為大家詳細(xì)介紹了Vue2實(shí)現(xiàn)自適應(yīng)屏幕大小的兩種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03vue中json格式化顯示數(shù)據(jù)(vue-json-viewer)
這篇文章主要給大家介紹了關(guān)于vue中json格式化顯示數(shù)據(jù)(vue-json-viewer)的相關(guān)資料,Vue-json-viewer是一個(gè)Vue組件,用于在Vue應(yīng)用中顯示JSON數(shù)據(jù)的可視化工具,需要的朋友可以參考下2024-05-05vue項(xiàng)目中公用footer組件底部位置的適配問(wèn)題
footer為公用組件,其他頁(yè)面都需要引入。接下來(lái)通過(guò)本文給大家分享vue項(xiàng)目中公用footer組件底部位置的適配問(wèn)題,需要的朋友可以參考下2018-05-05