vue-advanced-chat 聊天控件的使用

測試代碼:https://github.com/robinfoxnan/vue-advanced-chat-test0?

控件源碼:https://github.com/advanced-chat/vue-advanced-chat?

先上個效果圖:

這個控件就是專門為聊天而設計的,但是也有一些不足:

1)有些引用的控件已經過期了,還有些內存泄漏;

2)示例的demo使用的google的firebase存儲,運行不起來;

文檔寫的太粗糙,所以折騰了一個上午,用內存數據測試了一下顯示效果。

要點如下:

1)聊天室(會話)需要設置各種屬性:

<template><vue-advanced-chatref="chat":current-user-id="currentUserId"    // 當前用戶ID:rooms="JSON.stringify(rooms)"      // 會話列表:messages="roomMessages"            // 當前會話的消息列表:menu-actions="JSON.stringify(menuActions)"      // 右側...的菜單// 消息有4個下拉菜單:message-selection-actions="JSON.stringify(messageSelectionActions)":loading-rooms="loadingRooms"  // bool類型,是否正在加載會話列表:rooms-loaded="messagesLoaded" // bool類型,會話加載完畢,不在拉動加載:room-id="roomId"              // 最初的會話ID:room-message="roomMessage"    // 這個是個字符串,沒有發現用法:messages-loaded = "true"      // 消息更新完以后,設置為true則不再動畫轉圈@add-room="addRoom($event.detail[0])"   // 添加一個會話按鈕的回調@fetch-messages="fetchMessages($event.detail[0])"  // 切換會話時候會觸發加載消息的回調@send-message="sendMessage($event.detail[0])"      // 點擊發送按鈕時候觸發發送動作/>
</template>

2)會話的格式如下:

rooms: [{roomId: '1',roomName: '飛鳥 的聊天',avatar: icons[0],unreadCount: 1,lastUpdated: Date.now(),index: 1,lastMessage: {_id: '1',content: '在么?在么?',senderId: '1',username: '小花兒',timestamp: '10:20',saved: true,distributed: false,seen: true,new: true},users: [users["1"], users["2"]],typingUsers: [ '1' ]},{roomId: '2',roomName: '群聊',avatar: icons[1],unreadCount: 4,lastUpdated: Date.now(),index: 2,lastMessage: {_id: '2',content: '昨天我們做了一個測試……',senderId: '1',username: '飛鳥',timestamp: '10:20',saved: true,distributed: false,seen: true,new: true},users: [ users["1"], users["2"]],typingUsers: [ '2' ]}],

3)消息的格式如下:

const aMsg ={_id: '1',indexId: 1,content: '小花發送的測試消息',senderId: users["1"]._id,username: users["1"].username,avatar: users["1"].avatar,date: '13 November',timestamp: '10:20',system: false,saved: true,distributed: true,seen: true,deleted: false,failure: false,disableActions: false,disableReactions: false,};

4) 會話的消息的需要動態加載的:

 // 點擊了聊天會話,會觸發這個回調函數,在這里加載消息fetchMessages({ room, options = {} }) {this.messagesLoaded = false;this.$emit('show-demo-options', false)if (options.reset) {//this.resetMessages()}console.log("選項:" +options);console.log("選中會話:" +room.roomId);this.roomMessages = roomMsgMap[room.roomId]this.messagesLoaded = true},

5) 發送消息動作:

帶有附件的其實要先上傳,上傳完畢后,將遠端的url賦值給url就認為是發送完畢了,不再顯示動畫了;否則一直轉圈,顯示發送中;

// 點擊了發送按鈕,則執行發送消息async sendMessage({ content, roomId, files, replyMessage }) {console.log("當前發送消息到對話:" + roomId );this.currentMsgSeq =  this.currentMsgSeq + 1;const u = users[this.currentUserId];const message = {_id : this.currentMsgSeq.toString(),senderId: this.currentUserId,username: u.username,avatar: u.avatar,content: content,timestamp: formatDate(new Date()),date: '13 November',system: false,saved: true,distributed: true,seen: true,deleted: false,failure: false,disableActions: false,disableReactions: false,}if (files) {message.files = this.formattedFiles(files)console.log(files);}if (replyMessage) {message.replyMessage = {_id: replyMessage._id,content: replyMessage.content,sender_id: replyMessage.senderId}if (replyMessage.files) {message.replyMessage.files = replyMessage.files}}this.messagesLoaded = falseroomMsgMap[roomId].push(message);// console.log(roomMsgMap[roomId]);this.roomMessages = [...roomMsgMap[roomId]]// 注意,下面的用法不行,不刷新//this.roomMessages = roomMsgMap[roomId]console.log(this.roomMessages);this.messagesLoaded = true},formattedFiles(files) {const formattedFiles = []files.forEach(file => {const messageFile = {name: file.name,size: file.size,type: file.type,extension: file.extension || file.type,url: file.url || file.localUrl// 注意,這里設置了HTTP的圖片地址后,能正確加載,證明上傳完畢,上傳過程就停止了,不轉了//url :"https://img0.baidu.com/it/u=1746301175,572912059&fm=253&fmt=auto&app=120&f=JPEG?w=580&h=500"}if (file.audio) {messageFile.audio = truemessageFile.duration = file.duration}formattedFiles.push(messageFile)})return formattedFiles},

