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

news2024/12/23 13:58:21

测试代码: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-chat
    ref="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 = false
      roomMsgMap[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 = true
					messageFile.duration = file.duration
				}

				formattedFiles.push(messageFile)
			})

			return formattedFiles
		},

其他的我也没有测试呢。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1887783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国际数字影像产业园:汇聚全球力量,共绘影像新蓝图

在数字化浪潮席卷全球的今天&#xff0c;我们自豪地宣布&#xff0c;国际数字影像产业园已正式起航&#xff0c;以全球视野为引领&#xff0c;致力于推动数字影像产业的创新发展&#xff0c;引领全球潮流。 一、汇聚全球智慧 国际数字影像产业园以开放包容的姿态&#xff0c;汇…

MIX OTP——使用 ETS 加速

每次我们需要查找存储容器时&#xff0c;我们都需要向注册表发送一条消息。如果我们的注册表被多个进程同时访问&#xff0c;注册表可能会成为瓶颈&#xff01; 在本章中&#xff0c;我们将了解 ETS&#xff08;Erlang Term Storage&#xff09;以及如何将其用作缓存机制。 警…

【信息系统项目管理师】常见图表

作文里面的画图题用语言描述画图过程 合同 采购综合评分标准 责任分配矩阵 成本预算表 成本估算 成本管理计划 活动清单 活动属性 变更日志 问题日志 项目章程 自己再添加更多内容 甘特图 甘特图包含以下三个含义&#xff1a; 1、以图形或表格的形式显示活动&#xff1b; 2、…

JavaScript中window对象 , location对象以及history对象使用方法详细介绍

2.BOM&#xff08;Browser Object Model&#xff09; 操作浏览器的。常用的浏览器对象&#xff1a; 1.window对象&#xff1a;Window 对象表示浏览器中打开的窗口。 2.location对象&#xff1a;Location 对象包含有关当前 URL 的信息。Location 对象是 window 对象的一部分&…

[PyTorch]:加速Pytorch 模型训练的几种方法(几行代码),最快提升八倍(附实验记录)

本篇文章转自&#xff1a;Some Techniques To Make Your PyTorch Models Train (Much) Faster 本篇博文概述了在不影响 PyTorch 模型准确性的情况下提高其训练性能的技术。为此&#xff0c;将 PyTorch 模型包装在 LightningModule 中&#xff0c;并使用 Trainer 类来实现各种训…

使用 Python 五年后,我发现学 python 必看这三本书!少走一半弯路

第一本 《Python编程-从入门到实践》 适合零基础的读者 豆瓣评分&#xff1a;9.1 推荐指数&#xff1a;5颗星 推荐理由&#xff1a; 本书是针对所有层次的 Python 读者而作的 Python 入门书。全书分为两部分&#xff1a; 第一部分介绍使用Python 编程所必须了解的…

将excel表格转换为element table(上)

最近有个功能需要将excel展示到html 界面里面&#xff0c;看是简单的一个需求也是需要费尽心思才完得成 原始数据 想要把excel 读取出来&#xff0c;于是使用xlsl的插件 npm i xlsx通过插件可以获取到已经分析好的数据 然后使用sheet_to_html将数据转换为html 再使用v-htm…

ROS2 RQT

1. RQT是什么 RQT是一个GUI框架&#xff0c;通过插件的方式实现了各种各样的界面工具。 强行解读下&#xff1a;RQT就像插座&#xff0c;任何电器只要符合插座的型号就可以插上去工作。 2.选择插件 这里我们可以选择现有的几个RQT插件来试一试&#xff0c;可以看到和话题、参…

视频太大怎么压缩变小?6款视频压缩软件免费版分享

视频太大怎么压缩得又小又清晰呢&#xff1f;无论是视频文件传输、视频文件存储&#xff0c;还是进行自媒体视频上传&#xff0c;都对视频文件的大小有一定的限制。高质量的视频文件往往伴随着文件占据大量存储空间&#xff0c;导致文件传输速度变慢。今天教大家6种视频压缩软件…

配置WLAN 示例

