有时候我们需要使用一些类似toast,messge、loading这些跟js交互很频繁的插件,vue3.x这类插件的定义跟vue2.x插件稍大,而且相对变得复杂了一点点。

第一种、需要时创建,用完移除

这种做法相对损耗性能,当一些显示隐藏频率不是特别高的插件可以如此封装。

1、新建loading.vue文件

<template>
<div class="loading">
加载中...
</div>
</template> <script>
export default {
name: "loading",
}
</script> <style scoped>
.loading {
position: fixed;
left: 50%;
top: 50%;
background-color: rgba(0, 0, 0, 0.2);
color: white;
transform: translate(-50%, -50%);
border-radius: 4px;
padding: 8px 10px;
}
</style>

2、同级目录新建index.js文件

import { createApp } from "vue"

import Loading from './loading.vue'

export default {
instance: null,
parent: null,
times: 0,
// 为了保证多个同时loading的时候,只显示一个,并且需要全部close之后才消失
open() {
if (this.times == 0) {
this.instance = createApp(Loading)
this.parent = document.createElement("div")
let appDom = document.getElementById('app')
appDom.appendChild(this.parent)
this.instance.mount(this.parent)
}
this.times ++
},
close() {
this.times --
if (this.times <= 0) {
this.times = 0
let appDom = document.getElementById('app')
this.instance.unmount(this.parent)
appDom.removeChild(this.parent)
}
}
};

3、插件全局引入

import loading from '@/components/loading/index'
app.config.globalProperties.$loading = loading;

当然步骤2可以抛出install函数,然后main.js里面用use来全局载入。这样使用会导致我们不能使用this的地方不太好调用loading。

4、组件内使用

this.$loading.open()
setTimeout(() => {
this.$loading.close()
}, 2000)

第二种,一直存在,只控制显示隐藏

1、新建loading.vue文件

<template>
<div class="loading" v-show="visible">
加载中...
</div>
</template> <script>
export default {
name: "loading",
data() {
return {
visible: false
};
},
methods: {
show() {
this.visible = true
},
hide() {
this.visible = false
}
}
}
</script> <style scoped>
.loading {
position: fixed;
left: 50%;
top: 50%;
background-color: rgba(0, 0, 0, 0.2);
color: white;
transform: translate(-50%, -50%);
border-radius: 4px;
padding: 8px 10px;
}
</style>

2、同级目录新建index.js文件

import { createApp } from "vue"

import Loading from './loading.vue'

export default {
loading: null,
install(Vue) {
if (this.loading) {
// 防止多次载入
Vue.config.globalProperties.$loading = this.loading;
return ;
}
let instance = createApp(Loading);
let parent = document.createElement("div")
let bodyDom = document.body
// 这里需要注意,大概率app还没有mount,导致获取不到app节点,所以想挂载到app上,需要保证app已经创建。
bodyDom.appendChild(parent)
this.loading = instance.mount(parent) Vue.config.globalProperties.$loading = this.loading;
}
};

3、插件全局引入

import Loading from '@/components/loading/index'
app.use(Loading)

4、组件内使用

this.$loading.show()
setTimeout(() => {
this.$loading.hide()
}, 2000)

