Vue 封装 message 插件

属性名类型属性值描述默认值
messageString消息提示文本“This is a message”
typeString“info”|“success”|“warn”|“error”消息类型“info”
iconClassString自定义提示文本前面的 icon 类“”
centerBooleantrue | false文本是否居中false
showCloseBooleantrue | false是否显示关闭按钮false
dangerouslyUseHTMLStringBooleantrue | falsemessage 属性是否支持 HTML 文本false
事件名描述返回值
closemessage 插件关闭后触发事件message DOM元素(this.$el)

代码如下:

vp-message.vue

<template>
  <div :class="['vp-message', `vp-message-${type}`, isCenter]">
    <span :class="['iconfont', `icon-${iconClass ? iconClass : type}`]"></span
    ><span v-if="!dangerouslyUseHTMLString">{{ message }}</span>
    <span v-if="dangerouslyUseHTMLString" v-html="message"></span>
    <span v-if="showClose" class="vp-message-close iconfont icon-clear_circle_outlined"
      @click="closeMsgHandle"></span>
  </div>
</template>

<script>
export default {
  name: "VpMessage",
  props: {
    message: {
      type: String,
      default: "",
    },
    type: {
      type: String, // "info"|"success"|"warn"|"error"
      default: "",
    },
    iconClass: {
      type: String,
    },
    center: {
      type: Boolean,
      default: false
    },
    showClose: {
      type: Boolean,
      default: false
    },
    dangerouslyUseHTMLString: {
      type: Boolean,
      default: false
    }
  },
  data() {
    return {
      timer: null,
    };
  },
  computed: {
    isCenter() {
      return this.center ? 'vp-message-center' : '';
    }
  },
  created() {},
  mounted() {
    this.timer = window.setTimeout(() => {
      this.$el.remove();
    }, 3000);
  },
  methods: {
    // 点击关闭 message
    closeMsgHandle() {
      this.$el.remove();
      this.$emit("close", this.$el);
    }
  },
  destroyed() {
    clearTimeout(timer);
    this.$emit("close", this.$el);
  },
};
</script>
<style scoped>
.vp-message {
  padding: 1rem 2rem;
  width: 250px;
  border-radius: 5px;
  transition: all 1s;
  position: fixed;
  top: 30px;
  left: 50%;
  transform: translateX(-50%);
  animation: animat 1s;
}
@keyframes animat {
  0% {
    top: -60px;
  }
  100% {
    top: 30px;
  }
}
.vp-message-info {
  background-color: #edf2fc;
  color: #909399;
}
.vp-message-success {
  background-color: #f0f9eb;
  color: #67c23a;
}
.vp-message-warn {
  background-color: #fdf6ec;
  color: #e6a23c;
}
.vp-message-error {
  background-color: #fef0f0;
  color: #f56c6c;
}
.iconfont {
  margin-right: 5px;
}
.vp-message-center {
  text-align: center;
}
.vp-message-close {
  cursor: pointer;
  position: absolute;
  left: 280px;
  top: 20px;
}
</style>

message.js 文件

import VpMessage from "./vp-message.vue";

const vpMessage = {};
vpMessage.install = Vue => {
  Vue.prototype.$message = function(option = {}) {
    let options = {
      message: (option && option.message) || "This is a message", // message 显示文本
      type: (option && option.type) || "info", // message 类型
      center: (option && option.center) || false, // 文本是否居中
      dangerouslyUseHTMLString:
        (option && option.dangerouslyUseHTMLString) || false, // 是否使用 HTML 文本
      showClose: (option && option.showClose) || false, // 是否显示关闭按钮
      iconClass: (option && option.iconClass) || "" // icon 类
    };

    let vpMessageInstance = Vue.extend(VpMessage);
    let messageEle = document.createElement("div");
    let vpmsg;
    Vue.nextTick(() => {
      vpmsg = new vpMessageInstance({
        propsData: {
          message: options.message,
          type: options.type,
          center: options.center,
          dangerouslyUseHTMLString: options.dangerouslyUseHTMLString,
          showClose: options.showClose,
          iconClass: options.iconClass
        }
      });
      vpmsg.$mount(messageEle);
      let el = vpmsg.$el;
      document.body.appendChild(el);
    });
  };
};

export default vpMessage;

main.js

import VpMessage from './components/message/message';
Vue.use(VpMessage);

如需要其他更多组件,请移步到本人开发的 Vue 组件库文档:Vpro_UI
如果觉得好的话,请在 Github 上点个 star ,非常感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值