• vue3 自定义loading


    使用antdv 后发现只有button支持loaidng属性,而其他元素不能使用loading来显示是否加载中,需要套一层 a-spin 才能支持,非常不方便。

    所以写了个自定义的指令来进行处理

    新建loading.vue文件用来页面显示

    <template>
      <div class="loading-container">
        <LoadingOutlined />
        <p>{{ state.loading.text }}p>
      div>
    template>
    <script lang="ts" setup>
    import { LoadingOutlined } from '@ant-design/icons-vue';
    import { reactive } from 'vue';
    const FONT_SIZE = {
      samll: {
        icon: '16px',
        p: '12px'
      },
      default: {
        icon: '20px',
        p: '16px'
      },
      large: {
        icon: '24px',
        p: '20px'
      }
    }
    const state = reactive({
      loading: {
        text: '正在加载中',
        fontSize: {
          icon: '20px',
          p: '16px'
        }
      } as { text?: string; fontSize?: { icon: string; p: string } }
    })
    
    
    
    function updateInfo(params: { text: string; size: 'samll' | 'default' | 'large' }) {
      state.loading = {
        text: params.text,
        fontSize: FONT_SIZE[params.size]
      }
    }
    
    defineExpose({ updateInfo })
    
    script>
    <style lang="scss" scoped>
    .loading-container {
      position: absolute;
      left: 0;
      top: 0;
      height: 100%;
      width: 100%;
      overflow: hidden;
      background: rgba($color: #ffffff, $alpha: 0.7);
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
      font-size: 16px;
      color: #335dfd;
      z-index: 999999;
    
      :deep(.anticon-loading) {
        font-size: 20px;
      }
    
      p {
        margin-top: 10px;
        font-size: 16px;
      }
    }
    style>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    在新建个loading.ts 用来注册v-loading 相关操作

    import { createApp, Directive } from 'vue';
    import Loading from './index.vue';
    /**
     * @description 判断是否为空对象
     * **/
    export const isEmptyObj = (obj: object): boolean => {
      return JSON.stringify(obj) === "{}";
    };
    
    
    /** v-eLoading:[loadingConfig]="state.l||state.a */
    const loading: Directive = {
      mounted(el, binding) {
        const app = createApp(Loading);
        const instance = app.mount(document.createElement('div')) as any;
        el.instance = instance;
        el.style.position = 'relative';
        const arg:any = binding.arg
        if (!isEmptyObj(arg as any)){
          const params = {
            text:arg?.text||'正在加载中',
            size:'default'
          }
          instance.updateInfo(params)
        }
          if (binding.value) {
            appendEl(el);
          }
      },
      updated(el, binding) {
        console.log(binding.value !== binding.oldValue)
        if (binding.value !== binding.oldValue) {
          binding.value ? appendEl(el) : removeEl(el);
        }
      },
    };
    
    const appendEl = (el: { appendChild: (arg0: any) => void; instance: { $el: any; }; }) => {
      el.appendChild(el.instance.$el);
    };
    
    const removeEl = (el: { removeChild: (arg0: any) => void; instance: { $el: any; }; }) => {
      el.removeChild(el.instance.$el);
    };
    
    export default loading;
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    最后在main.ts 进行注册

    import loadingDirective from 'packages\Loading\index.ts'
    createApp(App).directive('loading', loadingDirective).mount('#app')
    
    • 1
    • 2

    在页面中就可以直接进行v-loading 进行使用了

    <div v-loading="true">div>
    
    • 1
  • 相关阅读:
    U3D游戏开发中使用框架与UGUI+JSON配置文件的代码思路
    go-cqhttp调用接口
    【mybatis3】MyBatis源码分析
    unity中绑定动画的行为系统
    基于xv6的类Uinx操作系统实现
    消息对话框
    Qt 自定义event
    Windows电脑部署Jellyfin服务端并进行远程访问配置详细教程
    框架好坏 评判的标准
    C 标准库 - <string.h>
  • 原文地址:https://blog.csdn.net/shibaweijin/article/details/134245259