工具类-useLoading

news2024/11/30 14:53:49

useLoading

一个管理 loading 状态的工具。

执行 useLoading 返回:

  • loading: 一个 ComputedRef<boolean> 类型的变量,代表当前的 loading 状态
  • executor:执行器,用于执行需要 loading 的函数
  • closeLoading:用于手动关闭 loading
import { computed, ref } from 'vue';

// 执行函数类型
type ExecFunc<P extends Array<any> = any[], T = any> = (...args: P) => Promise<T>;
// 执行函数参数
type ExecFuncParams<P extends Array<any> = any[]> = Parameters<ExecFunc<P>>;

/**
 * loading 状态管理
 * 自动管理函数执行的 loading 状态
 */
export function useLoading() {
  // 记录当前 loading 的数量
  const loadingCount = ref(0);
  const loading = computed(() => loadingCount.value > 0);

  const setLoading = (value: boolean) => {
    loadingCount.value = value ? loadingCount.value + 1 : Math.max(loadingCount.value - 1, 0);
  };

  /**
   * 执行器, 执行传入的函数, 并自动管理 loading 状态
   */
  const executor = async <P extends Array<any> = any[], T = any>(
    execFunc: ExecFunc<P, T>,
    ...args: ExecFuncParams<P>
  ): Promise<T> => {
    setLoading(true);
    try {
      const result = await execFunc(...args);
      return result;
    } finally {
      // 在 finally 中执行, 确保无论成功还是失败都会关闭 loading
      setLoading(false);
    }
  };

  /**
   * 手动关闭所有 loading
   */
  const closeLoading = () => {
    loadingCount.value = 0;
  };

  return { loading, executor, closeLoading };
}

ExecFunc 是执行函数的类型,使用泛型 P 表示执行函数的参数,泛型 T 表示执行函数的返回值。

使用示例

script

const func = async (name: string, age: number) => {
  await Promise.resolve();
  return { name, age }; 
}

const { loading, executor, closeLoading } = useLoading();

const handleLoading = async () => {
  const res = await executor(func, 'eno', 18);
  console.log(res); // {name: 'eno', age: 18}
}

template

<template>
  <div v-loading="loading" style="width: 100px; height: 100px"></div>
  <a-button @click="handleLoading()">loading</a-button>
  <a-button @click="closeLoading()">close loading</a-button>
</template>

为什么要使用 loadingCount 记录 loading 数量

useLoading 主要用于解决多次执行一个需要 loading 的函数时,先完成的函数会取消掉其他函数 loading 状态的问题

如果我们不用 loadingCount

function useLoading() {
  const loading = ref(false);

  // 执行器, 执行传入的函数, 并自动管理 loading 状态
  const executor = async <P extends Array<any> = any[], T = any>(
    execFunc: ExecFunc<P, T>,
    ...args: ExecFuncParams<P>
  ): Promise<T> => {
    loading.value = true;
    try {
      const result = await execFunc(...args);
      return result;
    } finally {
      loading.value = false;
    }
  };

  // 手动关闭 loading
  const closeLoading = () => {
    loading.value = false;
  };

  return { loading, executor, closeLoading };
}

尝试执行两次执行 executor 函数,并且控制中间间隔一段时间

const func = async (name: string) => {
  await new Promise(resolve => {
    // 模拟 5 秒的延时异步操作
    setTimeout(() => {
      resolve('');
    }, 5 * 1e3);
  });
  console.log(name);
};

const { loading, executor, closeLoading } = useLoading();

const handleLoading = async () => {
  executor(func, 'eno');
  // 4 秒后在第一次未完成时,再次执行 executor 
  setTimeout(() => {
    executor(func, 'eno');
  }, 4 * 1e3);
};

尝试后的效果是:点击 loading 按钮,显示 loading,五秒后第一个执行函数完成,loading 关闭,但是此时第二个还行函数还未完成,这样显然不是我们想要的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2250491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

