vantui-edit
Version:
一套适用于Taro3及React的vantui组件库
179 lines (146 loc) • 5.79 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.CountDown = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _react = require("react");
var _components = require("@tarojs/components");
var _util = require("./util");
var _jsxRuntime = require("react/jsx-runtime");
var _excluded = ["time", "format", "autoStart", "millisecond", "onChange", "onFinish", "children", "style", "className"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function simpleTick(fn) {
return setTimeout(fn, 30);
}
function Index(props, ref) {
var _ref = (0, _react.useRef)({
tid: null,
counting: false
});
var _useState = (0, _react.useState)({
formattedTime: '0'
}),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
state = _useState2[0],
setState = _useState2[1];
var formattedTime = state.formattedTime;
var time = props.time,
_props$format = props.format,
format = _props$format === void 0 ? 'HH:mm:ss' : _props$format,
_props$autoStart = props.autoStart,
autoStart = _props$autoStart === void 0 ? true : _props$autoStart,
millisecond = props.millisecond,
onChange = props.onChange,
onFinish = props.onFinish,
children = props.children,
style = props.style,
className = props.className,
others = (0, _objectWithoutProperties2.default)(props, _excluded); // 暂停
var _pause = (0, _react.useCallback)(function () {
_ref.current.counting = false;
clearTimeout(_ref.current.tid);
}, []);
var getRemain = (0, _react.useCallback)(function () {
return Math.max(_ref.current.endTime - Date.now(), 0);
}, []);
var setRemain = (0, _react.useCallback)(function (remain) {
_ref.current.remain = remain;
var timeData = (0, _util.parseTimeData)(remain);
if (children) {
onChange === null || onChange === void 0 ? void 0 : onChange({
detail: timeData
});
}
setState(function (pre) {
return _objectSpread(_objectSpread({}, pre), {}, {
formattedTime: (0, _util.parseFormat)(format, timeData)
});
});
if (remain === 0) {
_pause();
onFinish === null || onFinish === void 0 ? void 0 : onFinish();
}
}, [children, format, onChange, onFinish, _pause]);
var microTick = (0, _react.useCallback)(function () {
_ref.current.tid = simpleTick(function () {
setRemain(getRemain());
if (_ref.current.remain !== 0) {
microTick();
}
});
}, [getRemain, setRemain]);
var macroTick = (0, _react.useCallback)(function () {
_ref.current.tid = simpleTick(function () {
var remain = getRemain();
if (!(0, _util.isSameSecond)(remain, _ref.current.remain) || remain === 0) {
setRemain(remain);
}
if (_ref.current.remain !== 0) {
macroTick();
}
});
}, [getRemain, setRemain]);
var tick = (0, _react.useCallback)(function () {
if (millisecond) {
microTick();
} else {
macroTick();
}
}, [macroTick, microTick, millisecond]); // 开始
var _start = (0, _react.useCallback)(function () {
if (_ref.current.counting) {
return;
}
_ref.current.counting = true;
_ref.current.endTime = Date.now() + _ref.current.remain;
tick();
}, [tick]); // 重置
var _reset = (0, _react.useCallback)(function () {
_pause();
_ref.current.remain = time;
setRemain(_ref.current.remain);
if (autoStart) {
_start();
}
}, [autoStart, _pause, setRemain, _start, time]);
(0, _react.useImperativeHandle)(ref, function () {
return {
start: function start() {
_start();
},
pause: function pause() {
_pause();
},
reset: function reset() {
_reset();
}
};
});
(0, _react.useEffect)(function () {
_reset();
}, // eslint-disable-next-line react-hooks/exhaustive-deps
[time]);
var tid = _ref.current.tid;
(0, _react.useEffect)(function () {
return function () {
tid && clearTimeout(tid);
}; // eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.View, _objectSpread(_objectSpread({
className: "van-count-down ".concat(className),
style: style
}, others), {}, {
children: children ? children : /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
children: formattedTime
})
}));
}
var CountDown = /*#__PURE__*/(0, _react.forwardRef)(Index);
exports.CountDown = CountDown;
var _default = CountDown;
exports.default = _default;