Loading自定义指令

2023-10-31

Loading自定义指令

相关知识查看官方文档:自定义指令)

一、介绍

通过v-loading指令的方式为某个Dom添加Loading动画。如在发送请求时,请求还在响应时某个Dom需要的请求数据还未获取到,此时Dom内容为空,可以通过添加Loading动画解决暂时的Dom空白的问题。
全局注册之后就可以直接通过v-loading的方式添加loading加载动画。

二、自定义指令及使用

1.创建loading组件

<template>
  <div class="loading">
    <div class="loading-content">
      <img src="./loading.gif" width="24" height="24" alt="" />
      <p class="desc">{{ title }}</p>
    </div>
  </div>
</template>

<script setup></script>
<script>
export default {
  data() {
    return {
      title: "正在输入...",
    };
  },
  methods: {
    setTitle(title) {
      this.title = title;
    },
  },
};
</script>

<style lang="less" scoped>
.loading {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  .loading-content {
    text-align: center;
    .desc {
      line-height: 20px;
      font-size: 12px;
      color: black;
    }
  }
}
.g-relative {
  position: relative;
}
</style>

2.自定义指令

import { createApp } from 'vue'
import Loading from './loading.vue'

// g-realtive为一个calssName,定义在全局中,仅有属性position:relative这一个
const relativeCls = 'g-relative'

const loadingDirective = {
    // el:指令绑定到的元素。这可以用于直接操作 DOM。
    mounted(el, binding) {
        const app = createApp(Loading)
        const instance = app.mount(document.createElement('div'))
        // 保存instance后面还会多次使用
        el.instance = instance
        // 添加文字
        const title = binding.arg
        if (typeof title !== 'undefined') {
            // setTitle方位为组件loding中的方法,注意这里的setTitle不能写在setup语法糖中,可能会找不到
            instance.setTitle(title)
        }
        // 如果为binding.value为真,将loading组件挂在到el上
        if (binding.value) {
            append(el)
        }
    },
    updated(el, binding) {
        const title = binding.arg
        if (typeof title !== 'undefined') {
            // setTitle方位为组件loding中的方法
            el.instance.setTitle(title)
        }
        if (binding.value !== binding.oldValue) {
            binding.value ? append(el) : remove(el)
        }
    }
}

// 添加loading
function append(el) {
    // 优化loading让更具通用性。loading组将使用了position:absolute
    const style = getComputedStyle(el)
    // 如果不是以下三个中的一个,添加新的className,添加属性position:relative
    if (['absolute', 'fixed', 'relative'].indexOf(style.position) === -1) {
        // 添加样式
        addClass(el, relativeCls)
    }
    // appendChild方法可向节点的子节点列表的末尾添加新的子节点
    el.appendChild(el.instance.$el)
    // 注意这里的el和el.instance.$el不是同一个,el为需要绑定到的节点,el.instance.$el为loading组件
}
// 移除loading
function remove(el) {
    // 移除样式
    removeClass(el, relativeCls)
    el.removeChild(el.instance.$el)
}
// 添加className
function addClass(el, className) {
    // classList.contains(X):查看元素是否存在类名为x的类
    if (!el.classList.contains(className)) {
        el.classList.add(className)
    }
}
function removeClass(el, className) {
    el.classList.remove(className)
}

export default loadingDirective

3.main.js中全局注册

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
// 全局样式
import './assets/css/global.css'

// 引入自定义指令
import loadingDirective from '@/components/base-ui/loading/directive'

createApp(App).use(store).use(router).directive('loading', loadingDirective).mount('#app')

4.使用

<template>
  <!-- v-loading:[loadingText] 动态指令参数 -->
  <div class="div" v-loading:[loadingText]="isShow"></div>
</template>
<script setup>
import { ref } from "vue";

// import Loading from "@/components/base-ui/loading/loading.vue";
let isShow = ref(true);
setTimeout(() => {
  isShow.value = false;
}, 3000);
let loadingText = "正在加载...";
</script>
<style lang="less">
.div {
  width: 100px;
  height: 100px;
  background-color: red;
}
</style>

三、结果演示

  • 正常情况下:

在这里插入图片描述

  • 没有判断是否添加g-relative时:

在这里插入图片描述

  • 目录结构
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Loading自定义指令 的相关文章