存储服务器一般做是做什么阵列?详细列举一下

存储服务器通常使用 RAID&#xff08;Redundant Array of Independent Disks&#xff09; 阵列技术来管理磁盘&#xff0c;以提高数据的性能、可靠性和可用性。所选择的 RAID 类型取决于存储服务器的具体用途和需求&#xff0c;比如性能要求、容量需求、容错能力等。 以下是存…

无人机的起降装置:探索起飞和降落的秘密 !

一、起降系统的运行方式 起飞方式 垂直起飞&#xff1a;小型无人机通常采用垂直起飞方式&#xff0c;利用螺旋桨产生的升力直接从地面升起。这种方式适用于空间有限或需要快速起飞的场景。 跑道起飞&#xff1a;大型无人机或需要较长起飞距离的无人机&#xff0c;可能会采用…

代码随想录day01--数组

两数之和 题目 地址&#xff1a;https://leetcode.cn/problems/two-sum/ 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数…

Webpack前端工程化进阶系列(二) —— HMR热模块更新(图文+代码)

前言 之前更新过一篇Webpack文章:Webpack入门只看这一篇就够了(图文代码)&#xff0c;没想到颇受好评&#xff0c;很快就阅读量就破万了hhh&#xff0c;应读者私信的要求&#xff0c;决定继续更新Webpack进阶系列的文章&#xff01; 进入今天的主题 —— HMR 热模块替换(HotM…

Flink的双流join理解

如何保证Flink双流Join准确性和及时性、除了窗口join还存在哪些实现方式、究竟如何回答才能完全打动面试官呢。。你将在文中找到答案。 1 引子 1.1 数据库SQL中的JOIN 我们先来看看数据库SQL中的JOIN操作。如下所示的订单查询SQL&#xff0c;通过将订单表的id和订单详情表ord…

【MYSQL数据库相关知识介绍】

MySQL 在我们日常技术中是一个广泛使用的开源关系型数据库管理系统&#xff0c;所以作为测试同学&#xff0c;掌握mysql的相关知识是必不可少的技能之一&#xff0c;所以小编从软件测试的角色出发&#xff0c;来整理一些跟测试相关的知识&#xff0c;希望能够帮助到大家。 一、…

数组和链表OJ题

leetcode用编译器调试的技巧 数组和链表练习题 leetcode/reverse_Link/main.c Hera_Yc/bit_C_学习 - 码云 - 开源中国 1、移除元素 ​​​​​​27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; int removeElement(int* nums, int numsSize, int val) {int src 0, …

云服务器架构有什么区别?X86计算、Arm、GPU/FPGA/ASIC和裸金属全解析

阿里云服务器ECS架构有什么区别&#xff1f;X86计算、Arm计算、GPU/FPGA/ASIC、弹性裸金属服务器和高性能计算有什么区别&#xff1f;x86架构是最常见的&#xff0c;CPU采用Intel或AMD处理器&#xff1b;ARM架构具有低功耗的特性&#xff0c;CPU采用Ampere Altra / AltraMax或阿…

泽众TestCenter测试管理工具之案例库,提升测试工作的效率和质量

在当今的软件开发生命周期中&#xff0c;测试管理工具扮演着至关重要的角色。泽众TestCenter测试管理工具&#xff08;简称TC&#xff09;&#xff0c;作为一款广受好评的测试管理工具&#xff0c;凭借其强大的案例库功能&#xff0c;极大地提升了测试工作的效率和质量。 案例库…

Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway)

Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway) 一、服务网关 1.1 什么是网关 在微服务架构中&#xff0c;服务网关是一个至关重要的组件。它作为系统的入口&#xff0c;负责接收客户端的请求&#xff0c;并将这些请求路由到相应的后端服务…

基于单片机的多功能宠物窝的设计

