NoticeIcon通知菜单

用在导航工具栏上,作为整个产品统一的通知中心。

引用方式:

  1. import NoticeIcon from 'ant-design-pro/lib/NoticeIcon';

详细使用方式请参照:独立使用 pro 组件

代码演示

NoticeIcon 通知菜单 - 图1

通知图标

通常用在导航工具栏上。

  1. import NoticeIcon from 'ant-design-pro/lib/NoticeIcon';
  2. ReactDOM.render(<NoticeIcon count={5} />, mountNode);

NoticeIcon 通知菜单 - 图2

带浮层卡片

点击展开通知卡片,展现多种类型的通知,通常放在导航工具栏。

  1. import NoticeIcon from 'ant-design-pro/lib/NoticeIcon';
  2. import moment from 'moment';
  3. import groupBy from 'lodash/groupBy';
  4. import { Tag } from 'antd';
  5. const data = [{
  6. id: '000000001',
  7. avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
  8. title: '你收到了 14 份新周报',
  9. datetime: '2017-08-09',
  10. type: '通知',
  11. }, {
  12. id: '000000002',
  13. avatar: 'https://gw.alipayobjects.com/zos/rmsportal/OKJXDXrmkNshAMvwtvhu.png',
  14. title: '你推荐的 曲妮妮 已通过第三轮面试',
  15. datetime: '2017-08-08',
  16. type: '通知',
  17. }, {
  18. id: '000000003',
  19. avatar: 'https://gw.alipayobjects.com/zos/rmsportal/kISTdvpyTAhtGxpovNWd.png',
  20. title: '这种模板可以区分多种通知类型',
  21. datetime: '2017-08-07',
  22. read: true,
  23. type: '通知',
  24. }, {
  25. id: '000000004',
  26. avatar: 'https://gw.alipayobjects.com/zos/rmsportal/GvqBnKhFgObvnSGkDsje.png',
  27. title: '左侧图标用于区分不同的类型',
  28. datetime: '2017-08-07',
  29. type: '通知',
  30. }, {
  31. id: '000000005',
  32. avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
  33. title: '内容不要超过两行字,超出时自动截断',
  34. datetime: '2017-08-07',
  35. type: '通知',
  36. }, {
  37. id: '000000006',
  38. avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
  39. title: '曲丽丽 评论了你',
  40. description: '描述信息描述信息描述信息',
  41. datetime: '2017-08-07',
  42. type: '消息',
  43. }, {
  44. id: '000000007',
  45. avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
  46. title: '朱偏右 回复了你',
  47. description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
  48. datetime: '2017-08-07',
  49. type: '消息',
  50. }, {
  51. id: '000000008',
  52. avatar: 'https://gw.alipayobjects.com/zos/rmsportal/fcHMVNCjPOsbUGdEduuv.jpeg',
  53. title: '标题',
  54. description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
  55. datetime: '2017-08-07',
  56. type: '消息',
  57. }, {
  58. id: '000000009',
  59. title: '任务名称',
  60. description: '任务需要在 2017-01-12 20:00 前启动',
  61. extra: '未开始',
  62. status: 'todo',
  63. type: '待办',
  64. }, {
  65. id: '000000010',
  66. title: '第三方紧急代码变更',
  67. description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务',
  68. extra: '马上到期',
  69. status: 'urgent',
  70. type: '待办',
  71. }, {
  72. id: '000000011',
  73. title: '信息安全考试',
  74. description: '指派竹尔于 2017-01-09 前完成更新并发布',
  75. extra: '已耗时 8 天',
  76. status: 'doing',
  77. type: '待办',
  78. }, {
  79. id: '000000012',
  80. title: 'ABCD 版本发布',
  81. description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务',
  82. extra: '进行中',
  83. status: 'processing',
  84. type: '待办',
  85. }];
  86. function onItemClick(item, tabProps) {
  87. console.log(item, tabProps);
  88. }
  89. function onClear(tabTitle) {
  90. console.log(tabTitle);
  91. }
  92. function getNoticeData(notices) {
  93. if (notices.length === 0) {
  94. return {};
  95. }
  96. const newNotices = notices.map((notice) => {
  97. const newNotice = { ...notice };
  98. if (newNotice.datetime) {
  99. newNotice.datetime = moment(notice.datetime).fromNow();
  100. }
  101. // transform id to item key
  102. if (newNotice.id) {
  103. newNotice.key = newNotice.id;
  104. }
  105. if (newNotice.extra && newNotice.status) {
  106. const color = ({
  107. todo: '',
  108. processing: 'blue',
  109. urgent: 'red',
  110. doing: 'gold',
  111. })[newNotice.status];
  112. newNotice.extra = <Tag color={color} style={{ marginRight: 0 }}>{newNotice.extra}</Tag>;
  113. }
  114. return newNotice;
  115. });
  116. return groupBy(newNotices, 'type');
  117. }
  118. const noticeData = getNoticeData(data);
  119. ReactDOM.render(
  120. <div
  121. style={{
  122. textAlign: 'right',
  123. height: '64px',
  124. lineHeight: '64px',
  125. boxShadow: '0 1px 4px rgba(0,21,41,.12)',
  126. padding: '0 32px',
  127. width: '400px',
  128. }}
  129. >
  130. <NoticeIcon
  131. className="notice-icon"
  132. count={5}
  133. onItemClick={onItemClick}
  134. onClear={onClear}
  135. popupAlign={{ offset: [20, -16] }}
  136. >
  137. <NoticeIcon.Tab
  138. list={noticeData['通知']}
  139. title="通知"
  140. emptyText="你已查看所有通知"
  141. emptyImage="https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg"
  142. />
  143. <NoticeIcon.Tab
  144. list={noticeData['消息']}
  145. title="消息"
  146. emptyText="您已读完所有消息"
  147. emptyImage="https://gw.alipayobjects.com/zos/rmsportal/sAuJeJzSKbUmHfBQRzmZ.svg"
  148. />
  149. <NoticeIcon.Tab
  150. list={noticeData['待办']}
  151. title="待办"
  152. emptyText="你已完成所有待办"
  153. emptyImage="https://gw.alipayobjects.com/zos/rmsportal/HsIsxMZiWKrNUavQUXqx.svg"
  154. />
  155. </NoticeIcon>
  156. </div>
  157. , mountNode);

API

参数说明类型默认值
count图标上的消息总数number-
loading弹出卡片加载状态booleanfalse
onClear点击清空按钮的回调function(tabTitle)-
onItemClick点击列表项的回调function(item, tabProps)-
onTabChange切换页签的回调function(tabTitle)-
popupAlign弹出卡片的位置配置Object alignConfig-
onPopupVisibleChange弹出卡片显隐的回调function(visible)-
popupVisible控制弹层显隐boolean-
locale默认文案Object{ emptyText: '暂无数据', clear: '清空' }

NoticeIcon.Tab

参数说明类型默认值
title消息分类的页签标题string-
list列表数据,格式参照下表Array[]
emptyText针对每个 Tab 定制空数据文案ReactNode-
emptyImage针对每个 Tab 定制空数据图片string-

Tab data

参数说明类型默认值
avatar头像图片链接string-
title标题ReactNode-
description描述信息ReactNode-
datetime时间戳ReactNode-
extra额外信息,在列表项右上角ReactNode-