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

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

