基于vue-advanced-chat组件自义定聊天(socket.io+vue2)

通过上一篇文章https://blog.csdn.net/beekim/article/details/134176752?spm=1001.2014.3001.5501,
我们已经在vue-advanced-chat中替换掉原有的firebase,用socket.io简单的实现了聊天功能。

现在需要自义定该组件,改造成我们想要的样子:
在这里插入图片描述

先将比较重要的几块提取出来

1.重要模块

1.1 socket.io的封装

ws的几个事件是参考firebase的封装方式
socket.ts

import { reactive } from 'vue';
import { io, Socket } from 'socket.io-client';
console.log(import.meta.env.VITE_GLOB_CHATROBAT_URL);//这个地址我配置在.env配置文件里面的,方便维护
const wsUrl:any = import.meta.env.VITE_GLOB_CHATROBAT_URL;
class SocketService {socket: Socket;state: any;constructor() {this.state = reactive({id: '',//这里面可以自义定变量});// http://192.168.1.50:8567/// http://140.207.154.220:8567// ws://localhost:3333this.socket = io(wsUrl, {autoConnect: false, // 禁止自动连接extraHeaders: {'Access-Control-Allow-Origin': '*', // 设置跨域请求头},transports: ['websocket', 'polling', 'flashsocket'],//注意点:加上这个配置ws才可以注册到后台});connect() {this.socket.connect();console.log('socket connect');}disconnect() {this.socket.disconnect();console.log('socket disconnect');}/*** @description 房间更新* @param bn_user_name 当前登录人的邮箱 ,必传* @param callback 回调函数* @constructor*/// callback?: anyRoomUpdate(bn_user_name: string, callback?: any) {const param = {bn_user_name: bn_user_name,};console.log('ws事件room参数', param);this.socket.emit('room_update', param);//回调函数中传入最新获取到的值this.socket.on('room_update', (res) => {console.log('room列表(room_update)', res);if (typeof res !== 'string') {callback(res);}});}/*** @description 房间内的消息更新* @param roomId 房间id ,必传* @param callback 回调函数* @constructor*/MessageUpdate(roomId: string, callback?: any) {const param = {room_id: roomId,};console.log('ws事件参数', param);this.socket.emit('room_message_update', param);//回调函数中传入最新获取到的值this.socket.off('room_message_update'); //避免重复订阅this.socket.on('room_message_update', (res) => {console.log('房间消息(room_message_update)', res);if (typeof res !== 'string') {callback(res);}});}/*** @description 最后一条消息更新* @param bn_user_name  当前登录人 邮箱 ,必传* @param callback 回调函数* @constructor*/LastMessageUpdate(bn_user_name, callback?: any) {const param = {bn_user_name: bn_user_name,};//回调函数中传入最新获取到的值console.log('ws事件最后一条消息参数', param);this.socket.emit('last_message_update', param);this.socket.off('last_message_update'); //避免重复订阅this.socket.on('last_message_update', (res) => {console.log('最后一条消息(last_message_update)', res);if (typeof res !== 'string') {callback(res);}});}
}export const socketService = new SocketService();
export const socket = socketService.socket;
export const state = socketService.state;

在生命周期中使用和注销:(注意:这里一定要注销,我在测试时遇到了游览器偶尔能注册连接ws,多数情况下注册不了就是这个原因)

    mounted() {socketService.connect();},unmounted() {console.log('distory');socketService.disconnect();},

1.2 自义定的监听事件(替换firebase方案)

1.2.1 listenMessages

监听房间内的消息

  listenMessages(roomId) {socketService.MessageUpdate(roomId, (messages) => {if (messages) {const rawRoom = this.rooms.find((r) => r.roomId === roomId);if (rawRoom) {messages.forEach((message) => {//message是对话窗口里面的所有消息值const formattedMessage = this.formatMessage(rawRoom, message);const messageIndex = this.messages.findIndex((m) => m._id === message.id);if (messageIndex === -1) {//只有两个窗口登录人为同一个人,给某个人发消息是才会出现-1的情况// console.log('[listenMessages] new formatted message:' + JSON.stringify(formattedMessage));this.messages = this.messages.concat([formattedMessage]);} else {this.messages[messageIndex] = formattedMessage;this.messages = [...this.messages];}// this.markMessagesSeen(room, message);});}}});},

1.2.2 listenRooms

监听左侧房间list

 listenRooms() {socketService.RoomUpdate(this.currentUserId, (rooms) => {rooms.forEach((room) => {const foundRoom = this.rooms.find((r) => r.roomId === room.id);if (JSON.stringify(this.rooms) !== '[]') {//判空if (foundRoom) {//正在编辑的用户,该功能暂时用不上foundRoom.typingUsers = room.typingUsers;//最后一次更新时间foundRoom.index = room.lastUpdated.seconds;

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker容器内 获取宿主机ip

可以使用命令 --add-host jargatewayip:192.168.0.47 \ 需要注意,这里不能是 127.0.0.1 ,所以要找到服务器局域网的ip 命令示例 docker run -it \-p 80:80 \-p 443:443 \--name nginx \--network app --hostname nginx \-e TZAsia/Shanghai \--add-host jargatewayip:192.16…

如何在Window系统下搭建Nginx服务器环境并部署前端项目

1.下载并安装Nginx 在nginx官网nginx: download 下载稳定版本至自己想要的目录。 解压后进入目录 2.启动Nginx服务器 启动方式有两种: (1)直接进入nginx安装目录下,双击nginx.exe运行,此时命令行窗口一闪而过&…

计算机的工作原理(上)

1. 计算机发展史 计算的需求在人类的历史中是广泛存在的,发展大体经历了从一般计算工具到机械计算机到目前的电子计算机的发展历程。(以下是计算机的发展历程) 1、公元前2500 年前,算盘已经出现了;除此之外&#xff0c…

Qt通用属性工具:随心定义,随时可见(一)

一、开胃菜&#xff0c;没图我说个DIAO 先不BB&#xff0c;给大家上个效果图展示下&#xff1a; 上图我们也没干啥&#xff0c;几行代码&#xff1a; #include "widget.h" #include <QApplication> #include <QObject> #include "QtPropertyEdit…

MySQL的安装及如何连接到Navicat和IntelliJ IDEA

MySQL的安装及如何连接到Navicat和IntelliJ IDEA 文章目录 MySQL的安装及如何连接到Navicat和IntelliJ IDEA1 MySQL安装1.1 下载1.2 安装(解压)1.3 配置1.3.1 添加环境变量1.3.2 新建配置文件1.3.3 初始化MySQL1.3.4 注册MySQL服务1.3.5 启动MySQL服务1.3.6 修改默认账户密码 1…

【前端】前后端通信方法与差异(未完待续)

系列文章 【Vue】vue增加导航标签 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/134965353 【Vue】Element开发笔记 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/133947977 【Vue】vue&#xff0c;在Windows IIS平台…

jar混淆,防止反编译,Allatori工具混淆jar包

文章目录 Allatori工具简介下载解压配置config.xml注意事项 Allatori工具简介 官网地址&#xff1a;https://allatori.com/ Allatori不仅混淆了代码&#xff0c;还最大限度地减小了应用程序的大小&#xff0c;提高了速度&#xff0c;同时除了你和你的团队之外&#xff0c;任何人…

基于ssm图书管理系统的设计与实现论文

摘 要 随着科技的快速的发展和网络信息的普及&#xff0c;信息化管理已经融入到了人们的日常生活中&#xff0c;各行各业都开始采用信息化管理系统&#xff0c;通过计算机信息化管理&#xff0c;首先可以减轻人们工作量&#xff0c;而且采用信息化管理数据信息更加的严谨&…

es、MySQL 深度分页问题

文章目录 es 深度分页MySQL 深度分页 es 深度分页 es 深度分页问题&#xff0c;有点忘记了&#xff0c;这里记录一下 当索引库中有10w条数据&#xff0c;比如是商品数据&#xff1b;用户就是要查在1w到后10条数据&#xff0c;怎么查询。 es查询是从各个分片中取出前1w到后10条数…

音画欣赏|《同杯万古尘》

《同杯万古尘》 尺寸&#xff1a;69x35cm 陈可之2023年绘 《拟古十二首-其九》 李白 生者为过客&#xff0c;死者为归人。 天地一逆旅&#xff0c;同悲万古尘。 月兔空捣药&#xff0c;扶桑已成薪。 白骨寂无言&#xff0c;青松岂知春。 前后更叹息&#xff0c;浮荣安足珍&am…

SpringMVC基础知识(持续更新中~)

笔记&#xff1a; https://gitee.com/zhengguangqq/ssm-md/blob/master/ssm%20md%E6%A0%BC%E5%BC%8F%E7%AC%94%E8%AE%B0/%E4%B8%89%E3%80%81SpringMVC.md 细节补充&#xff1a; ​​​​​​​

Linux 一键部署二进制Gitea

gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…