vue實(shí)現(xiàn)websocket客服聊天功能
本文章主要介紹如何實(shí)現(xiàn)一個(gè)基本的聊天,后續(xù)會(huì)添加表情包,傳照片等功能
其實(shí)剛開始接觸的時(shí)候,我最大的疑惑是聊天功能的前期是否需要搭建什么框架、下載一些什么東西之類的,結(jié)果就是,其實(shí)websocket可以直接使用,然后前后端搭配,也是免費(fèi)的,暫時(shí)沒發(fā)現(xiàn)需要收費(fèi)功能的東西。
實(shí)現(xiàn)效果圖:

首先封裝一個(gè)websocket.js文件(大家可以直接復(fù)制,然后把接收/發(fā)送數(shù)據(jù)之類的格式改成自己的就可以啦)
import store from '@/store'
var webSocket = null;
var globalCallback = null;//定義外部接收數(shù)據(jù)的回調(diào)函數(shù)
//初始化websocket
export function initWebSocket (url) {
//判斷瀏覽器是否支持websocket
if ("WebSocket" in window) {
webSocket = new WebSocket(url);//創(chuàng)建socket對(duì)象
} else {
alert("該瀏覽器不支持websocket!");
}
//打開
webSocket.onopen = function () {
webSocketOpen();
};
//收信
webSocket.onmessage = function (msg) {
webSocketOnMessage(msg);
};
//關(guān)閉
webSocket.onclose = function () {
webSocketClose();
};
//連接發(fā)生錯(cuò)誤的回調(diào)方法
webSocket.onerror = function () {
console.log("WebSocket連接發(fā)生錯(cuò)誤");
};
}
//連接socket建立時(shí)觸發(fā)
export function webSocketOpen () {
console.log("WebSocket連接成功");
}
//客戶端接收服務(wù)端數(shù)據(jù)時(shí)觸發(fā),e為接受的數(shù)據(jù)對(duì)象
export function webSocketOnMessage (e) {
// 存儲(chǔ)在store中,然后在聊天界面中監(jiān)控變化 自動(dòng)拿取收到的信息
store.commit('user/SET_WS_MSG', e)
}
//發(fā)送數(shù)據(jù)
export function webSocketSend (data) {
console.log('發(fā)送數(shù)據(jù)');
//在這里根據(jù)自己的需要轉(zhuǎn)換數(shù)據(jù)格式
webSocket.send(JSON.stringify(data));
}
//關(guān)閉socket
export function webSocketClose () {
webSocket.close()
console.log("對(duì)話連接已關(guān)閉");
// }
}
//在其他需要socket地方調(diào)用的函數(shù),用來發(fā)送數(shù)據(jù)及接受數(shù)據(jù)
export function sendSock (agentData, callback) {
globalCallback = callback;//此callback為在其他地方調(diào)用時(shí)定義的接收socket數(shù)據(jù)的函數(shù),此關(guān)重要。
//下面的判斷主要是考慮到socket連接可能中斷或者其他的因素,可以重新發(fā)送此條消息。
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,表示連接正在關(guān)閉。
case webSocket.CLOSING:
setTimeout(function () {
console.log('連接關(guān)閉中');
webSocketSend(agentData, callback);
}, 1000);
break;
//CLOSED:值為3,表示連接已經(jīng)關(guān)閉,或者打開連接失敗。
case webSocket.CLOSED:
console.log('連接關(guān)閉/打開失敗');
// do something
break;
default:
// this never happens
break;
}
}
//將初始化socket函數(shù)、發(fā)送(接收)數(shù)據(jù)的函數(shù)、關(guān)閉連接的函數(shù)export出去
export default {
initWebSocket,
webSocketClose,
sendSock
};
在vuex中定義存儲(chǔ)下接收的數(shù)據(jù)
store/modules/user.js
let state = {
webSocketMsg: ''
};
//修改state
const mutations = {
// 存儲(chǔ)websocket推送的消息
SET_WS_MSG: (state, msg) => {
state.webSocketMsg = msg
}
}
//提交異動(dòng)mutations。 如果在接受塊出現(xiàn)問題,可以把這個(gè)加上去看看
//const actions = {
// webSockets ({ commit }) {
// commit('SET_WS_MSG', 2)
// }
//}
store/getters.js
//獲取state的狀態(tài)
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 {
// 這個(gè)地址是后端給的,用來連接websocket。 加密wss 未加密ws
wsUrl:'ws://地址',
}
},
// 從store中獲取接收到的信息
computed: {
getSocketMsg() {
return this.$store.state.user.webSocketMsg
},
},
//監(jiān)控 getSocketMsg 是否有接收到數(shù)據(jù)
watch: {
getSocketMsg: {
handler: function (val) {
this.getConfigResult(val)
},
},
//這一步是我對(duì)我聊天框的css設(shè)計(jì),大家可以不用寫,需要的時(shí)候再參考。
//我將接收到的信息和發(fā)出的信息都存儲(chǔ)到obList中,然后通過監(jiān)控?cái)?shù)值變化,使聊天定位始終位于底部(css中 overflow: auto;)
obList: {
handler: function (val) {
this.$nextTick(() => {
this.$refs.chatContent.scrollTop = this.$refs.chatContent.scrollHeight
})
},
},
immediate: true,
},
methods: {
// 點(diǎn)擊按鈕-建立聊天連接
customerDialog() {
initWebSocket(this.wsUrl)
},
// 接收socket回調(diào)函數(shù)返回?cái)?shù)據(jù)的方法,這個(gè)函數(shù)是我在監(jiān)控接受數(shù)據(jù)的時(shí)候調(diào)用的(上面的watch中)
getConfigResult(val) { },
// 點(diǎn)擊發(fā)送按鈕 發(fā)送信息---發(fā)送信息的格式要和后端確認(rèn)
sending() {
sendSock('發(fā)送的信息')
},
// 處理聊天框關(guān)閉事件
handleClose() {
//關(guān)閉連接
webSocketClose()
},
},
}
</script>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 一文詳解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連接問題及解決
- 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+Websocket簡(jiǎn)單實(shí)現(xiàn)聊天功能
- vue使用WebSocket模擬實(shí)現(xiàn)聊天功能
- websocket+Vuex實(shí)現(xiàn)一個(gè)實(shí)時(shí)聊天軟件
- 使用WebSocket+SpringBoot+Vue搭建簡(jiǎn)易網(wǎng)頁聊天室的實(shí)現(xiàn)代碼
相關(guān)文章
vue v-for出來的列表,點(diǎn)擊某個(gè)li使得當(dāng)前被點(diǎn)擊的li字體變紅操作
這篇文章主要介紹了vue v-for出來的列表,點(diǎn)擊某個(gè)li使得當(dāng)前被點(diǎn)擊的li字體變紅操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
vue中使用webuploader做斷點(diǎn)續(xù)傳實(shí)現(xiàn)文件上傳功能
之前做的一個(gè)項(xiàng)目中,由于經(jīng)常上傳幾百兆的壓縮包,導(dǎo)致經(jīng)常上傳失敗,所以就找了webuploader插件做了斷點(diǎn)續(xù)傳,斷點(diǎn)續(xù)傳除了需要前端分片,也需要后臺(tái)去支持,所以做的時(shí)候做好對(duì)接協(xié)調(diào),所以本文就給大家詳細(xì)的介紹一下vue中如何使用webuploader做斷點(diǎn)續(xù)傳2023-07-07
解決echarts echarts數(shù)據(jù)動(dòng)態(tài)更新和dataZoom被重置問題
這篇文章主要介紹了解決echarts echarts數(shù)據(jù)動(dòng)態(tài)更新和dataZoom被重置問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Vue使用exceljs導(dǎo)出excel文件的詳細(xì)教程
這篇文章主要為大家詳細(xì)介紹了Vue如何使用exceljs導(dǎo)出excel文件的詳細(xì)教程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03
vue中使用refs定位dom出現(xiàn)undefined的解決方法
本篇文章主要介紹了vue中使用refs定位dom出現(xiàn)undefined的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
在VUE中實(shí)現(xiàn)文件下載并判斷狀態(tài)的方法
今天小編就為大家分享一篇在VUE中實(shí)現(xiàn)文件下載并判斷狀態(tài)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-11-11
使用vue + less 實(shí)現(xiàn)簡(jiǎn)單換膚功能的示例
下面小編就為大家分享一篇使用vue + less 實(shí)現(xiàn)簡(jiǎn)單換膚功能的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02
Vue中 axios delete請(qǐng)求參數(shù)操作
這篇文章主要介紹了Vue中 axios delete請(qǐng)求參數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所 幫助。一起跟隨小編過來看看吧2020-08-08

