Vue在H5 項(xiàng)目中使用融云進(jìn)行實(shí)時(shí)個(gè)人單聊通訊
由于其他博客的相關(guān)融云的Vue項(xiàng)目開(kāi)發(fā)不是特別完善,此項(xiàng)目加入了自己的一些思考,可供大家有一點(diǎn)方向。
1.融云官網(wǎng)注冊(cè)賬號(hào),創(chuàng)建應(yīng)用并獲取必要的初始化參數(shù) appkey
2.融云web開(kāi)發(fā)文檔 本人使用3.x 版本
3.vue項(xiàng)目引入cdn(index.html)
項(xiàng)目需求:用戶(hù)當(dāng)前會(huì)話(huà)列表+用戶(hù)當(dāng)前會(huì)話(huà)頁(yè)面
// 注意在dom之前引入 <script src="https://cdn.ronghub.com/RongIMLib-3.0.0-dev.js"></script>
4.在項(xiàng)目開(kāi)始之前先獲取融云返回的Token(此操作需要后端操作,token用于后面初始化連接融云時(shí)使用)
// 獲取融云token // RongToken --- api --- getRongToken() { let userId = this.$store.state.member.info.member_id let name = this.$store.state.member.info.member_name let portraitUri = this.$store.state.member.info.member_avatar RongToken(userId,name,portraitUri).then((res) => { if(res.code == 200) { this.appToken = res.data.token // 將融云token 存入vuex this.$store.commit('setAppToken',res.data.token) }else{ return; } }) },
5.融云初始化
// 初始化融云 initRong() { this.IM = RongIMLib.init({ appkey: 'xxxxxxx' // 融云appkey }) },
6.建立連接
// 建立連接 getConnect() { var user = { token: this.$store.state.im_chat.appToken }; this.IM.connect(user).then((res) => { // console.log('鏈接成功, 鏈接用戶(hù) id 為: ', res.id); // 改變用戶(hù)連接狀態(tài) 用于監(jiān)聽(tīng)用戶(hù)是否已連接 this.$store.commit('changeConnectStatus',true) }).catch((error) => { // console.log('鏈接失敗: ', error.code, error.msg); }); },
7.會(huì)話(huà)列表(用于監(jiān)聽(tīng)會(huì)話(huà)列表及渲染當(dāng)前會(huì)話(huà)列表)
// 用于監(jiān)聽(tīng)會(huì)話(huà)列表 ImWatch() { let IM = this.IM let conversationList = []; let option = { count: 30 } IM.Conversation.getList(option).then((allConversationList) => { // console.log('獲取會(huì)話(huà)列表成功', allConversationList); conversationList = IM.Conversation.merge({ conversationList: conversationList, updatedConversationList: allConversationList }); // TODO 更新會(huì)話(huà)列表界面 this.list = conversationList }); IM.watch({ conversation: (event) =>{ var updatedConversationList = event.updatedConversationList; // 更新的會(huì)話(huà)列表 // console.log('更新會(huì)話(huà)匯總:', updatedConversationList); // console.log('最新會(huì)話(huà)列表:', IM.Conversation.merge({ // conversationList: conversationList, // updatedConversationList: updatedConversationList // })); this.list = updatedConversationList }, message: function(event){ var message = event.message; // console.log('收到新消息', message); }, status: (event)=>{ var status = event.status; if(status != RongIMLib.CONNECTION_STATUS.CONNECTED) { this.$store.commit('changeConnectStatus',false) } switch (status) { case RongIMLib.CONNECTION_STATUS.CONNECTED: console.log('鏈接成功'); break; case RongIMLib.CONNECTION_STATUS.CONNECTING: console.log('正在連接中'); break; case RongIMLib.CONNECTION_STATUS.DISCONNECTED: console.log('已主動(dòng)斷開(kāi)連接'); break; case RongIMLib.CONNECTION_STATUS.NETWORK_UNAVAILABLE: console.log('網(wǎng)絡(luò)不可用'); // SDK 內(nèi)部會(huì)自動(dòng)進(jìn)行重連 break; case RongIMLib.CONNECTION_STATUS.SOCKET_ERROR: console.log('Socket 鏈接錯(cuò)誤'); // SDK 內(nèi)部會(huì)自動(dòng)進(jìn)行重連 break; case RongIMLib.CONNECTION_STATUS.KICKED_OFFLINE_BY_OTHER_CLIENT: console.log('其他設(shè)備登錄, 本端被踢'); // 己端被踢, 不可進(jìn)行重連. 否則會(huì)造成多端循環(huán)互踢 break; case RongIMLib.CONNECTION_STATUS.BLOCKED: console.log('鏈接斷開(kāi), 用戶(hù)已被封禁'); break; default: console.log('鏈接狀態(tài)變化為:', status); break; } } }) },
8.會(huì)話(huà)頁(yè)面(用于監(jiān)聽(tīng)當(dāng)前新消息是否是當(dāng)前聊天對(duì)象以及是否渲染在當(dāng)前會(huì)話(huà)頁(yè)面)
// 用于當(dāng)前會(huì)話(huà)頁(yè)面 ImWatch() { let IM = this.IM var conversation = IM.Conversation.get({ targetId: this.targetId, type: RongIMLib.CONVERSATION_TYPE.PRIVATE }); var option = { timestrap: 0, // 為0從當(dāng)前時(shí)間最新獲取 count: 20 }; conversation.getMessages(option).then((result) =>{ var list = result.list; // 歷史消息列表 var hasMore = result.hasMore; // 是否還有歷史消息可以獲取 // console.log('獲取歷史消息成功', list, hasMore); this.list = list }); IM.watch({ message: function(event){ var message = event.message; // console.log('收到新消息', message); }, // 監(jiān)聽(tīng)會(huì)話(huà) conversation:(res) => { var updatedConversationList = res.updatedConversationList; // 發(fā)送信息過(guò)來(lái)--用戶(hù)id // 發(fā)送過(guò)來(lái)id != 當(dāng)前用戶(hù)id 或者當(dāng)前會(huì)話(huà)id 則不渲染在列表中 // 等于當(dāng)前id 或 會(huì) 話(huà)id 則即加入列表中 let updateId = updatedConversationList[0].latestMessage.content.user.id let member_id = this.$store.state.member.info.member_id let targetId = Number(this.targetId) if(updateId != targetId && updateId != member_id){ return; } this.list.push(updatedConversationList[0].latestMessage) }, status: (event)=>{ var status = event.status; if(status != RongIMLib.CONNECTION_STATUS.CONNECTED) { this.$store.commit('changeConnectStatus',false) } switch (status) { case RongIMLib.CONNECTION_STATUS.CONNECTED: console.log('鏈接成功'); break; case RongIMLib.CONNECTION_STATUS.CONNECTING: console.log('正在連接中'); break; case RongIMLib.CONNECTION_STATUS.DISCONNECTED: console.log('已主動(dòng)斷開(kāi)連接'); break; case RongIMLib.CONNECTION_STATUS.NETWORK_UNAVAILABLE: console.log('網(wǎng)絡(luò)不可用'); // SDK 內(nèi)部會(huì)自動(dòng)進(jìn)行重連 break; case RongIMLib.CONNECTION_STATUS.SOCKET_ERROR: console.log('Socket 鏈接錯(cuò)誤'); // SDK 內(nèi)部會(huì)自動(dòng)進(jìn)行重連 break; case RongIMLib.CONNECTION_STATUS.KICKED_OFFLINE_BY_OTHER_CLIENT: console.log('其他設(shè)備登錄, 本端被踢'); // 己端被踢, 不可進(jìn)行重連. 否則會(huì)造成多端循環(huán)互踢 break; case RongIMLib.CONNECTION_STATUS.BLOCKED: console.log('鏈接斷開(kāi), 用戶(hù)已被封禁'); break; default: console.log('鏈接狀態(tài)變化為:', status); break; } } }) },
9.會(huì)話(huà)頁(yè)面(用于點(diǎn)擊發(fā)送之后監(jiān)聽(tīng)發(fā)送信息及渲染當(dāng)前頁(yè)面)
// 監(jiān)聽(tīng)當(dāng)前發(fā)送的信息 send() { if(this.context == '') { Toast('請(qǐng)輸入內(nèi)容'); return; } var conversation = this.IM.Conversation.get({ targetId: this.targetId, // 發(fā)送的目標(biāo)id type: RongIMLib.CONVERSATION_TYPE.PRIVATE, // 單聊 }); conversation.send({ messageType: RongIMLib.MESSAGE_TYPE.TEXT, // 'RC:TxtMsg' content: { content: this.context, // 文本內(nèi)容 // 發(fā)送消息攜帶的參數(shù) 用于頁(yè)面渲染及相關(guān)判斷 user:{ id:this.$store.state.member.info.member_id, username:this.$store.state.member.info.member_name, shopname:this.storeName, portraitUri:this.$store.state.member.info.member_avatar, } } }).then((message) =>{ // console.log('發(fā)送文字消息成功', message); this.context = '' }).catch((error) => { Toast('發(fā)送失敗,請(qǐng)重試') }); }
到此這篇關(guān)于Vue在H5 項(xiàng)目中使用融云進(jìn)行實(shí)時(shí)個(gè)人單聊通訊的文章就介紹到這了,更多相關(guān)Vue使用融云實(shí)時(shí)個(gè)人單聊通訊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue實(shí)現(xiàn)頁(yè)面上傳文件夾壓縮后傳給服務(wù)器的操作
這篇文章主要介紹了vue實(shí)現(xiàn)頁(yè)面上傳文件夾壓縮后傳給服務(wù)器的操作,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09Vue如何實(shí)現(xiàn)pptx在線(xiàn)預(yù)覽
通過(guò)PPTXjs插件,實(shí)現(xiàn)PPTX文件在線(xiàn)預(yù)覽,需下載PPTXjs,將其引入HTML頁(yè)面,并編寫(xiě)相應(yīng)的HTML和JS代碼,如果是移動(dòng)端還需調(diào)整div大小,這是一種便捷的前端PPTX轉(zhuǎn)HTML技術(shù),適合網(wǎng)頁(yè)展示使用2024-09-09利用vscode編寫(xiě)vue的簡(jiǎn)單配置詳解
這篇文章主要給大家介紹了利用vscode編寫(xiě)vue簡(jiǎn)單配置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-06-06vue自定義密碼輸入框解決瀏覽器自動(dòng)填充密碼的問(wèn)題(最新方法)
這篇文章主要介紹了vue自定義密碼輸入框解決瀏覽器自動(dòng)填充密碼的問(wèn)題,通過(guò)將密碼輸入框的type設(shè)置為text,修改樣式上的顯示,來(lái)實(shí)現(xiàn)既可以讓瀏覽器不自動(dòng)填充密碼,又可以隱藏密碼的效果,需要的朋友可以參考下2023-04-04基于vue3+threejs實(shí)現(xiàn)可視化大屏效果
本文主要主要講述對(duì)threejs的一些api進(jìn)行基本的封裝,在vue3項(xiàng)目中來(lái)實(shí)現(xiàn)一個(gè)可視化的3d項(xiàng)目,包含了一些常用的功能,場(chǎng)景、燈光、攝像機(jī)初始化,模型、天空盒的加載,以及鼠標(biāo)點(diǎn)擊和懸浮的事件交互,感興趣的朋友可以參考下2023-06-06@click.native和@click的區(qū)別及說(shuō)明
這篇文章主要介紹了@click.native和@click的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08