Vue2下判断有新消息来时以站内信方式在页面右下角弹出
以下是完整的Vue2全局通知组件实现方案,包含自动挂载和全局调用方法:
第一步:创建通知组件
<!-- src/components/Notification/index.vue -->
<template><div class="notification-container"><transition-group name="notification-slide"><div v-for="(msg, index) in activeNotifications":key="msg.id"class="notification":class="[`type-${msg.type}`]"><div class="notification-header"><span class="title">{{ msg.title }}</span><button class="close-btn" @click="close(msg.id)">×</button></div><div class="content">{{ msg.content }}</div></div></transition-group></div>
</template><script>
export default {name: 'GlobalNotification',data() {return {notifications: [],nextId: 1}},computed: {activeNotifications() {return this.notifications.slice(-3)}},methods: {add(config) {const newMsg = {id: this.nextId++,type: 'info',duration: 5000,...config,timer: null}newMsg.timer = setTimeout(() => {this.close(newMsg.id)}, newMsg.duration)this.notifications.push(newMsg)},close(id) {const index = this.notifications.findIndex(msg => msg.id === id)if (index > -1) {clearTimeout(this.notifications[index].timer)this.notifications.splice(index, 1)}}}
}
</script><!-- 保持之前提供的样式不变 --><style scoped>
.notification-container {position: fixed;bottom: 20px;right: 20px;z-index: 9999;max-width: 350px;display: flex;flex-direction: column-reverse;gap: 15px;
}.notification {background: #fff;border-radius: 8px;box-shadow: 0 4px 12px rgba(0,0,0,0.15);padding: 15px;border-left: 4px solid #409eff;transition: all 0.3s ease;
}.notification.type-success {border-color: #67c23a;
}
.notification.type-warning {border-color: #e6a23c;
}
.notification.type-error {border-color: #f56c6c;
}.notification-header {display: flex;justify-content: space-between;align-items: center;margin-bottom: 8px;
}.title {font-weight: 600;font-size: 14px;color: #303133;
}.close-btn {border: none;background: transparent;font-size: 18px;cursor: pointer;color: #909399;padding: 0 5px;
}.content {font-size: 13px;color: #606266;line-height: 1.5;
}.notification-slide-enter-active,
.notification-slide-leave-active {transition: all 0.3s ease;
}
.notification-slide-enter,
.notification-slide-leave-to {opacity: 0;transform: translateX(100%);
}
</style>
第二步:创建插件文件
// src/components/Notification/index.js
import Vue from 'vue'
import Notification from './index.vue'const NotificationConstructor = Vue.extend(Notification)let notificationInstance = nullconst initInstance = () => {notificationInstance = new NotificationConstructor({el: document.createElement('div')})document.body.appendChild(notificationInstance.$el)
}const NotificationPlugin = {install(vue) {vue.prototype.$notify = (config) => {if (!notificationInstance) {initInstance()}notificationInstance.add(config)}}
}export default NotificationPlugin
第三步:全局注册(main.js)
// src/main.js
import Vue from 'vue'
import App from './App.vue'
import NotificationPlugin from '@/components/Notification/index'Vue.use(NotificationPlugin)new Vue({render: h => h(App)
}).$mount('#app')
第四步:全局使用示例
在任何Vue组件中直接调用:
// 显示基础通知
this.$notify({title: '系统消息',content: '您有新的站内信',type: 'success',duration: 3000
})// 显示警告通知
this.$notify({title: '操作警告',content: '删除操作不可恢复',type: 'warning'
})// 显示错误通知
this.$notify({title: '发生错误',content: '网络连接超时',type: 'error',duration: 8000
})
功能增强说明:
- 自动挂载:首次调用时自动创建DOM节点,无需手动放置组件
- 内存管理:使用单例模式保证全局只有一个通知实例
- 类型校验(可选增强):
// 在NotificationPlugin中添加
import { validateType } from './validators'Vue.prototype.$notify = (config) => {if (!validateType(config.type)) {console.error('Invalid notification type')return}// ...原有逻辑
}
- 全局配置(可选):
// 初始化配置
Vue.use(NotificationPlugin, {maxDisplay: 5, // 最大显示数量defaultDuration: 5000, // 默认持续时间position: { // 显示位置bottom: '20px',right: '20px'}
})
注意事项:
- 样式文件需要全局引入或在组件内使用
scoped
以外的样式声明 - 建议在组件销毁时自动清理定时器(已在原组件实现)
- 可以通过扩展
config
参数添加更多功能(如点击回调、自定义模板等)
这种实现方式具有以下优势:
- 真正的全局单例模式
- 完全解耦的调用方式
- 支持Vue2的完整生命周期管理
- 可扩展性强,方便后续功能升级
第五步:header组件判断新消息
mounted() {this.startTimer(); // 组件挂载时启动定时器
},
beforeDestroy() {this.stopTimer(); // 组件销毁时清除定时器
},
methods: {// 启动定时器startTimer() {if (!this.timer) {this.timer = setInterval(this.checkForNewMessages, 10000); // 每 10 秒执行一次}},// 清除定时器stopTimer() {if (this.timer) {clearInterval(this.timer);this.timer = null;}},// 检查是否有新消息checkForNewMessages() {this.$http.post('/message/list',{'pageSize':3,"userId":this.userId}).then(res => {console.log('定时器判断是否有新消息 : ',res);if (res.code === '0000'&&res.data.rows.length>0) {res.data.rows.forEach(item => {// 显示基础通知this.$notify({title: '新消息提醒',content: item.content,type: 'success',duration: 3000})})}}).catch(error => {console.error('检查新消息失败:', error);});},
相关文章:
Vue2下判断有新消息来时以站内信方式在页面右下角弹出
以下是完整的Vue2全局通知组件实现方案,包含自动挂载和全局调用方法: 第一步:创建通知组件 <!-- src/components/Notification/index.vue --> <template><div class"notification-container"><transition-g…...

AI语言模型的技术之争:DeepSeek与ChatGPT的架构与训练揭秘
云边有个稻草人-CSDN博客 目录 第一章:DeepSeek与ChatGPT的基础概述 1.1 DeepSeek简介 1.2 ChatGPT简介 第二章:模型架构对比 2.1 Transformer架构:核心相似性 2.2 模型规模与参数 第三章:训练方法与技术 3.1 预训练与微调…...

网络安全中的account和audit区别
一、AWD介绍 AWD:Attack With Defence,即攻防对抗,比赛中每个队伍维护多台服务器(一般两三台,视小组参赛人数而定),服务器中存在多个漏洞(web层、系统层、中间件层等)&a…...

Visual Studio 使用 “Ctrl + /”键设置注释和取消注释
问题:在默认的Visual Studio中,选择单行代码后,按下Ctrl /键会将代码注释掉,但再次按下Ctrl /键时,会进行双重注释,这不是我们想要的。 实现效果:当按下Ctrl /键会将代码注释掉,…...
【密评】 | 商用密码应用安全性评估从业人员考核题库(23)
在GM/T0048《智能密码钥匙密码检测规范》中,产品的对称算法性能应满足哪个标准中的要求()。 A.GM/T 0016《智能密码钥匙密码应用接口规范》 B.GM/T 0017《智能密码钥匙密码应用接口数据格式规范》 C.GM/T 0027《智能密码钥匙技术规范》 D.GM/T 0028《密码模块安全技术要求》…...

【MySQL】幻读 案例分析
目录 假设1:只在 id5 这一行加锁,其他行不加锁? 幻读的定义 幻读的场景 假设1 产生的问题:语义被破坏 假设1 产生的问题:数据一致性 结论: 假设1不成立 假设2:扫描过程中每一行都加上写锁…...
10bit VS 8bit 视频:色彩深度的较量,谁才是视觉盛宴的王者?
10bit 和 8bit 视频 10bit 视频和 8bit 视频的主要区别在于色彩深度和细节表现能力。10bit 视频具有更高的色彩深度和更丰富的细节表现,能够提供更平滑的色彩过渡和更真实的图像质量,但需要更多的存储空间和带宽。8bit 视频则在存储和传输方面更加高效,适合于对存储空间和带…...
讲解下MySql的外连接查询在SpringBoot中的使用情况
在Spring Boot中使用MySQL的外连接查询时,通常通过JPA、MyBatis或JDBC等持久层框架来实现。外连接查询主要用于从多个表中获取数据,即使某些表中没有匹配的记录。外连接分为左外连接(LEFT JOIN)、右外连接(RIGHT JOIN&…...
蓝桥杯试题:归并排序
一、问题描述 在一个神秘的岛屿上,有一支探险队发现了一批宝藏,这批宝藏是以整数数组的形式存在的。每个宝藏上都标有一个数字,代表了其珍贵程度。然而,由于某种神奇的力量,这批宝藏的顺序被打乱了,探险队…...
物联网(IoT)如何与人工智能(AI)的结合
物联网(IoT)与人工智能(AI)的结合是当前技术发展的重要趋势,通常被称为 AIoT(人工智能物联网)。这种结合通过将AI的计算能力和数据分析能力与物联网的海量设备连接能力相结合,实现了…...

一致性Hash算法延伸至Redis分片扩容使Lua脚本失效如何解决
文章部分内容来源:小林coding 问题场景:我们需要用Lua脚本,并且这个Lua脚本需要用到两个Key,但这两个Key必须命中同一台机器才可以,不然Lua脚本就会执行失败。如果集群扩容可能会导致两个Key落到不同的节点上导致Lua脚…...
Idea 插件 Quickly-Code-Toolkit
使用说明 (一)全局设置 Paging Wrapper Setting(分页设置) 功能:主要用于在方法写入时,为返回参数提供分页包装类。设置方式:需准确填写分页包装类的全限定名,例如:com…...
先进制造aps专题二十九 基于ai智能体的生产排程和工厂生产仿真引擎的设计
上文中,我们说,通常的做法是,可以先通过排产仿真引擎产生生产计划,再在工厂仿真引擎里仿真执行,这样可以预先分析计划和执行的差异情况并进行调整优化 这里的产生生产计划,仿真生产执行和数据分析都是人工…...

【Cocos TypeScript 零基础 15.1】
目录 见缝插针UI脚本针脚本球脚本心得_旋转心得_更改父节点心得_缓动动画成品展示图 见缝插针 本人只是看了老师的大纲,中途不明白不会的时候再去看的视频 所以代码可能与老师代码有出入 SIKI_学院_点击跳转 UI脚本 import { _decorator, Camera, color, Component, directo…...

利用邮件合并将Excel的信息转为Word(单个测试用例转Word)
利用邮件合并将Excel的信息转为Word 效果一览效果前效果后 场景及问题解决方案 一、准备工作准备Excel数据源准备Word模板 二、邮件合并操作步骤连接Excel数据源插入合并域预览并生成合并文档 效果一览 效果前 效果后 场景及问题 在执行项目时的验收阶段,对于测试…...

尚硅谷课程【笔记】——大数据之Hadoop【一】
课程视频链接:尚硅谷Hadoop2.x框架入门 一、大数据概论 1)大数据概念 大数据(Big Data):指无法再一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞…...
C++ ——基础进阶
1、引用 概念:相当于给变量取个别名,通过使用&在变量定义时定义 1.1 性质 (1)成为一个变量的引用后,就不能成为其他变量的引用 int a1; int& a_citea; int b90; a_citeb; //相当于把b的值给了a_cite cout&l…...
@synchronized的使用
synchronized 介绍 synchronized 是 Objective-C 提供的一种 互斥锁(Mutex),它用于确保一段代码在同一时间只有一个线程能执行,避免多线程访问共享资源时出现数据竞争。 基本语法 synchronized (lockObject) {// 需要加锁的代码…...

策略模式-小结
总结一下看到的策略模式: A:一个含有一个方法的接口 B:具体的实行方式行为1,2,3,实现上面的接口。 C:一个环境类(或者上下文类),形式可以是:工厂模式,构造器注入模式,枚举模式。 …...
【Stable Diffusion部署至Google Colab】
Google Colab 中快速搭建带 GPU 加速的 Stable Diffusion WebUI from google.colab import drive drive.mount(/content/drive) !mkdir /content/drive/MyDrive/sd-webui-files !pip install torch==1.13.1+cu116 torchvision==0.14.1+cu116 torchaudio==0.13.1 --extra-index…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...