规格 仅AR129CVW、AR129CGVW-L、AR109W、AR109GW-L、AR161W、AR161EW、AR161FGW-L、AR161FW、AR169FVW、AR169JFVW-4B4S、AR169JFVW-2S、AR169EGW-L、AR169EW、AR169FGW-L、AR169W-P-M9、AR1220EVW和AR301W支持WLAN-FAT AP功能。 组网需求 如图1所示&#xff0c;企业使用WLAN…

搜维尔科技:数据手套为什么要选择SenseGlove

了解 SenseGlove SenseGlove 是一支由电子工程师、触觉研究人员和计算机视觉专家、XR 开发人员、UX 设计师和产品创新者组成的科幻爱好者团队&#xff0c;他们拥有丰富人类能力和赋予 Metaverse 意义的技能和热情。 推进触觉技术是我们实现这一目标的方式。 公司及产品背景 S…

将多个SQL查询合并的两种方式

说明&#xff1a;单个简单查询是非常容易的&#xff0c;但是为了避免多次访问访问数据库&#xff0c;我们会尽可能通过表关联将业务所需要的字段值一次性查出来。而有时候不太清楚表之间的关联关系&#xff08;这取决于对业务的熟悉程度&#xff09;&#xff0c;或者实际情况就…

ubuntu 安装并启用 samba

环境&#xff1a;ubuntu server 24.04 步骤如下&#xff1a; sudo apt update sudo apt install samba修改配置文件&#xff1a; sudo vi /etc/samba/smb.conf新增内容&#xff1a; [username]path /home/[username]available yesvalid users [username]read only nobrow…

2021强网杯

一、环境 网上自己找 二、步骤 2.1抛出引题 在这个代码中我们反序列&#xff0c;再序列化 <?php$raw O:1:"A":1:{s:1:"a";s:1:"b";};echo serialize(unserialize($raw));//O:1:"A":1:{s:1:"a";s:1:"b";…

RFID技术在粉末涂料配料生产线的精准应用

RFID技术在粉末涂料配料生产线的精准应用 应用背景 随着科技的快速发展&#xff0c;智能化、自动化已经成为现代工业生产的重要趋势。RFID&#xff08;无线射频识别&#xff09;技术以其独特的优势&#xff0c;如非接触式识别、高速读取、大容量数据存储等&#xff0c;在多个…

206.贪心算法:摆动序列(力扣)

代码展示 class Solution { public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() < 1) return nums.size(); // 如果数组长度小于等于1&#xff0c;返回数组长度int curdiff 0; // 当前元素和前一个元素的差值int prediff 0; // 前一个差值int…

品牌推广怎么样?掌握正确做法,让品牌大放异彩!

品牌推广对于初创公司来说是一项至关重要的任务。在市场众多品牌中&#xff0c;如何脱颖而出&#xff0c;是每个品牌方都要考虑的问题。 作为一名手工酸奶品牌的创始人&#xff0c;目前全国复制了100多家门店&#xff0c;我来分享下&#xff0c;如何推广&#xff0c;可以让品牌…

Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff

1.创建版本库 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做&#xff0c;完全是本地化的。 在目录中执行 git init&#xff0c;就可以创建一个 Git 仓库了。 注意: 没事不要手动修改 .git 目录里面的文件&#xff0c;不然改乱了&#xff0c;可能就…

zabbix“专家坐诊”第244期问答

问题一 Q&#xff1a;请教一下&#xff0c;我的zabbix6.0配置的基于snmptrap上报的日志提取关键字推送告警&#xff0c;正则表达式能否帮忙看看怎么弄&#xff1f;我这配置的提示一直不正确&#xff1f; A&#xff1a;具体看一下这里的信息。 Q&#xff1a;这个我是直接复制的…

亚马逊卖家专属ERP系统,无任何隐形FY。

三千多终身使用的ERP&#xff0c;图片翻译、文本图片翻译&#xff0c;无任何隐藏fy&#xff0c;不限制授权店铺&#xff0c;不限制开通子账号。 现在来讲下我们店飞飞ERP的铺货功能。 点击数据采集&#xff0c;选择需要的产品&#xff0c;可以批量编辑、批量编辑价格、一键翻…