Concis组件库封装——Loading加载中

2023-10-31

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~

组件介绍

Loading组件是日常开发用的很多的组件,这次封装主要包含两种状态的Loading,旋转、省略号,话不多说先看一下组件的文档页面吧:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Loading API能力

组件一共提供了如下的API能力,可以在使用时更灵活:

在这里插入图片描述

  1. type表示loading类型,默认是default,当用户需要使用省略样式,设置type=dot即可;
  2. mask配置蒙层,可在loading时遮挡覆盖内容为半透明状态,适用于内容未加载时的遮盖;
  3. loadingText配置加载文字,在图标下显示;
  4. icon配置自定义图标,可配置自己所需要的Icon或svg图标;
  5. width配置自定义宽度;
  6. height配置自定义高度;
  7. style配置loading整体自定义样式;

组件源码

index.tsx:

import React, { FC, useEffect, useRef, useState, Fragment, useMemo } from 'react';
import { LoadingProps } from './interface';
import './index.module.less';

const Loading: FC<LoadingProps> = (props) => {
  const {
    type = 'default',
    mask = false,
    loadingText,
    icon,
    width = '2em',
    height = '2em',
    style = {},
  } = props;

  const timer = useRef<any>(null);
  const [activeDotIndex, setActiveDotIndex] = useState(0);

  useEffect(() => {
    timer.current = setInterval(() => {
      setActiveDotIndex((old) => {
        if (old === 2) {
          old = 0;
        } else {
          old++;
        }
        return old;
      });
    }, 500);
    return () => {
      clearInterval(timer.current);
    };
  }, []);

  const loadingStyle = useMemo(() => {
    const returnStyle = style;
    returnStyle.width = width;
    returnStyle.height = height;
    return returnStyle;
  }, [width, height, style]);
  return (
    <Fragment>
      {mask && <div className="dialog" />}
      {type === 'default' ? (
        <div className="loading" style={loadingStyle}>
          <div className="loading-container">
            {icon || (
              <svg
                fill="none"
                stroke="currentColor"
                stroke-width="4"
                width={width}
                height={height}
                viewBox="0 0 48 48"
                aria-hidden="true"
                focusable="false"
              >
                <path d="M42 24c0 9.941-8.059 18-18 18S6 33.941 6 24 14.059 6 24 6"></path>
              </svg>
            )}
          </div>
          {loadingText && <div className="text">{loadingText}</div>}
        </div>
      ) : (
        <div className="dot-loading">
          {new Array(3).fill('').map((item, index) => {
            return <div className={activeDotIndex === index ? 'dot-active' : 'dot'}>{item}</div>;
          })}
        </div>
      )}
    </Fragment>
  );
};

export default Loading;

组件测试源码

loading.test.tsx:

import React from 'react';
import Loading from '../../Loading/index';
import Enzyme from '../setup';
import mountTest from '../mountTest';
import ReactDOM from 'react-dom';

const { mount } = Enzyme;
let container: HTMLDivElement | null;

mountTest(Loading);

describe('loading', () => {
  beforeEach(() => {
    container = document.createElement('div');
    document.body.appendChild(container);
  });
  afterEach(() => {
    document.body.removeChild(container as HTMLDivElement);
    container = null;
  });

  it('test loading show correctly', () => {
    //测试基础加载
    const loading = mount(<Loading />);
    expect(loading.find('.loading .loading-container svg')).toHaveLength(1);
    expect(loading.find('.loading .text')).toHaveLength(0);
  });

  it('test dot loading show correctly', () => {
    //测试省略号加载
    const loading = mount(<Loading type="dot" />);
    expect(loading.find('.dot-loading')).toHaveLength(1);
  });

  it('test mask loading has dialog', () => {
    //测试加载蒙层
    const loading = mount(<Loading mask />);
    expect(loading.find('.dialog')).toHaveLength(1);
  });

  it('test mask loading has dialog', () => {
    //测试加载蒙层
    const loading = mount(<Loading loadingText="test loading" />);
    expect(loading.find('.loading .text').text()).toBe('test loading');
  });

  it('test diffenent size loading show correctly', () => {
    //测试不同大小loading、loading自定义样式
    const component = <Loading width="3em" height="3em" style={{ marginLeft: '100px' }} />;
    ReactDOM.render(component, container);
    const loadingDom = container?.querySelector('.loading');
    expect(
      loadingDom?.getAttribute('style')?.includes('margin-left: 100px; width: 3em; height: 3em;'),
    );
    const svgDom = loadingDom?.querySelector('svg');
    expect(
      svgDom?.getAttribute('width') === '3em' && svgDom?.getAttribute('height') === '3em',
    ).toBe(true);
  });
});

