React页面使用ant design Spin加载遮罩指示符自定义成进度条的形式

React页面使用ant design Spin加载遮罩指示符自定义成进度条的形式具体实现:

javascript 复制代码
import React, { useState, useEffect, } from 'react';
import { Spin, Progress, } from 'antd';
import styles from './style.less';

const App = () => {
  // 全局加载状态
  const [globalLoading, setgGlobalLoading] = useState(false);
  // 进度条状态
  const [loadingProgress, setLoadingProgress] = useState(0);

  useEffect(() => {
    // API调用开始
    setgGlobalLoading(true);

    // 执行过程

    // API调用结束
    setgGlobalLoading(false);
  }, [])

  useEffect(() => {
    let timer;
    let progressInterval;

    if (globalLoading) {
      // 立即设置进度为 0,避免延迟显示时的跳跃
      setLoadingProgress(0);

      // 延迟显示进度条
      timer = setTimeout(() => {
        // 开始进度条动画
        progressInterval = setInterval(() => {
          setLoadingProgress(prev => {
            // 非线性增长,模拟真实加载
            const increment = Math.random() * 10;
            const newProgress = prev + increment;

            // 当接近完成时,放缓增长速度
            if (newProgress >= 95) {
              return 95; // 保持在 95%,等待实际加载完成
            }
            return newProgress;
          });
        }, 200); // 每 200ms 更新一次
      }, 100); // 延迟 100ms 后开始动画

    } else {
      // 加载完成时,快速填充到 100%
      setLoadingProgress(100);
      // 500ms 后隐藏进度条
      const completeTimer = setTimeout(() => {
        setLoadingProgress(0);
      }, 500);

      return () => clearTimeout(completeTimer);
    }

    return () => {
      clearTimeout(timer);
      clearInterval(progressInterval);
    };
  }, [globalLoading]);

  const customIndicator = (
    <Progress
      percent={loadingProgress}
      showInfo={false}
      strokeColor={{
        '0%': '#108ee9',
        '100%': '#87d068',
      }}
      strokeWidth={8}
      trailColor="#f5f5f5"
    />
  );

  return (
    <Spin
      spinning= { globalLoading }
      tip = "数据加载中,请稍候..."
      delay = { 100}
      indicator = { customIndicator }
      wrapperClassName = { styles.spinWrapper }
    >
      <div>......</div>
    </Spin>
  );
};

export default App;

css样式:

css 复制代码
.spinWrapper {
  width: 100%;
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 9999;
  display: flex;
  justify-content: center;
  align-items: center;

  :global {
    .ant-spin-container {
      width: 100%;
    }
    
    .ant-spin .ant-spin-text {
      font-size: 20px !important;
    }

    .ant-progress {
      width: 550px;
      margin-bottom: 12px;
    }

    .ant-spin.ant-spin-show-text .ant-spin-dot {
      transform: translateX(-48%);
    }
  }
}
相关推荐
鬼手点金3 分钟前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
柳杉4 分钟前
借助 Codex 和可视化工作流,从调研到完整实现,3D 大屏竟然可以这么简单
前端·ai编程·数据可视化
IMPYLH36 分钟前
HTML 的 <wbr> 元素
前端·html
Dovis(誓平步青云)1 小时前
常用命令藏得太深?怎么做一个快捷命令坞
运维·前端·自动化·音视频·prometheus
IT_陈寒2 小时前
Vite的这个问题坑了我三天,原来如此解决!
前端·人工智能·后端
网易云信2 小时前
大模型能上岗做销售吗?我们让 12 款国产模型交了 420 份作业
前端·后端
蜗牛互联网2 小时前
Python Agent工具调用的白名单、参数校验与审批门禁
java·服务器·前端·人工智能·后端·python
计算机魔术师2 小时前
Perplexity:每个 Project 都是一个 Git 仓库
前端
Andrew5513 小时前
让 AI 写页面不再“一眼假”:我把设计品味做成了一个 Claude Code Skill 流水线
前端
乐享qicheng3 小时前
14-AI智能管家JSBridge深度问答
前端