react封装Spin重复使用loading效果antd

1. 代码封装

import React, { useState } from 'react';
import { Spin } from 'antd';
import './index.scss';// 自定义Hook useLoadings  
export const useLoadings = () => {// 存储loading的状态,key是loading的唯一标识,value是loading的显示状态  const [loadings, setLoadings] = useState<Record<string, boolean>>({});const [keyMap, setKeyMap] = useState({});/*** @description 随机生成key* @param length * @returns { str }*/function generateRandomString(length: any) {const len: number = typeof length === 'number' && length > 0 ? length : 10;const characters: string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()';let result: string = '';const charactersLength:number = characters.length;for (let i = 0; i < len; i++) {result += characters.charAt(Math.floor(Math.random() * charactersLength));}return result;}// 添加loading  const addLoading = (tip: any): string => {let key:string;  do {  key = generateRandomString(10);  } while (loadings[key]); // 当 loadings[key] 存在时继续循环  setKeyMap((pervKeyMap) => ({...pervKeyMap,[key]: tip}))setLoadings((prevLoadings) => ({...prevLoadings,[key]: true,}));return key;};// 移除指定的loading  const closeLoading = (key: string) => {setKeyMap((pervKeyMap) => ({...pervKeyMap,[key]: ''}));setLoadings((prevLoadings) => ({...prevLoadings,[key]: false,}));};// 移除所有loading  const clearAllLoadings = () => {setLoadings({});setKeyMap({});};// 渲染所有loading  const LoadingIndicators = () => (<>{Object.keys(loadings).map((key) => (<Spin key={key} className='loading-ref' fullscreen spinning={loadings[key]} tip={keyMap[key]}/>))}</>);return {addLoading,closeLoading,clearAllLoadings,LoadingIndicators,};
};  

index.scss优化样式防止抽屉z-index:1000挡住

.loading-ref{z-index: 1001;
}

2. 实际使用

