ElementUI通知功能Notification和MessageBox踩坑

本文介绍如何通过Vue的通知组件自定义样式及DOM结构。通过不使用scope并利用customClass属性,实现样式覆盖;同时借助Vue的createElement方法创建自定义DOM元素。
1.样式修改

很多小伙伴会发现,不管是less种的**/deep/还是scss**中的::v-deep都无法直接修改以上两种功能的底层样式,导致无法修改样式的原因在这里,关键字——scope

在这里插入图片描述

那么如何修改样式?

新建style标签,不要给style添加scope,利用官方文档中的customClass属性,给Notification 加上类名,保证组件样式唯一,配合内置的类型即可进行样式修改。
样式的修改多样化,既可以通过添加class类名进行修改,也可以直接在style对象中直接添加样式。
完整代码在最下面。

在这里插入图片描述

2.调用方法以及DOM结构修改

利用Vue中的createElement 参数进行DOM元素的创建。

直接上完整版代码。

<template>
  <div class="contain"></div>
</template>
<script>
export default {
  data() {
    return {
      notifyArr: [],
      Data: [{ content: 'QQQQQ' }],
    };
  },
  created() {
    this.messageNotice();
  },
  methods: {
    messageNotice() {
      const ele = this.$createElement;
      this.Data.forEach((item) => {
        let notifySolo = this.$notify({
          title: '系统维护公告',
          message: ele(
            'div',
            {
              style: 'width: 100%;height:180px; position: relative;',
            },
            [
              ele(
                'div',
                {
                  class: 'notifyContent',
                },
                item.content
              ),
              ele(
                'el-button',
                {
                  class: 'notifyButton',
                  type: 'primary',
                  on: {
                    click: this.iKnowHandler,
                  },
                },
                '知道了'
              ),
            ]
          ),
          duration: 0,
          customClass: 'notify',
          position: 'bottom-right',
          showClose: false,
        });
        this.notifyArr.push(notifySolo);
      });
    },
    iKnowHandler() {
      this.notifyArr[0].close();
    },
  },
};
</script>

<style lang="less" scoped></style>
<style lang="scss">
// ::v-deep .el-notification.right {
//   padding: 0;
// }
// 提醒样式
.notify {
  background: #32353b;
  border: 1px solid #313d4f;
  border-radius: 4px;
  width: 370px;
  padding: 0;
  .notifyContent {
    font-size: 14px;
    color: #ffffff;
    width: 370px;
    height: 60px;
    padding: 24px;
  }
  .notifyButton {
    background: #4880ff;
    border-radius: 4px;
    width: 92px;
    height: 38px;
    color: #ffffff;
    position: absolute;
    right: 0px;
    bottom: 0px;
    margin: 24px;
    border: none;
  }
  .el-notification__group {
    margin-left: 0;
    .el-notification__title {
      font-size: 18px;
      color: #ffffff;
      height: 60px;
      width: 100%;
      display: flex;
      align-items: center;
      padding: 0 24px;
      border-bottom: 1px solid #636971;
    }
  }
}
</style>

上面这个组件适合新手即插即用。

注:给on添加方法时,不能给方法名加()。

ElementUI 的 `Notification` 组件提供了一种灵活的方式来展示全局的通知消息。当通知不自动关闭时,可能会导致通知堆积在界面上,影响用户体验。为了解决这个问题,可以通过以下方式进行优化处理: ### 设置自动关闭 `Notification` 提供了 `duration` 属性来控制通知的显示时间。默认情况下,通知会在 4500 毫秒后自动关闭。如果希望调整这个时间,可以在调用 `this.$notify` 时传入自定义的 `duration` 值。 ```javascript this.$notify({ title: '提示', message: '这是一条将在2秒后自动关闭的通知', duration: 2000 // 单位为毫秒 }); ``` 如果希望通知一直显示直到用户手动关闭,则可以将 `duration` 设置为 `0`。但需要注意的是,在这种情况下,必须确保提供了关闭按钮(默认是开启的),否则通知将无法被关闭[^1]。 ### 通知过多时的优化处理方法 1. **限制最大通知数量** ElementUI 的 `Notification` 默认没有限制同时显示的通知数量。为了避免通知堆积,可以通过封装 `Notification` 组件并维护一个通知队列的方式实现限制最大显示数量的功能。当超过设定的最大值时,可以选择不显示新的通知或者替换掉最早的通知。 2. **使用唯一标识避免重复通知** 可以通过 `customClass` 或者内部状态管理工具(如 Vuex)为每一种类型的通知分配唯一的标识符。在新通知触发时,先检查是否存在相同标识的通知正在显示;若存在,则更新其内容或重置其倒计时,而不是创建新的通知。 3. **优化通知样式交互** 对于频繁出现的通知,可以考虑简化其样式,减少视觉干扰。例如,仅保留必要的标题信息,并且确保关闭按钮始终可见。此外,也可以添加点击通知外部区域关闭的功能,提升用户的操作体验。 4. **采用Toast替代方案** 如果应用场景中需要大量短暂存在的通知,可以考虑使用更轻量级的 Toast 组件作为替代。与 `Notification` 不同,Toast 通常只在屏幕中央显示一条简短的信息,并且会自动消失,更适合用来处理大量的即时反馈场景。 通过以上方法,可以根据具体需求对 `Notification` 进行配置优化,从而有效解决通知不自动关闭导致的通知堆积问题。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值