Vue.extend、message消息提示

前言

努力学习的小白一枚,如果有什么错误的地方,麻烦留言指正。

Vue 2.x

推荐文章:Vue.extend()实现MessageBox弹窗

起因
在使用element 的message组件时,产生了个疑问,正常使用组件都是通过import的形式引入到页面中,然后通过props进行属性的传递。但是通过函数调用就感觉很特别,看完了上面的文章,有了一些自己的理解。

效果

在这里插入图片描述

代码

  • 组件代码
<template>
  <div class="message-container">
    <transition name="fade">
      <div
        v-if="visible"
        class="message"
        :style="{ background: messageBackground[type] }"
      >
        <img class="icon" :src="icon[type]" />
        <div>{{ message }}</div>
      </div>
    </transition>
  </div>
</template>

<script>
export default {
  data() {
    return {
      icon: {
        success: require("../../assets/ok.jpeg"),
        info: require("../../assets/warning.jpeg"),
      },
      messageBackground: {
        success: "#F0F9EB",
        info: "#909399",
      },
      type: "success",
      visible: false,
      message: "11",
    };
  },
  mounted() {},
  methods: {
  },
};
</script>

<style scoped>
.icon {
  width: 20px;
  height: 20px;
  margin: 0 20px;
}
.message-container {
  display: flex;
  justify-content: center;
  margin-top: 3%;
}
.message-container .message {
  display: flex;
  align-items: center;
  width: 300px;
  min-height: 40px;
  border: 1px solid #fafafa;
  border-radius: 10px;
}
.fade-enter-active,
.fade-leave-active {
  transition: opacity 2s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>
  • js代码
import Main from "./main.vue";

export default function(Vue) {
  //继承基础信息
  let MessageConstructor = Vue.extend(Main);
  //创建实例
  let Instance = new MessageConstructor();
  //手动挂载实例
  Instance.$mount();
  document.body.appendChild(Instance.$el);

  Vue.prototype.$message = ({ type, message }) => {
    //打开消息
    Instance.visible = true;
    //设置类型
    Instance.type = type;
    //设置信息
    Instance.message = message;
    //关闭
    setTimeout(() => {
      Instance.visible = false;
      //console.log("关闭了");
      document.body.removeChild(Instance.$el);
    }, 2000);
  };
}

使用

  • 全局引用
//全局引入消息
import MessageBox from "./message/src/main.js";

Vue.config.productionTip = false;

Vue.use(MessageBox);
  • 使用
<template>
  <div id="app">
    <Button @click="openMessage">打开</Button>
  </div>
</template>

<script>
export default {
  name: "App",
  components: {},
  methods: {
    openMessage() {
      this.$message({
        type: "success",
        message: "哈哈哈",
      });
    },
  },
};
</script>

个人理解

上面那种写法确实有些难理解,但是如果是下面这种形式呢

<message ref="messageRef"></message>

openMessage(){
  this.$refs.messageRef.type='success'
  ...
}
  //继承基础信息
  let MessageConstructor = Vue.extend(Main);
  //创建实例
  let Instance = new MessageConstructor();

这两句跟refs基本上是一个作用,无非是将ref的这些操作写在了一个方法了,通过方法传参来实现了赋值
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无知的小菜鸡

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

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

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

打赏作者

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

抵扣说明:

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

余额充值