import { useLoadings } from './components/Loading';import { useEffect } from "react";export function DomC(){const { addLoading, closeLoading, clearAllLoadings, LoadingIndicators } = useLoadings();const clickNode = () => {const loading = addLoading('加载中...');setTimeout(() => {closeLoading(loading);}, 2000);}useEffect(() => {//	return () => {clearAllLoadings();}}, []);return <><div onClick={clickNode}>按钮</div><LoadingIndicators /></>
}

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

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

相关文章

c#将json字符串转为对象

c#将json字符串转为对象&#xff0c;需要加载这个 using Newtonsoft.Json; Rootobject _r JsonConvert.DeserializeObject<Rootobject>(_json);

selenium 库的爬虫实现

selenium 是什么&#xff1f; Selenium 是一个用于自动化 Web 应用程序测试的工具。它提供了一个用于测试网站的框架&#xff0c;可以模拟用户在浏览器中的操作&#xff0c;如点击链接、填写表单、提交数据等。Selenium 可以在多种浏览器和操作系统上运行&#xff0c;并且支持…

Nodejs 第七十三章(网关层)

什么是网关层(getway)&#xff1f; 技术选型fastify 速度快适合网关层 fastify教程上一章有讲 网关层是位于客户端和后端服务之间的中间层&#xff0c;用于处理和转发请求。它充当了请求的入口点&#xff0c;并负责将请求路由到适当的后端服务&#xff0c;并将后端服务的响应…

一个基于HOOK机制的微信机器人

一个基于✨HOOK机制的微信机器人&#xff0c;支持&#x1f331;安全新闻定时推送【FreeBuf&#xff0c;先知&#xff0c;安全客&#xff0c;奇安信攻防社区】&#xff0c;&#x1f46f;Kfc文案&#xff0c;⚡备案查询&#xff0c;⚡手机号归属地查询&#xff0c;⚡WHOIS信息查询…

有哪些地图采集软件可以采集商家数据导出功能?

1.国内商家采集 寅甲地图数据采集软件 寅甲地图数据采集软件一款多关键词多城市同时采集百度地图、360地图、高德地图、搜狗地图、腾讯地图、图吧地图、天地图商家、公司、店铺的手机、座机、地址、坐标等数据信息的软件。 2.国外商家采集 寅甲谷歌地图数据采集软件 专为做…

叶面积指数(LAI)数据、NPP数据、GPP数据、植被覆盖度数据获取

引言 多种卫星遥感数据反演叶面积指数&#xff08;LAI&#xff09;产品是地理遥感生态网推出的生态环境类数据产品之一。产品包括2000-2009年逐8天数据&#xff0c;值域是-100-689之间&#xff0c;数据类型为32bit整型。该产品经过遥感数据获取、计算归一化植被指数、解译植被类…

完成商品SPU管理页面

文章目录 1.引入前端界面1.将前端界面放到commodity下2.创建菜单3.进入前端项目&#xff0c;使用npm添加依赖1.根目录下输入2.报错 chromedriver2.27.2的问题3.点击链接下载压缩包&#xff0c;然后使用下面的命令安装4.再次安装 pubsub-js 成功5.在main.js中引入这个组件 4.修改…

【超详细】固态硬盘新盘验货检测教程

观前声明&#xff1a; 本文使用的固态硬盘为作者自费购买&#xff0c;同时也带有作者一定的主观意见&#xff0c;无任何软件和硬件的推广。 作者本人也正处于学习阶段&#xff0c;本文若有错误或有待改进的地方&#xff0c;欢迎评论区友善讨论~ 一、产品外包装信息检查 PS&…

Golang | Leetcode Golang题解之第109题有序链表转换二叉搜索树

题目&#xff1a; 题解&#xff1a; var globalHead *ListNodefunc sortedListToBST(head *ListNode) *TreeNode {globalHead headlength : getLength(head)return buildTree(0, length - 1) }func getLength(head *ListNode) int {ret : 0for ; head ! nil; head head.Next…

Java_多线程

有了多线程&#xff0c;我们就可以让程序同时做多件事情 作用&#xff1a; 提高效率 应用场景&#xff1a; 只要想让多个事情同时运行就需要用到多线程 比如&#xff1a;软件中的耗时操作、所有的聊天软件、所有的服务器... 并发和并行 并发&#xff1a;在同一时刻&#xff0…

AI是否可统计人类理性和感性的非线性?

一、背景 从控制理论的角度来看&#xff0c;“人类理性和感性的非线性”可以类比为动态系统中非线性元件的行为特性。在控制理论中&#xff0c;非线性意味着系统的输出不再严格与其输入成比例&#xff0c;也就是说&#xff0c;同样的输入条件下可能会导致不同的结果&#xff0…

为什么defineComponent组件名字和文件名字不能一样

今天在开发新组件时&#xff0c;在使用defineComponent定义组件时&#xff0c;把name写成了文件名的首字母大写法导致项目一直报错。找了很久才知道是名字的问题。 defineComponent组件名字和文件名字不能一样 在某些情况下&#xff0c;将组件的名称与文件名相同可能会导致一些…

当面试官问出“Unsafe”类时,我就知道这场面试废了,祖坟都能给你问出来!

一、写在开头 依稀记得多年以前的一场面试中&#xff0c;面试官从Java并发编程问到了锁&#xff0c;从锁问到了原子性&#xff0c;从原子性问到了Atomic类库&#xff08;对着JUC包进行了刨根问底&#xff09;&#xff0c;从Atomic问到了CAS算法&#xff0c;紧接着又有追问到了…

【c语言】函数递归

在C语言中&#xff0c;函数递归是一种函数调用自身的技术。递归函数通常用于解决可以分解为更小、类似子问题的问题。递归函数有两个基本部分&#xff1a; 基本情况&#xff08;Base Case&#xff09;&#xff1a;这是递归的终止条件&#xff0c;即函数停止递归并返回值的条件…

Mysql with 用法

什么是 with 语句 WITH 子句是 MySQL 中的一种 SQL 结构&#xff0c;又称为 Common Table Expression (CTE)。它在不影响原有 SQL 语句的情况下&#xff0c;允许开发人员临时创建一个内存中的结果集&#xff0c;然后对其进行操作。 with 语句用法 语法格式 WITH cte_name (…

JVM-调优之-高cpu线程问题排查

这里主要是对jstack命令的使用&#xff1b; 程序在运行过程中卡主&#xff0c;前端无法访问&#xff0c;一看服务器CPU占用达到200到300%多。 排查思路 1&#xff09;找出占用高的进程 2&#xff09;找出占用高的线程 3&#xff09;找出具体的代码 分析步骤&#xff1a; …

C++里的vector详细讲解

在C的标准模板库&#xff08;STL&#xff09;中&#xff0c;vector是一个非常有用的动态数组容器。它允许我们存储可变大小的同类型元素序列&#xff0c;并且能够动态地增长和缩小。由于其灵活性和易用性&#xff0c;vector在C编程中得到了广泛的应用。 一、vector的基本操作 …

Java异常处理:最佳实践与常见模式

在Java编程中&#xff0c;异常处理是保证程序健壁性和稳定性的重要方面。良好的异常处理不仅可以帮助程序在面对错误情况时恢复到正常状态&#xff0c;还可以提供错误诊断的信息&#xff0c;辅助开发者快速定位问题。本文将探讨Java中的异常处理机制&#xff0c;包括异常的分类…

esp32 Micropython 长按按键动作一次代码

1. 长按按键&#xff0c;松手后动作 from machine import Pin import timeEnter_key Pin(15, Pin.IN, Pin.PULL_UP) Enter_key_flag 0 Enter_key_flag_temp 0while True:if Enter_key.value() 0:time.sleep_ms(10)while Enter_key.value() 0:Enter_key_flag_temp not En…

System.Collections.Generic 中的接口和类型区分

System.Collections.Generic 命名空间包含了许多与泛型集合相关的接口和类。这些接口定义了一组通用的集合行为&#xff0c;而具体的实现&#xff08;如 List、Dictionary<TKey, TValue> 等&#xff09;则遵循这些接口&#xff0c;从而提供具体的集合功能。以下是 System…