vue實現websocket客服聊天功能
本文章主要介紹如何實現一個基本的聊天,後續會添加表情包,傳照片等功能
其實剛開始接觸的時候,我最大的疑惑是聊天功能的前期是否需要搭建什麼框架、下載一些什麼東西之類的,結果就是,其實websocket可以直接使用,然後前後端搭配,也是免費的,暫時沒發現需要收費功能的東西。
實現效果圖:
首先封裝一個websocket.js文件(大傢可以直接復制,然後把接收/發送數據之類的格式改成自己的就可以啦)
import store from '@/store' var webSocket = null; var globalCallback = null;//定義外部接收數據的回調函數 //初始化websocket export function initWebSocket (url) { //判斷瀏覽器是否支持websocket if ("WebSocket" in window) { webSocket = new WebSocket(url);//創建socket對象 } else { alert("該瀏覽器不支持websocket!"); } //打開 webSocket.onopen = function () { webSocketOpen(); }; //收信 webSocket.onmessage = function (msg) { webSocketOnMessage(msg); }; //關閉 webSocket.onclose = function () { webSocketClose(); }; //連接發生錯誤的回調方法 webSocket.onerror = function () { console.log("WebSocket連接發生錯誤"); }; } //連接socket建立時觸發 export function webSocketOpen () { console.log("WebSocket連接成功"); } //客戶端接收服務端數據時觸發,e為接受的數據對象 export function webSocketOnMessage (e) { // 存儲在store中,然後在聊天界面中監控變化 自動拿取收到的信息 store.commit('user/SET_WS_MSG', e) } //發送數據 export function webSocketSend (data) { console.log('發送數據'); //在這裡根據自己的需要轉換數據格式 webSocket.send(JSON.stringify(data)); } //關閉socket export function webSocketClose () { webSocket.close() console.log("對話連接已關閉"); // } } //在其他需要socket地方調用的函數,用來發送數據及接受數據 export function sendSock (agentData, callback) { globalCallback = callback;//此callback為在其他地方調用時定義的接收socket數據的函數,此關重要。 //下面的判斷主要是考慮到socket連接可能中斷或者其他的因素,可以重新發送此條消息。 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函數、發送(接收)數據的函數、關閉連接的函數export出去 export default { initWebSocket, webSocketClose, sendSock };
在vuex中定義存儲下接收的數據
store/modules/user.js
let state = { webSocketMsg: '' }; //修改state const mutations = { // 存儲websocket推送的消息 SET_WS_MSG: (state, msg) => { state.webSocketMsg = msg } } //提交異動mutations。 如果在接受塊出現問題,可以把這個加上去看看 //const actions = { // webSockets ({ commit }) { // commit('SET_WS_MSG', 2) // } //}
store/getters.js
//獲取state的狀態 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 }, }, //監控 getSocketMsg 是否有接收到數據 watch: { getSocketMsg: { handler: function (val) { this.getConfigResult(val) }, }, //這一步是我對我聊天框的css設計,大傢可以不用寫,需要的時候再參考。 //我將接收到的信息和發出的信息都存儲到obList中,然後通過監控數值變化,使聊天定位始終位於底部(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回調函數返回數據的方法,這個函數是我在監控接受數據的時候調用的(上面的watch中) getConfigResult(val) { }, // 點擊發送按鈕 發送信息---發送信息的格式要和後端確認 sending() { sendSock('發送的信息') }, // 處理聊天框關閉事件 handleClose() { //關閉連接 webSocketClose() }, }, } </script>
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。
推薦閱讀:
- vue基於websocket實現智能聊天及吸附動畫效果
- websocket+Vuex實現一個實時聊天軟件
- vue3常用的API使用簡介
- 前端Vue中常用rules校驗規則詳解
- Vue3中Vuex的詳細使用方法