首页 > 建站教程 > 前端框架 >  vue3封装一个轻量的全局提示插件正文

vue3封装一个轻量的全局提示插件

我爱模板网再做一个小项目,不想使用element plus、antd这种重量级框架,但是又觉得element plus的提示插件很美观,于是就自己动手封装了一个轻量级的,不依赖任何插件的toat提示插件。


先看下插件效果:

vue3 toast

插件npm地址:https://www.npmjs.com/package/hxz-light-toast?activeTab=readme


封装流程:


1、Vue CLI创建项目,项目名叫:hxz-light-toast

vue create hxz-light-toast


2、修改文件夹

将src文件夹重命名为test,用来测试插件,并且复制一份src文件夹,用来编写插件,删除src/App.vue。


3、修改package.json中的scripts如下:

"scripts": {
  "test": "vue-cli-service serve test/main.js",
  "build": "vue-cli-service build --target lib --name index src/main.js"
},


其中test脚本是配置测试demo的启动,与正常的 vue 项目启动一致,只是修改了一下路径跟脚本名。因为是开发的一个插件,打包时不能像普通vue项目一样打包成应用,而是要打包成库。Vue脚手架(Vue CLI)可以直接打包库,命令如下:

vue-cli-service build --target lib --name myLib [entry]


4、在src的components下新建hxz-light-toast.vue:

<template>
  <Transition name='fade'>
    <div v-if="isShow" :class="['message', tipType]">{{ tipText }}</div>
  </Transition>
</template>
<script setup>
import { ref, defineExpose } from 'vue';
const isShow = ref(false)
const tipText = ref('默认提示内容')
const tipType = ref('info')
const show = (str, type = 'info', time = 2000) => {
  tipText.value = str
  tipType.value = type
  isShow.value = true
  setTimeout(() => {
    isShow.value = false
  }, time);
}
const hide = () => isShow.value = false
defineExpose({
  show,
  hide
})
</script>
<style scoped>
.message {
  background: #edf2fc url('../assets/icon-info.png') no-repeat 20px center/14px 14px;
  color: #909399;
  border: 1px solid #ebeef5;
  height: 40px;
  line-height: 38px;
  padding: 0 20px 0 45px;
  border-radius: 5px;
  position: fixed;
  top: 25px;
  left: 50%;
  transform: translate(-50%, 0);
  font-size: 14px;
  z-index: 200000;
}
.message.info{
  background-color: #edf2fc;
  background-image: url('../assets/icon-info.png');
  color: #909399;
  border: 1px solid #ebeef5;
}
.message.success{
  background-color: #f0f9eb;
  background-image: url('../assets/icon-success.png');
  color: #67c23a;
  border: 1px solid #e1f3d8;
}
.message.error{
  background-color: #fef0f0;
  background-image: url('../assets/icon-error.png');
  color: #f56c6c;
  border: 1px solid #fde2e2;
}
.message.warning{
  background-color: #fdf6ec;
  background-image: url('../assets/icon-warning.png');
  color: #e6a23c;
  border: 1px solid #faecd8;
}
.fade-enter-from{
  opacity: 0;
  transform:translate(-50%, -100px)
}
.fade-enter-active{
  transition: all 500ms linear;
}
.fade-enter-to{
  opacity: 1;
  transform: translate(-50%, 0)
}
.fade-leave-from{
  opacity: 1;
  transform: translate(-50%, 0)
}
.fade-leave-active{
  transition: all 500ms linear;
}
.fade-leave-to{
  opacity: 0;
  transform:translate(-50%, -100px)
}
</style>


5、在src/main.js导出插件:

import { createVNode, render } from 'vue'
import Toast from './hxz-light-toast.vue'
export default {
  install(app) {
    // 将组件转换为虚拟DOM
    const Vnode = createVNode(Toast)
    // 将虚拟DOM挂载到页面节点上
    render(Vnode, document.body)
    // 将插件的主要方法挂载到 app.config.globalProperties 上,这里的 $toast 是自定义的
    app.config.globalProperties.$toast = {
      // 这里仅挂载了一个 show 方法到 $toast 上
      show(str, time) {
        Vnode.component?.exposed?.show(str, time)
      },
    }
  },
}


上面的代码解释的很清楚了,这里不再多说。


6、测试插件

在test的App.vue配置如下代码来测试插件:

<template>
  <div></div>
</template>
<script>
export default {
  name: 'App',
  created() {
    this.$toast.show('这是一条消息提示')
  }
}
</script>


运行,没有问题,效果见文章开头的图片

至此,插件就封装好了。


打包发布见:编写一个vue3插件并发布它