kwooshung/react-progressbar-wrapper

View on GitHub
README.zh-CN.md

Summary

Maintainability
Test Coverage
<div align="center">

# @kwooshung/react-progressbar-wrapper

一个直观、易用的进度条组件。支持自定义位置和样式,能够适应各种内容和布局需求,同时提供流畅的用户体验和高度的可定制性。

[![GitHub License](https://img.shields.io/github/license/kwooshung/react-progressbar-wrapper?labelColor=272e3b&color=165dff)](LICENSE)
![GitHub Release Date - Published_At](https://img.shields.io/github/release-date/kwooshung/react-progressbar-wrapper?labelColor=272e3b&color=00b42A&logo=github)
![GitHub last commit](https://img.shields.io/github/last-commit/kwooshung/react-progressbar-wrapper?labelColor=272e3b&color=165dff)
![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/kwooshung/react-progressbar-wrapper?labelColor=272e3b&color=165dff)
![GitHub top language](https://img.shields.io/github/languages/top/kwooshung/react-progressbar-wrapper?labelColor=272e3b&color=165dff)
![GitHub pull requests](https://img.shields.io/github/issues-pr/kwooshung/react-progressbar-wrapper?labelColor=272e3b&color=165dff)
![GitHub issues](https://img.shields.io/github/issues/kwooshung/react-progressbar-wrapper?labelColor=272e3b&color=165dff)
![Github Stars](https://img.shields.io/github/stars/kwooshung/react-progressbar-wrapper?labelColor=272e3b&color=165dff)
[![NPM Version](https://img.shields.io/npm/v/@kwooshung/react-progressbar-wrapper?labelColor=272e3b&color=165dff)](https://www.npmjs.com/package/@kwooshung/react-progressbar-wrapper)
[![Npm.js Downloads/Week](https://img.shields.io/npm/dw/@kwooshung/react-progressbar-wrapper?labelColor=272e3b&labelColor=272e3b&color=165dff&logo=npm)](https://www.npmjs.com/package/@kwooshung/react-progressbar-wrapper)
[![Github CI/CD](https://github.com/kwooshung/react-progressbar-wrapper/actions/workflows/ci.yml/badge.svg)](https://github.com/kwooshung/react-progressbar-wrapper/actions/)
[![codecov](https://codecov.io/gh/kwooshung/react-progressbar-wrapper/graph/badge.svg?token=CBQ1WB8xkr)](https://codecov.io/gh/kwooshung/react-progressbar-wrapper)
[![Maintainability](https://api.codeclimate.com/v1/badges/30c9c143fe08f23bb28f/maintainability)](https://codeclimate.com/github/kwooshung/react-progressbar-wrapper/maintainability)
[![Gitee Repo](https://img.shields.io/badge/Gitee-react--progressbar--wrapper-165dff?logo=gitee)](https://gitee.com/kwooshung/react-progressbar-wrapper/)

<p align="center">
    <a href="README.md">English</a> | 
    <a href="README.zh-CN.md" style="font-weight:700;color:#165dff;text-decoration:underline;">中文</a>
</p>
</div>

# 为什么开发它?

- 为什么不用 [NProgress](https://github.com/rstacruz/nprogress)?我曾经也经常使用它,但逐渐发现它不能满足我的要求,我希望的是给用户一种模拟更真实的加载体验,而不是简简单单的匀速加载。
- 样式不够自由,我希望可以自定义加载条的样式,比如颜色、高度、位置等等,虽然 [NProgress](https://github.com/rstacruz/nprogress) 也支持自定义,但是我不喜欢它的定义方式,更重要的是不能定义滚动条的 **方向** 和 **位置**。

# 为什么使用它?

- 支持自定义样式,支持自定义组件,比直接传入属性,更加灵活。
- 可以模拟更真实的加载体验,比如在3秒内加载到60%,然后再5秒内缓慢的加载80%,直到最大80%的时候,停止并等待进一步指示,直到属性 `done` 为 `true`,加载条才会立即到 `100%` 后渐隐消失,具体参考下方 `API`;
- 多种事件,方便监听每个阶段的进度条;
- 位置位置多样,你可以顶部、底部、左侧、右侧;
- 加载方向多样,从左到右,从右到左,从上到下,从下到上,方便 **rtl** 和 **横向** 网页的场景使用;
- 支持中英文双语注释;
- 学习成本低,使用简单且灵活;
- **ES6** 的现代特性实现;
- **TypeScript** 编写,类型安全;
- 可按需引入,`esm` 模块化,天生支持 **树摇(tree-shaking)**,不用担心打包后的体积;
- 当然本项目也提供了 `commonjs` 规范的 `cjs` 版本;
- 测试覆盖率 **100%**;

# 安装

## npm

```bash
npm install @kwooshung/react-progressbar-wrapper
```

## yarn

```bash
yarn add @kwooshung/react-progressbar-wrapper
```

## pnpm

```bash
pnpm add @kwooshung/react-progressbar-wrapper
```

# 使用方法

## 样式

在某些框架中直接在全局`css` / `less` / `scss`中引入样式即可,如下所示:

```css
@import url('@kwooshung/react-progressbar-wrapper/dist/index.css');
```

在部分框架中,如 `Next.js` 中,可能需要加入`~`符,才行,如下所示:

```css
@import url('~@kwooshung/react-progressbar-wrapper/dist/index.css');
```

你也可以在全局页面,如 `Next.js` 中的 `Layout` 页面 或 对应组件 中引入,如下所示:

```tsx
import '@kwooshung/react-progressbar-wrapper/dist/index.css';
```

## 组件

在某个元素上使用 `ReactProgressbarWrapper` 组件,如下所示:

```tsx
import { KsProgressbarWrapper } from '@kwooshung/react-progressbar-wrapper';
import '@kwooshung/react-progressbar-wrapper/dist/index.css';

const ProgressChildren = <div style={{ height: '2px', background: 'linear-gradient(112.44deg,#ff5858 2.09%,#c058ff 75.22%)', backgroundSize: '165%' }} />;

const Demo = () => {
  const [active, setActive] = useState<boolean>(false);
  const [done, setDone] = useState<boolean>(false);
  return (
    <>
      <KsProgressbarWrapper active={active} done={done}>
        {ProgressChildren}
      </KsProgressbarWrapper>
      <button onClick={() => setActive(!active)}>Toggle</button>
    </>
  );
};

export default Demo;
```

# API

## Props

| 参数               | 说明                                                                                                                            | 类型    | 默认值 |
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------- | ------- | ------ |
| active             | 控制进度条是否激活。                                                                                                            | boolean | false  |
| done               | 指示是否加载完毕。                                                                                                              | boolean | false  |
| position           | 设置进度条的位置和方向。可选值: 't-lr', 't-rl', 'b-lr', 'b-rl', 'l-tb', 'l-bt', 'r-tb', 'r-bt'。更多说明,看下方 `位置方向说明` | string  | 't-lr' |
| loadTo             | 设置初始加载到的百分比。                                                                                                        | number  | 65     |
| durationLoadTo     | 设置达到 `loadTo` 百分比的时间(毫秒)。                                                                                        | number  | 3000   |
| loadToSlow         | 设置缓慢加载的目标百分比。                                                                                                      | number  | 85     |
| durationLoadToSlow | 设置达到 `loadToSlow` 百分比的时间(毫秒)。                                                                                    | number  | 6000   |
| fluctuation        | 设置每个阶段终点的浮动范围。比如 `loadTo` 为 `60%`,那么,终点将会随机为 `50%~70%` 之间。                                       | number  | 10     |
| delayHide          | 设置完成后的延迟隐藏时间(毫秒)。                                                                                              | number  | 500    |
| durationHide       | 设置隐藏动画的持续时间(毫秒)。                                                                                                | number  | 300    |

## Events

| 事件               | 说明                                              | 类型                    |
| ------------------ | ------------------------------------------------- | ----------------------- |
| onStart            | 进度条开始加载时触发。                            | () => void;             |
| onLoadToStart      | loadTo 开始加载时触发。                           | () => void;             |
| onLoadToUpdate     | loadTo 加载过程中触发,参数为当前加载百分比。     | (value:number) => void; |
| onLoadToDone       | loadTo 加载完毕时触发。                           | () => void;             |
| onLoadToSlowStart  | loadToSlow 开始加载时触发。                       | () => void;             |
| onLoadToSlowUpdate | loadToSlow 加载过程中触发,参数为当前加载百分比。 | (value:number) => void; |
| onLoadToSlowDone   | loadToSlow 加载完毕时触发。                       | () => void;             |
| onUpdate           | 全程加载中触发,参数为当前加载百分比。            | (value:number) => void; |
| onDone             | 进度条加载完毕时触发。                            | () => void;             |

## 位置方向

- t-lr: 顶部从左到右
- t-rl: 顶部从右到左
- b-lr: 底部从左到右
- b-rl: 底部从右到左
- l-tb: 左侧从上到下
- l-bt: 左侧从下到上
- r-tb: 右侧从上到下
- r-bt: 右侧从下到上