本设计以STM32主控制器为核心芯片&#xff0c;它的组成元件有电机、温度传感器、时钟模块等。温度传感器的作用是采集环境温度的数据&#xff0c;时钟模块的作用是采集时间。将具体数据进行收集以后&#xff0c;主控制器将所有相关数据予以处理&#xff0c;从而将有关信息传递到…

Windows搭建MaskRCNN环境

环境&#xff1a;python3.6 1. 在miniconda上创建虚拟环境 miniconda下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda # 创建环境 conda create -n maskrcnn python3.6 # 激活 maskrcnn 环境&#xff0c;后续操作都在这个环境下进行 conda ac…

LLM PPT Translator

LLM PPT Translator 引言Github 地址UI PreviewTranslated Result Samples 引言 周末开发了1个PowerPoint文档翻译工具&#xff0c;上传PowerPoint文档&#xff0c;指定想翻译的目标语言&#xff0c;通过LLM的能力将文档翻译成目标语言的文档。 Github 地址 https://github.…

新质驱动·科东软件受邀出席2024智能网联+低空经济暨第二届湾区汽车T9+N闭门会议

为推进广东省加快发展新质生产力&#xff0c;贯彻落实“百县千镇万村高质量发展工程”&#xff0c;推动韶关市新丰县智能网联新能源汽车、低空经济与数字技术的创新与发展&#xff0c;充分发挥湾区汽车产业链头部企业的带动作用。韶关市指导、珠三角湾区智能网联新能源汽车产业…

Zookeeper选举算法与提案处理概览

共识算法(Consensus Algorithm) 共识算法即在分布式系统中节点达成共识的算法&#xff0c;提高系统在分布式环境下的容错性。 依据系统对故障组件的容错能力可分为&#xff1a; 崩溃容错协议(Crash Fault Tolerant, CFT) : 无恶意行为&#xff0c;如进程崩溃&#xff0c;只要…

实例讲解MATLAB绘图坐标轴标签旋转

在进行绘图时需要在图片上添加上做标轴的标签&#xff0c;但是当数据量比较多时&#xff0c;例如一天24小时的数据&#xff0c;这时把每个小时显示在左边轴的标签上&#xff0c;文字内容放不下&#xff0c;因此需要将坐标轴标签旋转一定的角度&#xff0c;这样可以更好在图形上…

flutter项目AndroidiOS自动打包脚本

从业数年余,开发出身,经数载努力位项目经理,因环境欠佳,终失业.失业达七月有余,几经周转,现又从开发,既回原点亦从始.并非与诸位抢食,仅为糊口,望海涵!因从头开始,所经之处皆为新奇,遂处处留痕以备日后之需. 自动打包脚本原文地址:https://zhuanlan.zhihu.com/p/481472311 转…

免费实用在线AI工具集合 - 加菲工具

免费在线工具-加菲工具 https://orcc.online/ sql格式化 https://orcc.online/tools/sql 时间戳转换 https://orcc.online/tools/timestamp Base64 编码解码 https://orcc.online/tools/base64 URL 编码解码 https://orcc.online/tools/url Hash(MD5/SHA1/SHA256…) 计算 h…

Scala学习记录,统计成绩

统计成绩练习 1.计算每个同学的总分和平均分 2.统计每个科目的平均分 3.列出总分前三名和单科前三名&#xff0c;并保存结果到文件中 解题思路如下&#xff1a; 1.读入txt文件&#xff0c;按行读入 2.处理数据 &#xff08;1&#xff09;计算每个同学的总分平均分 import s…

第六届机器人、智能控制与人工智能国际(RICAI 2024)

会议信息 会议时间与地点&#xff1a;2024年12月6-8日&#xff0c;中国南京 会议官网&#xff1a;www.ic-ricai.org &#xff08;点击了解大会参会等详细内容&#xff09; 会议简介 第六届机器人、智能控制与人工智能国际学术会议&#xff08;RICAI 2024&#xff09;将于20…