vue3.x全局$toast、$message、$loading等js插件的更多相关文章

  1. H5页面基于iScroll.js插件实现下拉刷新,上拉加载更多

    前言 在我之前的项目中,页面总是干巴巴的,用户的体验不是特别完美,我也是一直觉得把设计师给到的psd做出来就好,很少考虑用户的感受.我喜欢看不同的App,操作每个步骤,观赏每个能和我互动的交互设计效果 ...

  2. js插件---图片懒加载lazyload

    js插件---图片懒加载lazyload 一.总结 一句话总结:使用异常简单,src里面放加载的图片,data-original里面放原图片,不懂的位置去官网或者github找API就好. 1.laz ...

  3. js插件---Amaze UI dialog如何使用

    js插件---Amaze UI dialog如何使用 一.总结 一句话总结:别人给你列出来的参考手册照着用先 1.在哪里去找插件参考资料或者使用手册(一般位置找不到的时候)? github上面啊,非常 ...

  4. js插件---layer.js使用体验是怎样

    js插件---layer.js使用体验是怎样 一.总结 一句话总结:只有jquery和js,没有css,使用各种弹出层掉用各种函数特别方便,特别简单,特别好用. 引入只需要引入这两个,css都不需要, ...

  5. js插件---jqGrid插件如何使用

    js插件---jqGrid插件如何使用 一.总结 一句话总结:jqdrid还是依赖加js初始化的方式,很多时候插件的问题一般都是引入的css和js的问题,jqgrid里面遇到的问题就是下载包有一些js ...

  6. amazeui学习笔记--js插件(UI增强2)--按钮交互Button

    amazeui学习笔记--js插件(UI增强2)--按钮交互Button 一.总结 1.按钮loading状态: <button type="button" class=&q ...

  7. 【jQuery小实例】js 插件 查看图片

    ---本系列文章所用使用js均可在本博客文件中找到. 像淘宝一样,鼠标放在某一件商品上,展示大图信息,甚至查看图片的具体部位.给人超炫的效果,这种效果实现基于js文件和js插件.大致可以分为三步,添加 ...

  8. 【PC端】jQuery+PHP实现浏览更多内容(jquery.more.js插件)

    参数说明: 'amount' : '10', //每次显示记录数 'address' : 'comments.php', //请求后台的地址 'format' : 'json', //数据传输格式 ' ...

  9. chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]

    chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法,原文:http://bubuko.com/infodetail-328671.html 默认情况下如下图 Y轴并不是从0开始 ...

随机推荐

  1. Java最大栈深度有多大?-从一道面试题开始学习JVM

    一.问题:Java最大支持栈深度有多大? 1.分析 有JVM的内存结构我们可知: 随着线程栈的大小越大,能够支持越多的方法调用,也即是能够存储更多的栈帧: 局部变量表内容越多,那么栈帧就越大,栈深度就 ...

  2. Appium自动化(16) - 使用手机浏览器进行自动化测试

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 前面我都讲的都是针对 app ...

  3. CSS001. 纯CSS实现瀑布流(纵向排序)

    通过 Multi-columns 相关的属性 column-count.column-gap 配合 break-inside 来实现瀑布流布局. 首先对包裹图片的盒子增加样式,column-count ...

  4. Linux-实战常用命令

    目录 关机/重启/注销 系统信息和性能查看 磁盘和分区 ⽤户和⽤户组 ⽹络和进程管理 常⻅系统服务命令 ⽂件和⽬录操作 ⽂件查看和处理 打包和解压 RPM包管理命令 YUM包管理命令 DPKG包管理命 ...

  5. java版gRPC实战之三:服务端流

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. Java基础之代理模式

    代理模式是常见的设计模式之一,意图在为指定对象提供一种代理以控制对这个对象的访问.Java中的代理分为动态代理和静态代理,动态代理在Java中的应用比较广泛,比如Spring的AOP实现.远程RPC调 ...

  7. 大数据最后一公里——2021年五大开源数据可视化BI方案对比

    个人非常喜欢这种说法,最后一公里不是说目标全部达成,而是把整个路程从头到尾走了一遍. 大数据在经过前几年的野蛮生长以后,开始与数据中台的概念一同向着更实际的方向落地.有人问,数据可视化是不是等同于数据 ...

  8. supermvc介绍

    马上要开始写毕设了,需要一个合适的框架.想想自己用过的几个框框speedphp tp啊 还有公司的 dagger啊 ,大同小易.每一种都有自己喜欢的地方.然后想到了二八理论,我们常用的功能可能不到框架 ...

  9. CentOS8安装ntp实现时间同步

    在CentOS8.0中默认不再支持ntp软件包,时间同步将由chrony来实现,像我这种习惯了ntp同步时间的,一时难以去适应chrony. 本文将通过wlnmp提供的源,来安装ntp服务 添加wln ...

  10. ✔PHP文件包含漏洞全面总结

    我的另一篇博客总结的不够全面,但依然有借鉴价值:https://www.cnblogs.com/Zeker62/p/15192610.html 目录 文件包含的定义 文件包含漏洞常见函数 文件包含漏洞 ...