组件库线上地址

Concis组件库线上链接:http://react-view-ui.com:92
github:https://github.com/fengxinhhh/Concis
npm:https://www.npmjs.com/package/concis

开源不易,欢迎学习和体验,喜欢请多多支持,有问题请留言。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Concis组件库封装——Loading加载中 的相关文章

  • Angular 2 Material 2 日期选择器日期格式

    我不知道如何更改材料2日期选择器的日期格式 我已阅读文档 但我不明白我实际上需要做什么 datepicker默认提供的输出日期格式为f e 6 9 2017 我想要实现的目标是将格式更改为类似的格式9 Jun 2017或任何其他 文档htt
  • ajaxStop() 不触发

    这是不起作用的代码 document ajaxStop function this unbind ajaxStop prevent running again when other calls finish Display everythi
  • html 表格单元格的条件格式

    是否有现成的解决方案可以对 HTML 表格进行条件格式设置 通过条件格式 我更感兴趣的是根据该列或其他列 在同一个表中 的值 数字 将不同的颜色作为单元格背景 类似于我们在 Excel 条件格式 gt 色阶 gt 红黄绿中的内容 我想在通过
  • 了解 sort() 比较函数

    我正在使用一个电子商务平台 该平台无法重新排序产品属性字段的选项 这真的很糟糕 因为要插入新选项 您几乎必须删除所有现有选项并重新开始 我正在尝试在客户端进行操作 这是我正在处理的内容 这是针对鞋码的 9 EE 9 1 2 EE 10 EE
  • 以一定时间间隔连续重复运行 JavaScript 函数

    这是我的第一个问题 希望您尽快回答 我想要代码连续重复一个函数 我尝试了一些代码 但没有成功 我尝试了这段代码 我想在一段时间后重复这个功能 我努力了setInterval and setTimeout 但是 我还没有收到结果 这将重复该任
  • Chrome 扩展同步调用 - 仅在窗口关闭后创建窗口

    我有这个代码 function voteNewWindow mailNum chrome windows create url http www google com incognito true function window conso
  • 将文本大小调整为矩形 在 Canvas HTML5 中调整大小

    我是 Canvas 新手 我正在创建一个网站 以在调整矩形大小时增加文本 我尝试了很多 但没有任何效果 实际上 我希望如果我仅按其宽度调整矩形大小 向左拉伸 向右拉伸 则仅应增加文本宽度而不是字体大小 我已经完成了字体大小 但发现增加孤立文
  • 无法实例化模块 [$injector:unpr] 未知提供程序:$routeProvider

    我从 AngularJS 升级时收到此错误1 0 7 to 1 2 0rc1 ngRoute 模块不再是核心的一部分angular js文件 如果您继续使用 routeProvider 那么您现在需要包括angular route js在你
  • 判断一个数字是否能被 3 或 5 整除 (FizzBu​​zz)

    如何根据输出是否能被 3 或 5 整除来更改输出 如果它能被 3 整除 我想显示 rock 如果它能被 5 整除 我想显示 star 类似于 FizzBu zz 如果两者都有 他们都会看到 这是我的代码 if var n Math floo
  • 循环遍历元素并逐步为每个元素应用 CSS 规则

    我有一个网格布局 每个网格布局中都有不同数量的元素 我想动态添加内联grid column通过循环遍历 div 中存在的每个元素的 CSS 规则 ul 与一类 list 所以 HTML 代码的输出需要是 ul class list ul u
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • console.log() 显示同一对象属性的矛盾值

    我想我可能要疯了 我使用 console log 来查看对象的状态 然后在下一行对同一对象的特定属性执行 console log 并为每个属性获取不同的值 我正在使用的代码是 console log this pictures Items
  • ToggleClass 动画 jQuery?

    我的网站上有一个部分 当用户单击时我希望它展开 我正在使用 jQuerytoggleClass为了这 expandable function e e preventDefault this closest article toggleCla
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • 在不同环境中运行的react.js redux生产构建中将环境变量渲染到浏览器

    React redux realworld io 应用程序的自述文件位于https github com gothinkster react redux realworld example app https github com goth
  • Knockout.js 安全绑定

    我想使用带有淘汰赛的安全绑定 为此我使用敲除安全绑定 js https github com brianmhunt knockout secure binding 谁能解释一下为什么下面的代码不起作用 它会抛出一个错误 未捕获 淘汰 安全
  • JavaScript 数组扩展语法的时间复杂度是多少?

    我想知道在 JavaScript 中使用数组扩展的时间复杂度是多少 是线性 O n 还是常数 O 1 下面的语法示例 let lar Math max nums 传播称为 Symbol iterator 有关对象的属性 对于数组 这将迭代数
  • MongoDB中如何通过引用字段进行查询?

    我有两个 Mongo 模式 User id ObjectId name String country ObjectId Reference to schema Country Country id ObjectId name String
  • 如何使用 jQuery 或 JavaScript 聚焦 或 标签?

    for var i 0 i
  • 无法使用 HTML 设置未定义 jQuery UI 自动完成的属性“_renderItem”

    我使用以下代码将 jQuery UI 自动完成项呈现为 HTML 这些项目在自动完成控件中正确呈现 但我不断收到此 JavaScript 错误并且无法移动过去 Firefox 无法转换 JavaScript 参数 Chrome 无法设置未定