随机推荐

  • style对象和less/scss互相转换,驼峰转中横线,支持嵌套转换

    不知道有没有小伙伴在维护或重构前端项目时修改样式的时候遇到js style和less scss需要互相转换的问题 本人找网上没有比较完善的转换工具 要么嵌套不支持 要么兼容不好 于是自己写了一个 请大家参考 emotion style In
  • CSDN英雄大会之 SOA技术观感

    5号假装英雄去北京参加了CSDN技术英雄大会 见到了很多一直想见的同行高手还有编辑记者 这里就不一一列举了 只是从SOA中间件开发角度列一下相关的内容 1 IBM如下划分SOA与构件 SOA4类关键构件 基础构件WAS MQ 流程构件WPS
  • 设置一个FreemarkerExceptionHandler捕获freemarker页面上的异常

    在Freemarker页面中如果使用 userName 并且userName为空 那么Freemarker页面就会崩掉 需要设置默认值 userName 来避免对象为空的错误 同理 user userName 也应该写成这样 user us
  • WaveOut播放声音死锁问题原因

    1 首先我们复习下造成死锁的几个充要条件 1 互斥 互斥资源 只能被一个进程使用 2 不剥夺 非抢占式调度 不能强行抢用其他进程资源 3 请求和保持 占有着资源不释放 同时申请其他资源 4 环路等待 没什么可说的 在WaveOutReset
  • java.lang.IncompatibleClassChangeError: Found interface org.elasticsearch.common.bytes.BytesReferenc

    项目场景 再学谷粒商城时 练习elasticsearch时出现一下错误 问题描述 原因分析 提示 出现java lang IncompatibleClassChangeError Found interface org elasticsea
  • redis 由浅入深之 redis.conf配置文件

    是否以后台进程运行 默认为no 如果需要以后台进程运行则改为yes daemonize no 如果以后台进程运行的话 就需要指定pid 你可以在此自定义redis pid文件的位置 pidfile var run redis pid 接受连
  • 2021-04-09

    C 实现XN 2图灵机模拟 算法分析 代码实现 算法分析 1 首先需要完成数的进制转换 将二进制数转化成十进制数 如何转化呢 这里采用除二取余的方法 这种方法就是不断得到余数 放进数组arr 最后除以颠倒一下就行了 2 转换成拓展二进制编码
  • Leetcode刷题-522最长特殊序列II

    题目描述 给定字符串列表 strs 返回它们中最长的特殊序列 如果最长特殊序列不存在 返回 1 最长特殊序列定义 该序列为某字符串独有的最长子序列 即不能是其他字符串的子序列 s 的子序列可以通过删去字符串 s 中的某些字符实现 来源 力扣
  • 灰色预测原理及实例(附代码)

    灰色预测 引言 古人说 凡事预则立 不预则废 办任何事情之前 必须先调查研究 摸清情况 深思熟虑 有科学的预见 周密的计划 这样才能达到预期的成功 所谓预测 就是人们根据可获得的历史和现实数据 资料 运用一定的科学方法和手段 对人类社会 政
  • CSS文本设置超出2行显示省略号

    需求 如图所示 当居住地址字段太长超过2行时就显示 1 强制一行so easy div class line style 内容部分内容部分内容 div line white space nowrap 强制一行显示 overflow hidd
  • 快速入门

    之前正运动技术与大家分享了 运动控制器的固件升级 ZBasic程序开发 ZPLC程序开发 与触摸屏通讯和输入 输出IO的应用 运动控制器数据与存储的应用 运动控制器ZCAN EtherCAT总线的使用 示波器的应用 多任务运行的特点 运动控
  • 【Linux】echo命令用法详解

    作者 柒号华仔 个人主页 欢迎访问我的主页 个人信条 星光不问赶路人 岁月不负有心人 个人方向 专注于5G领域 同时兼顾其他网络协议 编解码协议 C C linux等 感兴趣的小伙伴可以关注我 一起交流 目录 1 echo命令介绍 2 命令
  • 【Linux】——makefile

    文章目录 1 什么是makefile 2 makefile优势与make命令 3 makefile文件内容 3 1makefile文件的基础写法 3 2 makefile文件的优化 1 什么是makefile 在一个大型工程中 工程中的源文
  • 构建Python,Raspberry Pi和PostgreSQL数据服务器

    视频教程 PostgreSQL初学者 学习Raspberry Pi Linux初学者指南 在Raspberry Pi安装和设置PostgreSQL 前提 下载Raspbian 格式化SD卡 使用Disk Utility在macOS中格式化S
  • 自制番茄钟脚本

    Shell脚本 bin bash i 0 if 1 then t 25 60 else t 5 60 fi while i lt t do sleep 1 i 1 m t i 60 s t m 60 i echo en m s r done
  • parsing XML document from class path resource [applicationContext.xml]…

    方法 1 可能是缺失了resource文件 项目右键 Build Path Configure Build Path Java Build Path source Add Folder 将Resource添加应用 2 可能缺失了spring
  • SqliLab_Mysql_Injection详解_字符型注入(五)_时间盲注(8~10)

    文章目录 1 SqliLab Mysql Injection详解 字符型注入 五 1 1 SQL注入 时间盲注 1 1 1 原理 1 1 2 常用的函数 2 SqliLab关卡 包含8 9 10 图片占据空间太大 payload具体返回情况
  • [从零学习汇编语言] - 模块化程序设计

    文章目录 前言 回顾 一 模块化程序设计 1 1 子程序 1 2 子程序的参数和返回值 1 3 批量数据的传递 1 4 寄存器的冲突处理 结语 前言 点赞再看 养成习惯 回顾 还记得我们之前讲过的ret指令搭配call指令实现的子程序模板吗
  • SpringCache通过注解实现redis缓存

    1 SpringCache介绍 2 SpringCache常用注解 底层是基于map实现的 缺点 重启后数据就不存在了 在Spring Cache使用方式中将底层实现替换成了redis缓存技术 1 CachePut 参考演示 CachePu
  • Loading自定义指令

    目录 Loading自定义指令 一 介绍 二 自定义指令及使用 1 创建loading组件 2 自定义指令 3 main js中全局注册 4 使用 三 结果演示 Loading自定义指令 相关知识查看官方文档 自定义指令 一 介绍 通过v