vue3.x全局$toast、$message、$loading等js插件
有时候我们需要使用一些类似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插件的更多相关文章
- H5页面基于iScroll.js插件实现下拉刷新,上拉加载更多
		前言 在我之前的项目中,页面总是干巴巴的,用户的体验不是特别完美,我也是一直觉得把设计师给到的psd做出来就好,很少考虑用户的感受.我喜欢看不同的App,操作每个步骤,观赏每个能和我互动的交互设计效果 ... 
- js插件---图片懒加载lazyload
		js插件---图片懒加载lazyload 一.总结 一句话总结:使用异常简单,src里面放加载的图片,data-original里面放原图片,不懂的位置去官网或者github找API就好. 1.laz ... 
- js插件---Amaze UI dialog如何使用
		js插件---Amaze UI dialog如何使用 一.总结 一句话总结:别人给你列出来的参考手册照着用先 1.在哪里去找插件参考资料或者使用手册(一般位置找不到的时候)? github上面啊,非常 ... 
- js插件---layer.js使用体验是怎样
		js插件---layer.js使用体验是怎样 一.总结 一句话总结:只有jquery和js,没有css,使用各种弹出层掉用各种函数特别方便,特别简单,特别好用. 引入只需要引入这两个,css都不需要, ... 
- js插件---jqGrid插件如何使用
		js插件---jqGrid插件如何使用 一.总结 一句话总结:jqdrid还是依赖加js初始化的方式,很多时候插件的问题一般都是引入的css和js的问题,jqgrid里面遇到的问题就是下载包有一些js ... 
- amazeui学习笔记--js插件(UI增强2)--按钮交互Button
		amazeui学习笔记--js插件(UI增强2)--按钮交互Button 一.总结 1.按钮loading状态: <button type="button" class=&q ... 
- 【jQuery小实例】js 插件 查看图片
		---本系列文章所用使用js均可在本博客文件中找到. 像淘宝一样,鼠标放在某一件商品上,展示大图信息,甚至查看图片的具体部位.给人超炫的效果,这种效果实现基于js文件和js插件.大致可以分为三步,添加 ... 
- 【PC端】jQuery+PHP实现浏览更多内容(jquery.more.js插件)
		参数说明: 'amount' : '10', //每次显示记录数 'address' : 'comments.php', //请求后台的地址 'format' : 'json', //数据传输格式 ' ... 
- chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]
		chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法,原文:http://bubuko.com/infodetail-328671.html 默认情况下如下图 Y轴并不是从0开始 ... 
随机推荐
- 剑指offer计划9(动态规划中等版)---java
			1.1.题目1 剑指 Offer 42. 连续子数组的最大和 1.2.解法 得到转移方程后,单次遍历. 当前面的连续子数组的和比较是否大于0,是则加起来, 若小于零,则当前的值就可当子数组的开头. 判 ... 
- java多线程同步的5种方法
			一.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常. 举个例子,如果一个银行账户同时被两个线程 ... 
- word域实现动态填充信息附件下载
			1.问题描述:在页面上一些下载附件功能,点击触发执行下载操作时候,有些电脑的浏览器可以,有些电脑的浏览器下载不了,电脑打开弹出的下载框下载的不是一个文件,而是一个如jspx后缀名的页面,jspx后缀是 ... 
- 获取office版本
			/// <summary> /// office版本 /// </summary> public enum OfficeVers ... 
- axios与vue-resource
			在Vue项目中前后端交互时,早期Vue使用Vue-resource实现异步请求.从Vue2.0之后就不再对vue-resource进行更新,Vue官方推荐使用axios. vue-resource V ... 
- JS预编译过程
			GO和AO 变量的预编译 实例1 console.log(a); var a=1; console.log(a); 实际编译过程: 将a存入预编译对象中,赋值为undefined: 真正的赋值语句当程 ... 
- Webpack的配置项
			Webpack配置选项  经历了考研以后,接下来的时间里准备捡起来这些以前学的东西,并且继续向着前端的方向出发,给自己多一条路的选择.话不多说,直接开始. moudule.exports = { / ... 
- sonar扫描java项目报错
			安装maven 配置path 验证maven,看到以下信息证明已经成功 扫描项目 扫描以下项目: kf-buss-nhgip-smartoffice-business-thirdparty 项目的配置 ... 
- Typescript, ES6
			* typescript 中文文档 https://www.tslang.cn/docs/home.html * ECMAScript 6 入门 http://es6.ruanyifeng.com/# ... 
- redis 与java的连接 和集群环境下Session管理
			redis 的安装与设置开机自启(https://www.cnblogs.com/zhulina-917/p/11746993.html) 第一步: a) 搭建环境 引入 jedis jar包 co ... 
