前端通知组件封装

背景

实现如上图效果:点击小铃铛,从右侧展示通知,点击其中一条跳,转到一个新页面;小铃铛数目减少;

实现 

index.vue

<template><el-drawerv-if="visible":visible.sync="visible":destroy-on-close="true":size="width"direction="rtl"custom-class="drawer__custom"@close="onClosed"><!-- 公告通知 --><template slot="title"><div class="header"><d2-icon-svg name="icon_status" /><span>{{ language == 'cn'? name : nameEn }}</span></div></template><!-- 工单内容 --><div class="content"><notice-contentv-if="noticeList && Object.keys(noticeList)":notices="noticeList"@viewDetail="onViewDetail"@loadMore="loadMore" /></div></el-drawer>
</template><script>
import { mapState } from 'vuex';
import NoticeContent from './NoticeContent.vue';
import { readNoticeService } from '@/api/notice';
import { updateMessageStatus, getUnreadMessageList } from '@/api/workOrder';export default {name: 'NoticeDrawer',components: { NoticeContent },data() {return {name: '通知',nameEn: 'Notification',visible: false,width: 480,pageNum: 1,pageSize: 5,currentViewNotice: {},noticeList: [],loadingInstance: null,};},computed: {...mapState('d2admin/profile', ['language']),...mapState('d2admin/user', ['info']),},methods: {open(list) {this.visible = true;this.noticeList = Object.assign([], list);},loadMore() {// 分页累加this.pageNum += 1;this.showLoading();getUnreadMessageList({ pageNum: this.pageNum, pageSize: this.pageSize }).then(response => {const { data } = response.data;const { rows } = data;this.noticeList = [...this.noticeList, ...rows];}).finally(() => {this.loadingInstance.close();});},onViewDetail(notice, idx) {// 未读状态下才更新文章状态// if (!notice.readFlag) {//   this.readNotice(notice.noticeNo);// }this.visible = false;const params = {formNo: notice.formNo,direction: 'T'};updateMessageStatus(params).then((response) => {const result = (response.data || {}).data || {};this.$emit('updateReadCount');const routePath = `/work-order/dialogue?formNo=${notice.formNo}`;window.open(this.$router.resolve(routePath).href, '_blank');});console.log(notice, 'notice, idxnotice, idx');},readNotice(noticeNo) {readNoticeService({ noticeNo, operator: this.info.name }).then(response => {// 文档已读,更新数据,把当前数据的readFlag置为已读this.noticeList = this.noticeList.map(item => {if (item.noticeNo === noticeNo) {item.readFlag = true;}return item;});});},showLoading() {this.loadingInstance = this.$loading({lock: true,text: 'Loading',spinner: 'el-icon-loading',background: 'rgba(256,256,256,.7)',target: document.querySelector('.content')});},onClosed() {this.visible = false;this.$emit('updateReadCount');Object.assign(this.$data, this.$options.data());},},
};
</script><style scoped lang="scss">
/deep/ .el-drawer {padding-right: 0 !important;.el-drawer__header {padding-right: 30px;}
}
.drawer__custom {.header {span {margin-left: 8px;}}.content {display: flex;//height: calc(100vh - 80px);}
}
</style>

 NoticeContent.vue

<template><div ref="notice" class="notice_wrapper" @scroll="onScrollNotice($event)"><divv-for="(notice, index) of notices":key="index":class="['notice_item', active === index ? 'active' : '']"@click="onViewDetails(notice, index)"><header class="header"><span class="date">{{$util.string.betterDisplay($util.datetime.formatUtcToZoneTime(notice.createTime))}}</span><el-tag v-if="!notice.readFlag" color="#FFB8BB">NEW</el-tag></header><div class="content"><div class="title">{{ language == 'cn'? name : nameEn }}:{{ notice.formNo }}</div><div v-if="notice.type == 'system_contact'" ref="content" class="message">{{ language == 'cn' ? parerFont(notice.content).cn : parerFont(notice.content).en }}</div><div v-else ref="content" class="message">{{ notice.content }}</div></div></div></div>
</template><script>
import { mapState } from 'vuex';export default {name: 'NoticeContent',props: {notices: {type: Array,default: () => [],required: true,},},data() {return {active: '',name: '工单单号',nameEn: 'Ticket Number'};},computed: {...mapState('d2admin/profile', ['language']),},methods: {onScrollNotice(evt) {const { scrollTop, offsetHeight, scrollHeight } = evt.target;// 滑到底部if ((scrollTop + offsetHeight) === scrollHeight) {this.$emit('loadMore');}},onViewDetails(notice, idx) {this.active = idx;this.$emit('viewDetail', notice);},parerFont(text) {return JSON.parse(text);}},
};
</script><style scoped lang="scss">
.notice_wrapper {width: 420px;height: calc(100vh - 80px);overflow-y: auto;padding-right:4px;margin-right: 26px;box-sizing: border-box;.notice_item {padding: 24px;min-height: 120px;border: 1px solid $color-neutral-light-100;border-radius: $common-radius_12;background-color: #ffffff;cursor: pointer;margin-bottom: 16px;&:hover {background-color: $color-neutral-light-50;}&.active {background-color: $color-active-100;}.header {display: flex;justify-content: space-between;align-items: center;.date {color: $color-neutral-light-400;font-size: 12px;font-weight: 400;line-height: 18px;}/deep/ .el-tag {color: #1a1c21;border-style: none;border-radius: 14px;font-size: 12px;line-height: 18px;padding: 2px 8px;height: 100%;}}.content {.title {margin: 14px 0 8px;color: $color-neutral-light-500;font-size: 16px;font-weight: 600;line-height: 24px;}.message {color: #727880;font-weight: 400;line-height: 21px;overflow: hidden;/* 溢出用省略号显示 */text-overflow: ellipsis;/* 作为弹性伸缩盒子模型显示 */display: -webkit-box;/* 设置伸缩盒子的子元素排列方式:从上到下垂直排列 */-webkit-box-orient:vertical;/* 显示的行数 */-webkit-line-clamp: 2;}}}
}
</style>

引入使用

 <notice-drawer ref="noticeDrawers" @updateReadCount="queryNoticeCountTotal" />import { getUnreadMessageList } from '@/api/workOrder';export default {name: 'WorkOrder',components: {NoticeDrawer,},data() {return {noticeTotal: 0,noticeList: [],};},created() {this.queryNoticeCountTotal();},methods: {queryNoticeCountTotal() {getUnreadMessageList({ pageSize: 5, pageNum: 1 }).then(response => {if (response.data) {const { data } = response.data;const { rows, total } = data;this.noticeList = rows;this.noticeTotal = total;}});},}}

接口

const hostType = 'BASIC_GATE';
export const getUnreadMessageList = (data = {}) => {const extraData = {hostType};return post('/myNotice/getUnreadMessageList', data, extraData);
};

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

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

相关文章

国产操作系统下Chrome的命令行使用 _ 统信 _ 麒麟

原文链接&#xff1a;国产操作系统下Chrome的命令行使用 | 统信 | 麒麟 Hello&#xff0c;大家好啊&#xff01;今天我们来聊聊如何在国产操作系统上使用命令行操作Google Chrome。无论是进行自动化测试、网页截图还是网页数据抓取&#xff0c;使用命令行操作Google Chrome都能…

线上3D博物馆搭建简单吗?有何优势?有哪些应用场景?

随着科技的飞速发展&#xff0c;传统的博物馆参观方式正在经历一场前所未有的变革&#xff0c;在科技的“加持”下&#xff0c;不少博物馆凭借强大的技术、创意和美学实践&#xff0c;频频“出圈”&#xff0c;线上3D博物馆逐渐崛起&#xff0c;这不仅丰富了人们的文化体验&…

【PDF技巧】PDF如何解密?

PDF文件设置了加密&#xff0c;需要密码才能够打开文件或者编辑文件&#xff0c;那么如何解密PDF密码&#xff1f;今天我们来一起学习一下。 首先是在已知密码的情况下&#xff0c;PDF文件中的打开密码或者是限制编辑&#xff0c;想要解密PDF密码&#xff0c;我们只需要在PDF编…

(Java面试题——基础版)JVM、JRE和JDK的关系

JVM Java Virtual Machine是Java虚拟机 &#xff0c;Java程序需要运行在虚拟机上 &#xff0c;不同的平台有自己的虚拟机 &#xff0c;因此Java语言可以 实现跨平台。JVM 负责将 Java 字节码&#xff08;即编译后的 .class 文件&#xff09;翻译成特定平台上的机器码&#xff0…

python与anaconda 的对应关系

不能下载好anaconda 后才能知道python吧 python10。2023年3月 python11 2023年7月 具体请看官方说明 Anaconda 2023.09-0 — Anaconda documentation 示例如下&#xff0c;绿色框&#xff0c;有的在包的列表中搜python就可以找到

嵌入式文件系统

嵌入式文件系统 文件系统简介 在计算机系统中&#xff0c; 需要用到大量的程序和数据&#xff0c; 它们大部分以文件的形式存放在外部存储当中&#xff0c; 根据需要可随时调入内存使用 如果用户直接管理外存文件所面临的问题&#xff1a; 必须熟悉外存的物理特性了解各种存…

永磁同步电机的脉振高频注入无速度传感器simulink仿真模型

整理了永磁同步电机的脉振高频注入无速度传感器simulink仿真模型&#xff0c;该模型高频注入仿真pmsm&#xff0c;无感控制&#xff0c;解决0速转矩输出问题&#xff0c;插入式永磁同步电机&#xff0c;凸极&#xff0c;高频注入。MATLAB/simulink仿真&#xff0c;适合研究学习…

近几年上门按摩市场为何如此火爆,有哪些功能?

近几年上门预约推拿按摩市场为何如此火爆&#xff0c;这个融合了休闲、保健与养生的行业&#xff0c;其消费频率高且受众广泛&#xff0c;不受任何限制。 而在按摩服务类系统平台中&#xff0c;小程序以其轻便与易用性脱颖而出。用户只需轻松一扫&#xff0c;便能迅速进入应用&…

【初阶数据结构】栈

目录 栈的概念及结构栈的实现栈的结构栈的初始化栈的销毁入栈出栈取栈顶元素判断栈是否为空取栈中元素个数代码测试 完整代码Stack.hStack.ctest.c 栈的概念及结构 栈&#xff1a;是一种特殊的线性表&#xff0c;它只允许在固定的一端进行插入和删除元素的操作。   栈顶&…

Elasticsearch:向量相似度技术和评分

作者&#xff1a;来自 Elastic Valentin Crettaz 当需要搜索自由文本并且 CtrlF / CmdF 不再有效时&#xff0c;使用词法搜索引擎通常是你想到的下一个合理选择。 词汇搜索引擎擅长分析要搜索的文本并将其标记为可在搜索时匹配的术语&#xff0c;但在理解和理解被索引和搜索的…

TN3399(rk3399)开发板安装ubuntu 22.04

先安装20.04 从20.04升级到22.04后&#xff0c;没有声音驱动了&#xff0c;但是显示支持高清了 声音加个usb声卡就行,5块钱

x264 帧类型代价计算原理:slicetype_frame_cost 函数分析

slicetype_frame_cost 函数 函数功能 这个函数的核心是计算编码一系列帧(从 p0 到p1,以 b 为当前帧)的代价 cost,并根据这个代价 cost来辅助帧类型决策。它考虑了运动搜索的结果、帧间和帧内预测的成本,并且可以并行处理以提高效率。该函数在帧类型决策、MBtree 分析、场…