Vue3 加载条(LoadingBar)
效果如下图:在线预览

APIs
LoadingBar
| 参数 | 说明 | 类型 | 默认值 | 必传 |
|---|---|---|---|---|
| containerClass | 加载条容器的类名 | string | undefined | false |
| containerStyle | 加载条容器的样式 | CSSProperties | {} | false |
| loadingBarSize | 加载条大小,单位 px | number | 2 | false |
| colorLoading | 加载中颜色 | string | ‘#1677ff’ | false |
| colorFinish | 加载完成颜色 | string | ‘#1677ff’ | false |
| colorError | 加载错误颜色 | string | ‘#ff4d4f’ | false |
| to | 加载条的挂载位置,可选:元素标签名(例如 body)或者元素本身 | string | HTMLElement | ‘body’ | false |
Methods
| 名称 | 说明 | 类型 |
|---|---|---|
| start | 开始加载的回调函数 | (from = 0, to = 80) => void |
| finish | 结束加载的回调函数 | () => void |
| error | 出现错误的回调函数 | () => void |
创建加载条组件LoadingBar.vue
<script setup lang="ts">
import { ref, nextTick } from 'vue'
import type { CSSProperties } from 'vue'
interface Props {containerClass?: string // 加载条容器的类名containerStyle?: CSSProperties // 加载条容器的样式loadingBarSize?: number // 加载条大小,单位 pxcolorLoading?: string // 加载中颜色colorFinish?: string // 加载完成颜色colorError?: string // 加载错误颜色to?: string | HTMLElement // 加载条的挂载位置,可选:元素标签名(例如 body)或者元素本身
}
withDefaults(defineProps<Props>(), {containerClass: undefined,containerStyle: () => ({}),loadingBarSize: 2,colorLoading: '#1677ff',colorFinish: '#1677ff',colorError: '#ff4d4f',to: 'body'
})
const showLoadingBar = ref(false)
const loadingBarRef = ref() // 加载条 DOM 引用
const loadingStarted = ref(false) // 加载条是否开始
const loadingFinishing = ref(false) // 加载条是否完成
const loadingErroring = ref(false) // 加载条是否报错
async function init() {showLoadingBar.value = falseloadingFinishing.value = falseloadingErroring.value = false
}
async function start(from = 0, to = 80, status: 'starting' | 'error' = 'starting') {// 加载条开始加载的回调函数loadingStarted.value = trueawait init()if (loadingFinishing.value) {return}showLoadingBar.value = trueawait nextTick()if (!loadingBarRef.value) {return}loadingBarRef.value.style.transition = 'none' // 禁用过渡loadingBarRef.value.style.maxWidth = `${from}%`void loadingBarRef.value.offsetWidth // 触发浏览器回流(重排)loadingBarRef.value.className = `loading-bar loading-bar-${status}`loadingBarRef.value.style.transition = ''loadingBarRef.value.style.maxWidth = `${to}%`
}
async function finish() {// 加载条结束加载的回调函数if (loadingFinishing.value || loadingErroring.value) {return}if (loadingStarted.value) {await nextTick()}loadingFinishing.value = trueif (!loadingBarRef.value) {return}loadingBarRef.value.className = 'loading-bar loading-bar-finishing'loadingBarRef.value.style.maxWidth = '100%'void loadingBarRef.value.offsetWidth // 触发浏览器回流(重排)showLoadingBar.value = false
}
function error() {// 加载条出现错误的回调函数if (loadingFinishing.value || loadingErroring.value) {return}if (!showLoadingBar.value) {void start(100, 100, 'error').then(() => {loadingErroring.value = true})} else {loadingErroring.value = trueif (!loadingBarRef.value) {return}loadingBarRef.value.className = 'loading-bar loading-bar-error'loadingBarRef.value.style.maxWidth = '100%'void loadingBarRef.value.offsetWidthshowLoadingBar.value = false}
}
function onAfterEnter() {if (loadingErroring.value) {showLoadingBar.value = false}
}
async function onAfterLeave() {await init()
}
defineExpose({start,finish,error
})
</script>
<template><Teleport :disabled="!to" :to="to"><Transition name="fade-in" @after-enter="onAfterEnter" @after-leave="onAfterLeave"><div v-show="showLoadingBar" class="m-loading-bar-container" :class="containerClass" :style="containerStyle"><divref="loadingBarRef"class="loading-bar":style="`--loading-bar-size: ${loadingBarSize}px; --color-loading: ${colorLoading}; --color-finish: ${colorFinish}; --color-error: ${colorError}; max-width: 100%;`"></div></div></Transition></Teleport>
</template>
<style lang="less" scoped>
.fade-in-enter-active {transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.fade-in-leave-active {transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
}
.fade-in-enter-from,
.fade-in-leave-to {opacity: 0;
}
.m-loading-bar-container {z-index: 9999;position: fixed;top: 0;left: 0;right: 0;height: var(--loading-bar-size);.loading-bar {width: 100%;transition:max-width 4s linear,background 0.2s linear;height: var(--loading-bar-size);border-radius: var(--loading-bar-size);}.loading-bar-starting {background: var(--color-loading);}.loading-bar-finishing {background: var(--color-finish);transition:max-width 0.2s linear,background 0.2s linear;}.loading-bar-error {background: var(--color-error);transition:max-width 0.2s linear,background 0.2s linear;}
}
</style>
其中引入使用了以下组件:
- Vue3间距(Space)
- Vue3按钮(Button)
在要使用的页面引入
<script setup lang="ts">
import LoadingBar from './LoadingBar.vue'
import { ref } from 'vue'
const loadingBar = ref()
const disabled = ref(true)
const localCardRef = ref()
const localLoadingBar = ref()
const customLoadingBar = ref()
function handleStart() {loadingBar.value.start()disabled.value = false
}
function handleFinish() {loadingBar.value.finish()disabled.value = true
}
function handleError() {disabled.value = trueloadingBar.value.error()
}
</script>
<template><div><h1>{{ $route.name }} {{ $route.meta.title }}</h1><h2 class="mt30 mb10">基本使用</h2><Space><Button type="primary" @click="handleStart">开始</Button><Button :disabled="disabled" @click="handleFinish">结束</Button><Button type="danger" @click="handleError">报个错</Button></Space><LoadingBar ref="loadingBar" /><h2 class="mt30 mb10">局部加载条</h2><div class="m-container" ref="localCardRef"><Space><Button type="primary" @click="localLoadingBar.start()">Start</Button><Button @click="localLoadingBar.finish()">Finish</Button><Button type="danger" @click="localLoadingBar.error()">Error</Button></Space></div><LoadingBar ref="localLoadingBar" :container-style="{ position: 'absolute' }" :to="localCardRef" /><h2 class="mt30 mb10">自定义加载条样式</h2><Space><Button type="primary" @click="customLoadingBar.start()">Start</Button><Button @click="customLoadingBar.finish()">Finish</Button><Button type="danger" @click="customLoadingBar.error()">Error</Button></Space><LoadingBarref="customLoadingBar":loading-bar-size="5"color-loading="#2db7f5"color-finish="#52c41a"color-error="magenta"/></div>
</template>
<style lang="less" scoped>
.m-container {position: relative;display: flex;align-items: center;height: 200px;padding: 16px 24px;border: 1px solid #d9d9d9;
}
</style>
相关文章:
Vue3 加载条(LoadingBar)
效果如下图:在线预览 APIs LoadingBar 参数说明类型默认值必传containerClass加载条容器的类名stringundefinedfalsecontainerStyle加载条容器的样式CSSProperties{}falseloadingBarSize加载条大小,单位 pxnumber2falsecolorLoading加载中颜色string‘…...
《CSS创意项目实战指南》:点亮网页,从实战中掌握CSS的无限创意
CSS创意项目实战指南 在数字时代,网页不仅是信息的载体,更是艺术与技术的融合体。通过CSS,你可以将平凡的网页转变为引人入胜的视觉盛宴,让用户体验跃升至全新高度。《CSS创意项目实战指南》正是这样一本引领你探索CSS无限可能的…...
[FBCTF2019]RCEService (PCRE回溯绕过和%a0换行绕过)
json格式输入ls出现index.php 这道题原本是给了源码的,BUUCTF没给 源码: <?phpputenv(PATH/home/rceservice/jail);if (isset($_REQUEST[cmd])) {$json $_REQUEST[cmd];if (!is_string($json)) {echo Hacking attempt detected<br/><br/…...
vue3后台管理系统 vue3+vite+pinia+element-plus+axios上
前言 项目安装与启动 使用vite作为项目脚手架 # pnpm pnpm create vite my-vue-app --template vue安装相应依赖 # sass pnpm i sass # vue-router pnpm i vue-router # element-plus pnpm i element-plus # element-plus/icon pnpm i element-plus/icons-vue安装element-…...
Mysql的事务隔离级别实现原理
一、事务隔离级别 mysql支持四种事务隔离级别: 读未提交:一个事务可以读取到另一个事务还未提交的数据;读已提交:一个事务可以读取到另一个事务已经提交的数据;可重复读:同一个事务中,无论读取…...
计算机体系结构:缓存一致性ESI
集中式缓存处理器结构(SMP) 不同核访问存储器时间相同。 分布式缓存处理器结构(NUMA) 共享存储器按模块分散在各处理器附近,处理器访问本地存储器和远程存储器的延迟不同,共享数据可进入处理器私有高速缓存…...
log4j2漏洞练习(未完成)
log4j2 是Apache的一个java日志框架,我们借助它进行日志相关操作管理,然而在2021年末log4j2爆出了远程代码执行漏洞,属于严重等级的漏洞。apache log4j通过定义每一条日志信息的级别能够更加细致地控制日志生成地过程,受影响的版本…...
常见网络攻击方法原理、应用场景和防御方法(一)
目录 1、SQL注入(SQL Injection)原理应用场景防御方法 2、跨站脚本攻击(XSS,Cross-Site Scripting)原理应用场景防御方法 3、跨站请求伪造(CSRF,Cross-Site Request Forgery)原理应用场景防御方法 4、文件上传漏洞原理应用场景防御方法 5、远程代码执行(…...
【leetcode十分钟】覆盖所有点的最少矩形数目(C++思路详解)
思路详解: 0. 题目情境并未限制矩形高度,故矩形数目的判断只和点的横坐标有关 1. 为了不重不漏地考虑到所有点,故笔者选择首先将二维数组中的点按横坐标的大小排序 //说明:本来笔者以为需要自定义sort排序,后来发现…...
【Vue3】默认插槽
【Vue3】默认插槽 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本文内…...
华清day4 24-7-31
1> 使用父子进程完成两个文件的拷贝 父进程拷贝前一半内容,子进程拷贝后一半内容 子进程结束后退出,父进程回收子进程的资源 /* 使用父子进程完成两个文件的拷贝父进程拷贝前一半内容,子进程拷贝后一半内容 子进程结束后退出ÿ…...
搜维尔科技:Manus VR数据手套-适用于机器人、人工智能和机器学习解决方案
在劳动力短缺和工作环境日益严峻的今天,机器人技术正成为解决这些复杂问题的关键。MANUS™ 手指捕捉技术,结合先进的量子追踪技术,为机器人的精确操作和远程控制提供了准确且先进的解决方案。 技术亮点 实时数据捕捉:通过Quantum…...
知识文库杂志知识文库杂志社知识文库编辑部2024年第12期目录
文艺理论 现代高校书院对中国传统书院学术精神的汲取与转化 李奥楠;时新洁; 1-4 个案工作介入高中美术艺考生及家长心理调适的应用研究 魏星; 5-8《知识文库》投稿:cn7kantougao163.com 中华优秀传统文化视角下高校美育课程实践教学 李丛丛; 9-12 基…...
【Linux网络编程】套接字Socket
网络编程基础概念: ip地址和端口号 ip地址是网络协议地址(4字节32位,形式:xxx.xxx.xxx.xxx xxx在范围[0, 255]内),是IP协议提供的一种统一的地址格式,每台主机的ip地址不同,一个…...
es之must、filter、must_not、should
文章目录 概述mustfiltermust_notshouldmust和filter的区别 概述 在Elasticsearch中,布尔查询(bool query)是构建复杂查询的基本工具。它允许你组合多个查询子句,每个子句可以使用不同的逻辑操作符。常见的逻辑操作符包括 must、…...
RocketMQ消息发送基本示例(推送消费者)
消息生产者通过三种方式发送消息 1.同步发送:等待消息返回后再继续进行下面的操作 同步发送保证了消息的可靠性,适用于关键业务场景。 2.异步发送:不等待消息返回直接进入后续流程.broker将结果返回后调用callback函数,并使用 CountDownLatch计数 3.单向发送:只…...
23 MySQL基本函数、分组查询、多列排序(3)
上一篇「22 B端产品经理与MySQL基本查询、排序(2)」了解了基本的常识和基本查询以及单列排序。下面介绍常见的基本函数、分组查询以及多列排序: 基本函数 user表 (注:以下SQL语句示例全部基于下面「user表」) uidunamedepiduag…...
PHP与SEO,应用curl库获取百度下拉关键词案例!
编程语言从来都是工具,编程逻辑思维才是最重要的,在限定的规则内,实现自己的想法,正如人生一样! 不管是python还是php只要掌握了基础语法规则,明确了实现过程,都能达到想要实现的结果࿰…...
MySQL:子查询
MySQL 子查询 MySQL中的子查询是一个强大的功能,子查询是指在一个查询语句中嵌套另一个查询语句的情况。嵌套查询中的内部查询语句可以使用外部查询语句的结果来进行过滤、联接或作为子查询的值,它允许我们在一个查询内部嵌套另一个查询。通过子查询可以…...
C++—— IO流
一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf()和printf()。 scanf():从标准输入设备(键盘)中读取数据,并将值存放在变量中。 printf():将指定的文字/字符串输出到标准输出设备(…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