其他的我也沒有測試呢。

有興趣一起做即時通信的朋友可以私聊。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37144.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37144.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【層序遍歷】個人練習-Leetcode-102. Binary Tree Level Order Traversal

題目鏈接&#xff1a;https://leetcode.cn/problems/binary-tree-level-order-traversal/description/ 題目大意&#xff1a;給一棵樹的根&#xff0c;要求以vector<vector<int>>形式給出層序遍歷結果。 思路&#xff1a;層序遍歷并不難&#xff0c;tricky的點在…

Python學習筆記26:進階篇(十五)常見標準庫使用之性能測試cProfile模塊學習使用

前言 本文是根據python官方教程中標準庫模塊的介紹&#xff0c;自己查詢資料并整理&#xff0c;編寫代碼示例做出的學習筆記。 根據模塊知識&#xff0c;一次講解單個或者多個模塊的內容。 教程鏈接&#xff1a;https://docs.python.org/zh-cn/3/tutorial/index.html 本文主要…

【vuejs】首次頁面加載時觸發那些聲明周期鉤子函數

1. 首次頁面加載觸發的鉤子 在Vue.js中&#xff0c;頁面或組件的首次加載會觸發一系列預定義的生命周期鉤子函數&#xff0c;這些鉤子函數按照特定的順序執行&#xff0c;允許開發者在組件的不同階段執行代碼。以下是首次頁面加載時觸發的鉤子及其作用&#xff1a; 2.1 befor…

.net core 的 winform 的 瀏覽器控件 WebView2

在.NET Core WinForms應用程序中&#xff0c;沒有直接的“瀏覽器控件”&#xff0c;因為WinForms不支持像WebBrowser控件那樣的功能。但是&#xff0c;你可以使用WebView2控件&#xff0c;它是一個基于Chromium的瀏覽器內核&#xff0c;可以在WinForms應用程序中嵌入Web內容。 …

R語言 | 使用ggplot繪制柱狀圖,在柱子中顯示數值和顯著性

原文鏈接&#xff1a;使用ggplot繪制柱狀圖&#xff0c;在柱子中顯示數值和顯著性 本期教程 獲得本期教程示例數據&#xff0c;后臺回復關鍵詞&#xff1a;20240628。&#xff08;PS&#xff1a;在社群中&#xff0c;可獲得往期和未來教程所有數據和代碼&#xff09; 往期教程…

搭建ASPP:多尺度信息提取網絡

文章目錄 介紹代碼實現 介紹 ASPP&#xff08;Atrous Spatial Pyramid Pooling&#xff09;&#xff0c;空洞空間卷積池化金字塔。簡單理解就是個至尊版池化層&#xff0c;其目的與普通的池化層一致&#xff0c;盡可能地去提取特征。ASPP 的結構如下&#xff1a; 如圖所示&…

Nuxt框架 和 Vite框架比較(四)

共同點 基于 Vue.js&#xff1a;Nuxt 和 Vite 都是圍繞 Vue.js 構建的&#xff0c;這意味著它們可以利用 Vue.js 的響應式數據綁定和組件系統。 現代前端開發&#xff1a;兩者都支持現代前端開發實踐&#xff0c;如組件化、模塊化和單文件組件&#xff08;SFCs&#xff09;。 V…

十二、Yocto集成ROS2 app程序(package)

文章目錄 Yocto集成ROS2 app程序1. 添加一個ros2 package應用程序2. 添加bb文件集成app應用程序 Yocto集成ROS2 app程序 本篇文章為基于raspberrypi 4B單板的yocto實戰系列的第十二篇文章&#xff1a; 一、yocto 編譯raspberrypi 4B并啟動 二、yocto 集成ros2(基于raspberrypi…

