【Ant Design of Vue】实现 message 组件可手动关闭

本文档介绍如何在AntDesignVue 1.7.8版本中实现手动关闭Message组件的功能。作者通过研究发现Message组件支持使用VNode作为内容,于是创建了一个包含关闭图标的VNode,并提供了详细的代码实现,最终成功实现了可手动关闭的Message组件。
摘要由CSDN通过智能技术生成

需求背景:

  • 老板希望 Message 组件能够手动触发关闭,但是项目使用的组件库是Ant Design of Vue(1.7.8)版本的,看了下高版本的也没有直接支持这个功能的属性。
  • 再去看了下 element-ui组件库,发现它是直接支持了的,心里顿时感觉:我去,什么垃圾Ant Design Vue
    在这里插入图片描述

解决方法

  • 但是吐槽归吐槽,问题还是得解决的,当时想的是手写一个message组件替换掉官方的,直到我看到了这个:
    在这里插入图片描述

  • 诶,好像有点东西,仔细研究一番,发现他是支持使用 VNode 作为显示内容,那只要返回一个带有关闭图标的 VNode 不就好了。

  • 最终代码实现:

// 封装到一个js文件里面,避免使用时代码累赘
import { message } from 'ant-design-vue';
/*
	h: 是content自带的参数,表示createElement
	content:文本内容
*/
const createElementVNode = (h, content) => {
  // 定义文本内容及样式(这里的样式延用的官方的)
  const innerText = h('span', { style: { color: '#4a5970', fontSize: '14px' } }, content);
  // 自定义关闭图标
  const innerIcon = h('a-icon', {
    style: {  marginLeft: '10px', color: '#ccc', cursor: 'pointer' },
    attrs: { type: 'close' },
    on: { click: () => message.destroy() },
  });
  // 合到一个 VNode 节点中
  const container = h('span', {}, [innerText, innerIcon]);
  // 最终返回
  return container;
};
// 由于 message 有多种状态,这里需要额外处理
const dtMessage = {};
// 给 dtMessage 循环赋值不同类型的 message函数
['error', 'success', 'info', 'warning', 'warn'].forEach((type) => {
  dtMessage[type] = (content, duration, onClose) => {
    // 处理 message[type](config) 参数为对象类型
    if (typeof content === 'object') {
      return message[type]({ ...content, content: h => createElementVNode(h, content?.content) });
    }
    return message[type](h => createElementVNode(h, content), duration, onClose);
  };
});

export default dtMessage;
  • 如果对createElementVNode中的参数h不熟悉的,可以参考官方文档 createElement 参数
  • 实际使用:
import message from '@/components/message/index.js'
message.success('这是可关闭的 message 组件')
  • 运行效果:

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗不甘坠落的流星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值