随机推荐

  • 2022-itwangyang-前端数据埋点 SDK

    前端数据埋点 SDK 前言 相信不少人因为项目中没有接触过数据埋点相关的内容 而没有花时间去了解它 总觉得这又是一个自己还不能涉及的方面 然而数据埋点本身并不难理解 只是很难做得好 本文会从 认识数据埋点 SDK 设计前端数据埋点 SDK
  • 关于python3在Windows10环境下构建发布模块

    在 Head First Python 中的描述太过简略 况且还是mac系统 然后我又百度了很多博客 都没能解决 找不到路径 这个问题 直到今天 才弄出来 首先自己写一个模块 因为我是新手所以就按first python描述的那个输出函数作
  • Multisim基础 变压器 简单示例

    Multisim NI Multisim 14 0 Student Edition OS Windows 10 x64typesetting Markdown blog my oschina net zhichengjiu gitee gi
  • 计网第五章(运输层)(六)(TCP可靠传输的实现)

    目录 一 基本概述 二 具体实现 1 前后沿 2 利用指针描述发送窗口的状态 3 有差错情况 之前在数据链路层时已经讨论过可靠传输 计网第三章 数据链路层 二 可靠传输 也在其中提到过可靠传输并不局限于数据链路层 一 基本概述 TCP通过以
  • Batch Normalization详解(原理+实验分析)

    Batch Normalization详解 原理 实验分析 1 计算过程 2 前向传播过程 3 反向传播过程 4 实验分析 4 1 实验一 验证有没有BatchNorm下准确率的区别 4 2 实验二 验证有没有BatchNorm noisy
  • VSCode+Python, conda激活环境错误的解决方案: CommandNotFoundError

    之前VSCode运行Python总是会在终端报错 CommandNotFoundError Your shell has not been properly configured to use conda activate 原因在于每次都会
  • 幼儿园观察记录的目的和目标_幼儿园观察记录:如何让幼儿在区角活动中真正动起来...

    区角活动是幼儿园教育教学活动中的重要组成部分 它贯穿于幼儿园一日生活的各个环节当中 它是幼儿园教育中促进幼儿个性化发展的有效形式 区角活动的内容与主题结合提升目的性 区角活动的材料与本土资源结合 凸显本土性 季节性 可变性 富有特色 教师在
  • mysql 2分钟_java程序mysql数据库每隔2分钟左右就会中断,必须重启tomcat

    原标题 java程序mysql数据库每隔2分钟左右就会中断 必须重启tomcat 解决方案一 推荐 1 问题解决方案及说明 https blog csdn net liuyangvoid article details 25975157 出
  • AIGC从入门到精通

    目录 1 概述 2 一键起飞 3 保持ID生成 4 教程 原理 训练阶段 采样阶段 5 大模型微调 6 训练 7 商业价值 Fooocus sd webui 界面 新手建议使用 ComfyUI 简体中文版 1 概述 Stable Diffu
  • [1065]impala查询内存限制Memory limit exceeded

    错误信息 ERROR Memory limit exceeded Query did not have enough memory to get the minimum required buffers in the block manag
  • Python3发送邮件

    coding utf 8 author ChenBaijing date 2022 4 7 14 33 Python对SMTP支持有smtplib和email两个模块 smtplib负责 登录邮件服务器 认证 和 发送邮件 对smtp协议进
  • vmware虚拟机开机黑屏的解决方法

    今天有一个项目需要用到OSX坯境 打开vmware 启动原来安装的 OSX10 11 结果启动后 无轮怎么操作就是黑屏 然后就百度了一下vmware黑屏的解决办法 尝试了一下问题解决 同时也把解决过程记录一下 1 挂起的时候我们是能够见到显
  • IPSec/GRE与PPTP的比较

    PPTP PPTP Point to Point Tunneling Protocol 是点对点的协议 基于拨号使用的PPP协议使用PAP或CHAP之类的加密算法 或者使用Microsoft的点对点加密算法MPPE 而L2TP Layer
  • Spring Boot + Mybatis 实现动态数据源

    动态数据源 在很多具体应用场景的时候 我们需要用到动态数据源的情况 比如多租户的场景 系统登录时需要根据用户信息切换到用户对应的数据库 又比如业务A要访问A数据库 业务B要访问B数据库等 都可以使用动态数据源方案进行解决 接下来 我们就来讲
  • Ultra Libraian介绍

    Ultra Libraian介绍 我从Ultra Libraian官网上查找一些信息 在下面统一介绍一下它 方便大家使用 Ultra Libraian简介 Ultra Libraian是一个零件库服务商 提供方便电子工程师和PCB Layo
  • 边界值法中的上点、内点和离点分析

    1 边界值法概念 边界值法设计测试用例 是对输入或输出的边界值 有效等价类和无效等价类的界限 进行测试的一种黑盒测试方法 2 边界值法存在的意义 测试经验表明错误往往会发生在输入或输出范围的边界上 所以边界值法是对这些边界进行测试 是对划分
  • 多系统U盘启动盘的制作,成功启动win8PE,ubuntu,deepin2013,deepin2014,以及通过U盘启动电脑已装系统。

    以前的用U盘装系统都是用ultraISO 直接制作启动盘 有的时候一连着好几天都得捣鼓着装系统 今天是windows 明天是ubuntu 后天就可能是其它linux发行版了 很不方便 所以就想利用一个U盘做一个多系统的启动盘 经过N天不断的
  • Linux安装完mysql远程连接Authentication plugin

    root iZ2ze8bpfv23icsz3g2hp2Z log mysql u root p Enter password Welcome to the MySQL monitor Commands end with or g Your
  • MATLAB 学习笔记(6)MATLAB 的 upsample 函数和 downsample 函数

    目录 upsample 和 downsample 程序验证 上采样 upsample 下采样 downsample 其他参数设定 总结 upsample 和 downsample upsample 和 downsample 顾名思义就是上采
  • Concis组件库封装——Loading加载中

    您好 如果喜欢我的文章 可以关注我的公众号 量子前端 将不定期关注推送前端好文 组件介绍 Loading组件是日常开发用的很多的组件 这次封装主要包含两种状态的Loading 旋转 省略号 话不多说先看一下组件的文档页面吧 Loading