@nutui/nutui-react
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
91 lines (90 loc) • 3.14 kB
JavaScript
import { _ as __rest } from "./tslib.es6.js";
import React__default, { useState, useEffect, useRef } from "react";
import classNames from "classnames";
import { C as ComponentDefaults } from "./typings.js";
import { a as useRtl } from "./configprovider2.js";
const defaultProps = Object.assign(Object.assign({}, ComponentDefaults), { percent: 0, showText: false, animated: false, lazy: false, delay: 0 });
const Progress = (props) => {
const rtl = useRtl();
const _a = Object.assign(Object.assign({}, defaultProps), props), { className, style, percent, background, color, strokeWidth, showText, animated, children, lazy, delay } = _a, rest = __rest(_a, ["className", "style", "percent", "background", "color", "strokeWidth", "showText", "animated", "children", "lazy", "delay"]);
const classPrefix = "nut-progress";
const classesInner = classNames({
[`${classPrefix}-inner`]: true,
[`${classPrefix}-active`]: animated
});
const stylesOuter = {
height: `${strokeWidth}px`,
background
};
const [displayPercent, setDispalyPercent] = useState(0);
const stylesInner = {
width: `${displayPercent}%`,
background: color
};
useEffect(() => {
setDispalyPercent(percent);
}, [percent]);
const [intersecting, setIntersecting] = useState(false);
const progressRef = useRef(null);
const observer = useRef(null);
const initObserver = () => {
const options = {
threshold: [0],
rootMargin: "0px"
};
observer.current = new IntersectionObserver((entires, self) => {
entires.forEach((item) => {
setIntersecting(item.isIntersecting);
});
}, options);
observer.current.observe(progressRef.current);
};
const resetObserver = () => {
observer.current.disconnect && observer.current.disconnect();
};
useEffect(() => {
if (lazy) {
setTimeout(() => {
if (intersecting) {
setDispalyPercent(percent);
} else {
setDispalyPercent(0);
}
}, delay);
}
}, [intersecting]);
useEffect(() => {
lazy && initObserver();
let timer = null;
if (delay) {
setDispalyPercent(0);
timer = setTimeout(() => {
setDispalyPercent(percent);
}, delay);
}
return () => {
lazy && resetObserver();
timer && clearTimeout(timer);
};
}, []);
return React__default.createElement(
"div",
Object.assign({ ref: progressRef, className: classNames(classPrefix, className), style }, rest),
React__default.createElement(
"div",
{ className: `${classPrefix}-outer`, style: stylesOuter },
React__default.createElement("div", { className: classesInner, style: stylesInner }, showText && React__default.createElement("div", { className: `${classPrefix}-text`, style: rtl ? { right: `${displayPercent}%` } : { left: `${displayPercent}%` } }, children || React__default.createElement(
"div",
{ className: `${classPrefix}-text-inner`, style: {
background: color
} },
percent,
"%"
)))
)
);
};
Progress.displayName = "NutProgress";
export {
Progress as default
};