vue實(shí)現(xiàn)websocket客服聊天功能
本文章主要介紹如何實(shí)現(xiàn)一個(gè)基本的聊天,后續(xù)會(huì)添加表情包,傳照片等功能
其實(shí)剛開(kāi)始接觸的時(shí)候,我最大的疑惑是聊天功能的前期是否需要搭建什么框架、下載一些什么東西之類(lèi)的,結(jié)果就是,其實(shí)websocket可以直接使用,然后前后端搭配,也是免費(fèi)的,暫時(shí)沒(méi)發(fā)現(xiàn)需要收費(fèi)功能的東西。
實(shí)現(xiàn)效果圖:
首先封裝一個(gè)websocket.js文件(大家可以直接復(fù)制,然后把接收/發(fā)送數(shù)據(jù)之類(lèi)的格式改成自己的就可以啦)
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!"); } //打開(kāi) 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連接成功"); } //客戶(hù)端接收服務(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ù),用來(lái)發(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)閉,或者打開(kāi)連接失敗。 case webSocket.CLOSED: console.log('連接關(guān)閉/打開(kāi)失敗'); // 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)問(wè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
然后在聊天界面中開(kāi)始使用啦 websocket.vue
<script> import { initWebSocket, sendSock, webSocketClose } from '@/utils/websocket.js' export default { data() { return { // 這個(gè)地址是后端給的,用來(lái)連接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ì),大家可以不用寫(xiě),需要的時(shí)候再參考。 //我將接收到的信息和發(fā)出的信息都存儲(chǔ)到obList中,然后通過(guò)監(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連接問(wèn)題及解決
- Vue?websocket封裝實(shí)現(xiàn)方法詳解
- vue使用websocket概念及示例
- vue基于websocket實(shí)現(xiàn)智能聊天及吸附動(dòng)畫(huà)效果
- 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)頁(yè)聊天室的實(shí)現(xiàn)代碼
相關(guān)文章
詳解vue-cli + webpack 多頁(yè)面實(shí)例配置優(yōu)化方法
本篇文章主要介紹了詳解vue-cli + webpack 多頁(yè)面實(shí)例配置優(yōu)化方法,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07vue2.0嵌套路由實(shí)現(xiàn)豆瓣電影分頁(yè)功能(附demo)
這篇文章主要介紹了vue2.0嵌套路由實(shí)現(xiàn)豆瓣電影分頁(yè)功能(附demo),這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。2017-03-03移動(dòng)端 Vue+Vant 的Uploader 實(shí)現(xiàn)上傳、壓縮、旋轉(zhuǎn)圖片功能
這篇文章主要介紹了移動(dòng)端 Vue+Vant 的Uploader 實(shí)現(xiàn) 上傳、壓縮、旋轉(zhuǎn)圖片功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-06-06Vue表單綁定的實(shí)例代碼(單選按鈕,選擇框(單選時(shí),多選時(shí),用 v-for 渲染的動(dòng)態(tài)選項(xiàng))
本文通過(guò)實(shí)例代碼給大家介紹了Vue表單綁定(單選按鈕,選擇框(單選時(shí),多選時(shí),用 v-for 渲染的動(dòng)態(tài)選項(xiàng))的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-05-05vue使用iview的modal彈窗嵌套modal出現(xiàn)格式錯(cuò)誤的解決
這篇文章主要介紹了vue使用iview的modal彈窗嵌套modal出現(xiàn)格式錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09詳細(xì)聊聊vue組件是如何實(shí)現(xiàn)組件通訊的
組件間通信簡(jiǎn)單來(lái)說(shuō)就是組件間進(jìn)行數(shù)據(jù)傳遞,就像我們?nèi)粘5拇螂娫?就是通訊的一種方式,下面這篇文章主要給大家介紹了關(guān)于vue組件是如何實(shí)現(xiàn)組件通訊的相關(guān)資料,需要的朋友可以參考下2022-05-05