视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
用Vue.extend构建消息提示组件的方法实例
2020-11-27 22:33:00 责编:小采
文档

前提

前段时间自己做的vue练手项目,需要一个通用的消息提示组件,但是消息提示这种组件我更想用方法来调用,而不是在各个页面上都添加个组件(那样感觉很麻烦,重度懒癌患者),于是就上网差查了查,并研究了ElementUI的message源码。自己弄出来一个简陋的消息提示组件

Vue.extend是什么

按照官方文档说法,他是一个类构造器,用来创建一个子类vue并返回构造函数,而Vue.component它的任务是将给定的构造函数与字符串ID相关联,以便Vue.js可以在模板中接收它。
了解了这点之后我们开始做我们的消息提示组件吧。

消息提示组件

首先我们先创建我们的提示组件的模板

<template>
 <transition name="message-fade">
 <div class="message" v-show="show">
 <span class="icon"><icon name="info"></icon></span>
 <p>{{message}}</p>
 </div>
 </transition>
</template>

<script>
 export default {
 name: 'v-message',
 mounted(){
 this.StartTime();
 },
 data(){
 return {
 message: '123',
 show: false,
 timer: null
 }
 },
 methods:{
 StartTime(){
 this.show = true;
 if(this.timer){
 clearTimeOut(this.timer)
 }else{
 this.timer = setTimeout(()=>{
 this.show = false
 }, 3000);
 }
 }
 }
 }
</script>

之后我们需要用将message.vue传到Vue.extend()里

import Vue from 'vue';
let MessageBox = Vue.extend(require('./message.vue'));
let instance;
var message = function(options){
 if(typeof options === 'string'){
 options = {
 message: options
 }
 }
 //生成组件
 instance = new MessageBox({
 data: options
 })
 //组件需要挂载在dom元素上
 instance.vm = instance.$mount();
 //根据不同的类型,设置不同消息的背景颜色
 if(options.type){
 instance.vm.$el.children[0].className += ` icon__${options.type}`;
 }
 document.body.appendChild(instance.vm.$el);
 return instance.vm;
}

const type = ['success', 'info', 'warning', 'error'];
type.forEach((type)=>{
 message[type] = options =>{
 if(typeof options === 'string'){
 options = {
 message: options
 }
 }
 options.type = type;
 return message(options);
 }
})

export default message;

之后用挂在全局方法上,之后用this.$message()方法调用

vue.prototype.$message = message;

最后的效果图

下载本文
显示全文
专题