Vue插件开发的一些总结

1. 前言

以前在封装的全局公共组件时使用到了installVue.use()方法,后来看一篇文章才知道这两个方法是用来开发插件的。刚好最近也有开发插件的需求,就从官方文档上看了看教程。然后自己鼓捣了一个,记录一下流程。

2. 如何开发,使用插件

Vue官方文档是这样写的

plugins.jpg

不知道大家怎么看,反正我第一次看的是一脸懵逼。完全不知道从哪里开始。网上找了不少的文档,最后自己试着封装了一个插件,又去查阅了对应api才弄明白到底是怎么回事。

3. toast插件封装

封装一个web后台的toast弹窗。可以设置弹窗的类型,文本和显示时间。

3-1. 效果图

success.jpg
error.jpg
loading.jpg

4. 封装插件

4. 结构代码

4-1. 弹窗component代码:

  1. 因为是单独的提示弹窗,所以封装成elementmessage弹窗模式。首先先搭建出弹窗的主体和样式。
<!-- 全局的大黑屏提示插件 -->
<template>
  <transition name="el-fade-in">
    <div
      class="wrap"
      v-if="show"
      @click="closeWrap"
    >
      <!-- 失败 -->
      <div
        class="error_text"
        v-if="tipsType === 'error'"
      >
        <i class="el-icon-error tips_icon"></i>
        <span>{{ tipsText }}</span>
      </div>
      <!-- 成功 -->
      <div
        class="success_text"
        v-if="tipsType === 'success'"
      >
        <i class="el-icon-success tips_icon"></i>
        <span>{{ tipsText }}</span>
      </div>
      <!-- 加载 -->
      <div
        class="loading_text"
        v-if="tipsType === 'loading'"
      >
        <i class="el-icon-loading tips_icon"></i>
        <span>{{ tipsText }}</span>
      </div>
    </div>
  </transition>
</template>
<style
  type="text/less"
  lang="less"
  scoped
>
.wrap {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  overflow: hidden;
  margin: 0;
  background-color: rgba(0, 0, 0, 0.6);
  z-index: 99999999999;
}

.error_text, .success_text, .loading_text{
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
  min-width: 380px;
  height: 50px;
  line-height: 50px;
  border-radius: 5px;
  font-size: 14px;
}

.error_text {
  background-color: #FBDEDE;
  color: #F56C6C;
}

.success_text {
  background-color: #F0FAEB;
  color: #67C33A;
}

.loading_text {
  background-color: #ECF5FF;
  color: #409EFF;
}

.tips_icon {
  font-size: 15px;
  margin: 2px 20px 0;
}
</style>
  1. 分三种类型的弹窗,成功失败加载类型的弹窗。3data分别控制显示文本以及类型。除去加载类型的弹窗,其他两种类型弹窗都可以通过点击遮罩关闭。
<script>
/**
 *
 * @components 黑窗提示模板
 * @author csz 2020/07/23
 *
 */
export default {
  name: "ToastComponent",
  data() {
    return {
      show: false,
      tipsType: "error",
      tipsText: "提示"
    };
  },
  methods: {
    // 点击页面任何地方关闭黑窗
    closeWrap() {
      if (this.tipsType === "loading") {
        return;
      }
      this.show = false;
    }
  }
};
</script>

4-2. 注册插件toast代码:

有了基础的模板后,我们开始注册对应的插件

import ToastComponent from "./toast.vue";

const Toast = {};

// 注册Toast
Toast.install = (Vue) => {
  // 生成Vue Toast组件的构造器
  const ToastConstructor = Vue.extend(ToastComponent);
  // 生成一个Toast组件的实例
  const instance = new ToastConstructor();

  // 将这个实例通过DOM API 把它插入文档中
  instance.$mount();
  document.body.appendChild(instance.$el);

  // 通过Vue的原型注册一个方法
  // 让所有实例共享这个方法
  Vue.prototype.$toast = (message, options = {
    type: "error",
    duration: 3000
  }) => {
    // 设置相关参数
    instance.tipsText = message;
    instance.tipsType = options.type;
    instance.show = true;
    if (options.duration !== 0) {
      // 定时关闭
      let timer = setTimeout(() => {
        clearTimeout(timer);
        instance.show = false;
      }, options.duration);
    }
    // 加载的弹窗需要异步关闭,所一return出close方法关闭弹窗
    return {
      close() {
        instance.show = false;
      }
    };
  };
};

export default Toast;

4-3. 方法详解

  1. extend方法
    extend方法是Vue 的基础构造器。类似于commponent方法,也是传入一个vue的实例对象,与之不同的是extend方法会生成一个传入的Vue实例对象的构造器,再通过这个构造器实例化对象就可以访问传入的vue实例的属性和方法了。
  2. $mount方法

官方文档如下图

mount.jpg

很显然在上述代码中instance生成的时候它处于“未挂载”状态的,所以我们必须通过 $mount把他挂载到指定的元素或者通过DOM API插入文档中。我这里使用的是通过DOM API插入文档中。

4.4 注册和使用方式

  1. Vue的原型上绑定对应的$toast方法,设置默认的options参数和处理方法。
  2. main.js引入toast.js
// 引入封装的黑屏遮罩插件
import Toast from './plugin/toast/toast.js';
// 应用引入的相关插件和组件
Vue.use(Toast);
// 页面中调用 需要手动关闭
this.$toast("我是加载弹窗", {
   type: "loading",
   duration: 0
});

开发这个插件的主要目的还是弄懂插件的开发流程,增强自己对vue的理解。开发插件的方法一共有4种,目前我这个是通过添加 Vue实例方法,通过把它们添加到 Vue.prototype上实现。

后面我也会出其它开发插件方法的文章。如果觉得喜欢可以点个赞~。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355