最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

websocket+Vuex實(shí)現(xiàn)一個(gè)實(shí)時(shí)聊天軟件

 更新時(shí)間:2021年08月06日 08:55:06   作者:小猿同學(xué)628  
這篇文章主要利用websocked 建立長(zhǎng)連接,利用Vuex全局通信的特性,以及watch,computed函數(shù)監(jiān)聽消息變化,并驅(qū)動(dòng)頁面變化實(shí)現(xiàn)實(shí)時(shí)聊天,感興趣的可以了解一下

前言

這篇文章主要利用websocked 建立長(zhǎng)連接,利用Vuex全局通信的特性,以及watch,computed函數(shù)監(jiān)聽消息變化,并驅(qū)動(dòng)頁面變化實(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
}

頁面獲取

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屬性在在頁面中監(jiān)聽state中對(duì)應(yīng)的消息變化,當(dāng)收到新的消息之后,改變頁面展示的消息列表,利用雙向綁定實(shí)現(xiàn)頁面自動(dòng)更新。

3.發(fā)送消息的時(shí)候調(diào)用后端接口,并將新消息插入到頁面展示的消息列表中

4.因?yàn)閣s是長(zhǎng)鏈接一旦建立不會(huì)輕易斷開,所以只要收到后端推送的消息,并判斷是否具有消息內(nèi)容,當(dāng)有有消息內(nèi)容只需要改變state中的消息列表,頁面就會(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue監(jiān)聽滾動(dòng)實(shí)現(xiàn)錨點(diǎn)定位(雙向)示例

    Vue監(jiān)聽滾動(dòng)實(shí)現(xiàn)錨點(diǎn)定位(雙向)示例

    今天小編大家分享一篇Vue監(jiān)聽滾動(dòng)實(shí)現(xiàn)錨點(diǎn)定位(雙向)示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 超詳細(xì)動(dòng)手搭建一個(gè)VuePress 站點(diǎn)及開啟PWA與自動(dòng)部署的方法

    超詳細(xì)動(dòng)手搭建一個(gè)VuePress 站點(diǎn)及開啟PWA與自動(dòng)部署的方法

    這篇文章主要介紹了超詳細(xì)動(dòng)手搭建一個(gè)VuePress 站點(diǎn)及開啟PWA與自動(dòng)部署的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • Vue router配置與使用分析講解

    Vue router配置與使用分析講解

    第一次寫Vue項(xiàng)目,要用到router.js,看了一下官方文檔,還是很懵逼,不知道怎么配置,又去看視頻查資料,最后終于搞定了。話不多說,先上代碼,我再講一些要注意的細(xì)節(jié)
    2022-12-12
  • vue實(shí)現(xiàn)日歷組件

    vue實(shí)現(xiàn)日歷組件

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)日歷組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 跟混亂的頁面彈窗說再見

    跟混亂的頁面彈窗說再見

    這篇文章主要介紹了跟混亂的頁面彈窗說再見,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Vue.js手風(fēng)琴菜單組件開發(fā)實(shí)例

    Vue.js手風(fēng)琴菜單組件開發(fā)實(shí)例

    這篇文章主要為大家詳細(xì)介紹了Vue.js手風(fēng)琴菜單組件開發(fā)實(shí)例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • vue/react項(xiàng)目刷新頁面出現(xiàn)404報(bào)錯(cuò)的原因及解決辦法

    vue/react項(xiàng)目刷新頁面出現(xiàn)404報(bào)錯(cuò)的原因及解決辦法

    Vue項(xiàng)目打包部署到線上后,刷新頁面會(huì)提示404,下面這篇文章主要給大家介紹了關(guān)于vue/react項(xiàng)目刷新頁面出現(xiàn)404報(bào)錯(cuò)的原因及解決辦法,文中將解決的辦法介紹的很詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 詳解mpvue中使用vant時(shí)需要注意的onChange事件的坑

    詳解mpvue中使用vant時(shí)需要注意的onChange事件的坑

    這篇文章主要介紹了詳解mpvue中使用vant時(shí)需要注意的onChange事件的坑,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-05-05
  • vue3.2?Composition?API項(xiàng)目依賴升級(jí)

    vue3.2?Composition?API項(xiàng)目依賴升級(jí)

    這篇文章主要為大家介紹了vue3.2?Composition?API項(xiàng)目依賴升級(jí)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 如何把vuejs打包出來的文件整合到springboot里

    如何把vuejs打包出來的文件整合到springboot里

    這篇文章主要介紹了如何把vuejs打包出來的文件整合到springboot里,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07

最新評(píng)論

保山市| 延寿县| 邓州市| 民和| 水富县| 梅州市| 葵青区| 安吉县| 凤翔县| 西峡县| 云浮市| 桑日县| 上杭县| 常宁市| 蓬溪县| 临漳县| 尚义县| 和林格尔县| 会理县| 图片| 西吉县| 阿荣旗| 晋城| 西林县| 昭觉县| 百色市| 化州市| 华容县| 通山县| 屏山县| 崇左市| 宜春市| 泰顺县| 贡山| 炉霍县| 渝中区| 东乡县| 吉安县| 会昌县| 昌平区| 来宾市|