@choerodon/master
Version:
A package of Master for Choerodon platform.
41 lines (34 loc) • 1.67 kB
JavaScript
/* eslint-disable max-len */
import React, { useEffect, useCallback } from 'react';
import useLatest from "../useLatest";
function useIntervalTrigger(handler, timer, options) {
var _ref = options || {},
_ref$autoStart = _ref.autoStart,
autoStart = _ref$autoStart === void 0 ? false : _ref$autoStart,
_ref$immediate = _ref.immediate,
immediate = _ref$immediate === void 0 ? false : _ref$immediate,
afterClearTimer = _ref.afterClearTimer;
var intervalRef = React.useRef(); // 这里能保证handler是最新的,防止闭包的情况出现,因为hanlder倘若从组件中读取某个值,以这个值为基准做后续操作,就会不生效
var cacheHandlerRef = useLatest(handler);
useEffect(function () {
if (autoStart) {
startTimer();
}
return clearTimer;
}, []);
var clearTimer = useCallback(function () {
intervalRef.current && clearInterval(intervalRef.current);
typeof afterClearTimer === 'function' && afterClearTimer();
}, []);
var startTimer = useCallback(function () {
var _cacheHandlerRef$curr;
immediate && ((_cacheHandlerRef$curr = cacheHandlerRef.current) === null || _cacheHandlerRef$curr === void 0 ? void 0 : _cacheHandlerRef$curr.call(cacheHandlerRef, clearTimer, true));
clearTimer();
intervalRef.current = setInterval(function () {
var _cacheHandlerRef$curr2;
(_cacheHandlerRef$curr2 = cacheHandlerRef.current) === null || _cacheHandlerRef$curr2 === void 0 ? void 0 : _cacheHandlerRef$curr2.call(cacheHandlerRef, clearTimer, false);
}, timer);
}, [clearTimer]);
return [startTimer, clearTimer];
}
export default useIntervalTrigger;