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%);
    }
  }
}
相关推荐
漂流瓶jz9 小时前
Webpack中各种devtool配置的含义与SourceMap生成逻辑
前端·javascript·webpack
前端架构师-老李9 小时前
React 中 useCallback 的基本使用和原理解析
前端·react.js·前端框架
木易 士心10 小时前
CSS 中 `data-status` 的使用详解
前端·css
明月与玄武10 小时前
前端缓存战争:回车与刷新按钮的终极对决!
前端·缓存·回车 vs 点击刷新
牧马少女10 小时前
css 画一个圆角渐变色边框
前端·css
zy happy10 小时前
RuoyiApp 在vuex,state存储nickname vue2
前端·javascript·小程序·uni-app·vue·ruoyi
小雨青年11 小时前
Cursor 项目实战:AI播客策划助手(二)—— 多轮交互打磨播客文案的技术实现与实践
前端·人工智能·状态模式·交互
小光学长11 小时前
基于Vue的儿童手工创意店管理系统as8celp7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
meichaoWen11 小时前
【Vue】Vue框架的基础知识强化
前端·javascript·vue.js