使用Vue.extend将UI组件转为js组件,通过函数调用来创建组件

一、示例效果

封装一个loading效果,通过函数去调用

加载时创建DOM,加载完删除DOM

二、Loading的封装

1. components/Loading/index.vue

js 复制代码
<template>
  <div class="loader">
    <div class="loader-inner">
      <div class="loader-line-wrap">
        <div class="loader-line"></div>
      </div>
      <div class="loader-line-wrap">
        <div class="loader-line"></div>
      </div>
      <div class="loader-line-wrap">
        <div class="loader-line"></div>
      </div>
      <div class="loader-line-wrap">
        <div class="loader-line"></div>
      </div>
      <div class="loader-line-wrap">
        <div class="loader-line"></div>
      </div>
    </div>
  </div>
</template>

<style lang="less" scoped>
.loader {
  background: rgba(0, 0, 0, 0.2);
  bottom: 0;
  left: 0;
  overflow: hidden;
  position: fixed;
  right: 0;
  top: 0;
  z-index: 99999;
}
.loader-inner {
  bottom: 0;
  height: 60px;
  left: 0;
  margin: auto;
  position: absolute;
  right: 0;
  top: 0;
  width: 100px;
}
.loader-line-wrap {
  animation: spin 2000ms cubic-bezier(0.175, 0.885, 0.32, 1.275) infinite;
  box-sizing: border-box;
  height: 50px;
  left: 0;
  overflow: hidden;
  position: absolute;
  top: 0;
  transform-origin: 50% 100%;
  width: 100px;
}
.loader-line {
  border: 4px solid transparent;
  border-radius: 100%;
  box-sizing: border-box;
  height: 100px;
  left: 0;
  margin: 0 auto;
  position: absolute;
  right: 0;
  top: 0;
  width: 100px;
}
.loader-line-wrap:nth-child(1) {
  animation-delay: -50ms;
}
.loader-line-wrap:nth-child(2) {
  animation-delay: -100ms;
}
.loader-line-wrap:nth-child(3) {
  animation-delay: -150ms;
}
.loader-line-wrap:nth-child(4) {
  animation-delay: -200ms;
}
.loader-line-wrap:nth-child(5) {
  animation-delay: -250ms;
}
.loader-line-wrap:nth-child(1) .loader-line {
  border-color: hsl(0, 80%, 60%);
  height: 90px;
  width: 90px;
  top: 7px;
}
.loader-line-wrap:nth-child(2) .loader-line {
  border-color: hsl(60, 80%, 60%);
  height: 76px;
  width: 76px;
  top: 14px;
}
.loader-line-wrap:nth-child(3) .loader-line {
  border-color: hsl(120, 80%, 60%);
  height: 62px;
  width: 62px;
  top: 21px;
}
.loader-line-wrap:nth-child(4) .loader-line {
  border-color: hsl(180, 80%, 60%);
  height: 48px;
  width: 48px;
  top: 28px;
}
.loader-line-wrap:nth-child(5) .loader-line {
  border-color: hsl(240, 80%, 60%);
  height: 34px;
  width: 34px;
  top: 35px;
}
@keyframes spin {
  0%,
  15% {
    transform: rotate(0);
  }
  100% {
    transform: rotate(360deg);
  }
}
</style>

2. components/Loading/index.js

js 复制代码
import Vue from "vue";
import LoadingUI from "./index.vue";

const instance = () => {
  const JSloading = Vue.extend(LoadingUI);
  const loadingVm = new JSloading().$mount();
  return {
    show() {
      document.body.appendChild(loadingVm.$el);
    },
    hide() {
      loadingVm.$el.remove();
    }
  }
}
export default instance()

三、使用

1. 单文件引入使用

js 复制代码
import loading from "@/components/Loading";


    async getList() {
      try {
        loading.show();
        const res = await listApi1();
        console.log(res);
      } catch (err) {
        console.log(err);
      } finally {
        loading.hide();
      }
    }

2. 或者在main.js中进行全局注册

main.js

js 复制代码
import loading from "@/components/Loading";
Vue.prototype.$loading = loading

使用时不需要引入,直接通过this调用

js 复制代码
    async getList() {
      try {
        this.$loading.show();
        const res = await listApi1();
        console.log(res);
      } catch (err) {
        console.log(err);
      } finally {
        this.$loading.hide();
      }
    }

3. 也可以在axios拦截器中,给所有的接口都添加上loading

js 复制代码
import axios from 'axios'
import loading from "@/components/Loading";

const service = axios.create()

// request 拦截器
service.interceptors.request.use(
  config => {
    loading.show()
    return config
  },
  error => {
    loading.hide()
    return Promise.reject(error)
  }
)

// response 拦截器
service.interceptors.response.use(
  response => {
    loading.hide()
    return response.data.data
  },
  error => {
    loading.hide()
    return Promise.reject(error)
  }
)

export default service

类似的例子:www.cnblogs.com/wuqilang/p/...

相关推荐
fakaifa27 分钟前
【全开源】智慧共享农场源码独立版+uniapp前端
前端·uni-app·智慧农场·源码下载·智慧农场小程序·智慧共享农场
toooooop834 分钟前
uniapp多个页面监听?全局监听uni.$emit/$on
前端·javascript·uni-app
骨子里的偏爱35 分钟前
【案例】uniapp实现内部信息与外部的html网页双向通信的完整的过程,附加完整的代码部分
前端·uni-app·html
爱泡脚的鸡腿1 小时前
uni-app D4 实战(小兔鲜)
前端·vue.js·架构
星火飞码iFlyCode1 小时前
iFlyCode+SpecKit应用:照片等比智能压缩功能实现
前端·javascript
广白1 小时前
钉钉小程序直传文件到 阿里云OSS
前端·vue.js·uni-app
zyfts2 小时前
🔥告别 20 分钟等待!NestJS 生产级消息队列 BullMQ 实践指南
前端·后端
狗头大军之江苏分军2 小时前
【压力】一位一线炼钢工人的消失
前端·后端
拉不动的猪2 小时前
文件下载:后端配置、前端方式与进度监控
前端·javascript·浏览器
Amy_yang3 小时前
前端实现 Server-Sent Events 全解析:从代码到调试的实战指南
前端·uni-app