UNPKG

@nutui/nutui-react

Version:

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

80 lines (79 loc) 3.3 kB
import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array"; import React, { useState, useEffect, useRef, cloneElement, useCallback } from "react"; var ConfigurableCSSTransition = function(props) { var inPhase = props.in, _props_timeout = props.timeout, timeout = _props_timeout === void 0 ? 300 : _props_timeout, tmp = props.classNames, baseClassName = tmp === void 0 ? '' : tmp, nodeRef = props.nodeRef, mountOnEnter = props.mountOnEnter, unmountOnExit = props.unmountOnExit, onEntered = props.onEntered, onExited = props.onExited, children = props.children; var _useState = _sliced_to_array(useState(function() { if (inPhase) return 'entered'; return unmountOnExit || mountOnEnter ? 'unmounted' : 'exited'; }), 2), status = _useState[0], setStatus = _useState[1]; var _useState1 = _sliced_to_array(useState(function() { if (inPhase) return "".concat(baseClassName, "-enter-done"); return "".concat(baseClassName, "-exit-done"); }), 2), classes = _useState1[0], setClasses = _useState1[1]; var timerRef = useRef(null); var statusRef = useRef(status); var prevInPhase = useRef(inPhase); var updateStatus = useCallback(function(nextStatus) { statusRef.current = nextStatus; setStatus(nextStatus); }, []); var enter = useCallback(function() { if (timerRef.current) clearTimeout(timerRef.current); if (statusRef.current === 'unmounted') { updateStatus('exited'); } updateStatus('entering'); setClasses("".concat(baseClassName, "-enter ").concat(baseClassName, "-enter-active")); timerRef.current = setTimeout(function() { updateStatus('entered'); setClasses("".concat(baseClassName, "-enter-done")); onEntered === null || onEntered === void 0 ? void 0 : onEntered(); }, timeout); }, [ baseClassName, onEntered, timeout, updateStatus ]); var exit = useCallback(function() { if (timerRef.current) clearTimeout(timerRef.current); updateStatus('exiting'); setClasses("".concat(baseClassName, "-exit ").concat(baseClassName, "-exit-active")); timerRef.current = setTimeout(function() { updateStatus('exited'); setClasses("".concat(baseClassName, "-exit-done")); if (unmountOnExit) { updateStatus('unmounted'); } onExited === null || onExited === void 0 ? void 0 : onExited(); }, timeout); }, [ baseClassName, onExited, timeout, unmountOnExit, updateStatus ]); useEffect(function() { if (prevInPhase.current !== inPhase) { if (inPhase) { enter(); } else { exit(); } prevInPhase.current = inPhase; } return function() { if (timerRef.current) clearTimeout(timerRef.current); }; }, [ inPhase, enter, exit ]); if (status === 'unmounted') return null; return /*#__PURE__*/ cloneElement(children, { className: "".concat(children.props.className || '', " ").concat(classes) }); }; export default ConfigurableCSSTransition;