UNPKG

@choerodon/master

Version:
41 lines (34 loc) 1.67 kB
/* 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;