UNPKG

@nutui/nutui-react

Version:

京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序

91 lines (90 loc) 3.14 kB
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 };