【MotionCap】DROID-SLAM 1 :介紹及安裝

DROID-SLAM :DROID-SLAM: Deep Visual SLAM for Monocular DROID-SLAM:適用于單目、立體和 RGB-D 相機的深度視覺 SLAM Stereo, and RGB-D Cameras https://arxiv.org/abs/2108.10869DROID-SLAM: Deep Visual SLAM for Monocular, Stereo, and RGB-D Camerasfile:///X:/04_mo…

GuLi商城-前端啟動命令npm run dev

由于這里配置了dev&#xff0c;所以啟動命令是npm run dev

柯橋在職學歷提升|專科本科之自考本科哪些專業不考數學

一、管理類專業 這類專業綜合性和理論性比較強&#xff0c;除了涉及到管理學相關的理論知識外&#xff0c;還有相應的專業知識&#xff0c;目前比較典型的專業有&#xff1a;行政管理、人力資源管理、工商管理&#xff08;現代企業管理&#xff09;、工商管理&#xff08;商務管…

高通410-linux棒子設置網絡驅動

1.首先打開設備管理器 2.看到其他設備下的RNDIS&#xff0c;右鍵更新驅動程序 3.點擊瀏覽我的電腦… 最后一個

Sentinel實現區分來源

要區分來源就要寫代碼實現RequestOriginParser接口 ,注意是要實現com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser 接口,別搞錯接口了。 MyRequestOriginParser.java package com.codex.terry.sentinel.origin;import com.alibaba.csp.sentinel.ad…

Linux操作系統--軟件包管理(保姆級教程)

RPM軟件包的管理 大多數linux的發行版本都是某種打包系統。軟件包可以用來發布應用軟件&#xff0c;有時還可以發布配置文件。他們比傳統結構的.tar和.gz存檔文件有幾個優勢。如它們能讓安裝過程盡可能成為不可分割的原子操作。 軟件包的安裝程序會備份它們改動過的文件。如果…

2024-6-28 石群電路-32

2024-6-28&#xff0c;星期五&#xff0c;20:05&#xff0c;天氣&#xff1a;雨&#xff0c;心情&#xff1a;晴。今天沒有什么事情發生&#xff0c;繼續學習&#xff0c;加油&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1. 對稱三相電路的計算&#xff08…

【面試題】網絡 DNS協議(第二篇)

1.什么是DNS&#xff1f;它的作用是什么&#xff1f; DNS是一種將域名轉換為IP地址的協議。 它的作用是通過將域名解析為相應的IP地址&#xff0c;使得用戶可以更方便地訪問互聯網上的資源&#xff0c;而無需直接記住大量的IP地址。 2.DNS解析過程是怎樣的&#xff1f; 客戶端…

高性能、高可靠性!Kafka的技術優勢與應用場景全解析

今天要和大家聊聊一個超級強大的消息系統——Kafka&#xff0c;從零開始&#xff0c;深入了解一下Kafka的優點和它的實際應用場景。 Kafka的優點 1. 高吞吐量 Kafka的高吞吐量表現堪稱驚人。單機每秒處理幾十上百萬的消息量&#xff0c;即使存儲了TB級別的消息&#xff0c;它…

6.24.4.2 YOLO- logo:一種基于變壓器的YOLO分割模型,用于數字乳房x光片中乳腺腫塊的檢測和分割

背景與目的:數字化乳房x光片的腫塊檢測和分割在乳腺癌的早期發現和治療中起著至關重要的作用。此外&#xff0c;臨床經驗表明&#xff0c;它們是乳腺病變病理分類的上游任務。深度學習的最新進展使分析更快、更準確。本研究旨在開發一種用于乳房x線攝影的乳腺癌質量檢測和分割的…

MySQL事物

事務的概念 ●事務是一種機制、一個操作序列&#xff0c;包含了一組數據庫操作命令&#xff0c;并且把所有的命令作為一個整體 一起向系統提交或撤銷操作請求&#xff0c;即這一組數據庫命令要么都執行&#xff0c;要么都不執行。 ●事務是一個不可分割的工作邏輯單元&#…

深度學習經典檢測方法概述

一、深度學習經典檢測方法 two-stage&#xff08;兩階段&#xff09;&#xff1a;Faster-rcnn Mask-Rcnn系列 one-stage&#xff08;單階段&#xff09;&#xff1a;YOLO系列 1. one-stage 最核心的優勢&#xff1a;速度非常快&#xff0c;適合做實時檢測任務&#xff01; 但是…