ht_hooks
Version:
ht React 业务 Hooks
54 lines • 1.89 kB
JavaScript
import { __read, __spreadArray } from "tslib";
import { debounce } from '../utils/lodash-polyfill';
import { useMemo, useState, useEffect } from 'react';
import useLatest from '../useLatest';
import useUnmount from '../useUnmount';
import { isFunction } from '../utils';
import isDev from '../utils/isDev';
function useDebounceFn(fn, options) {
var _a;
if (isDev) {
if (!isFunction(fn)) {
console.error("useDebounceFn expected parameter is a function, got ".concat(typeof fn));
}
}
var fnRef = useLatest(fn);
var wait = (_a = options === null || options === void 0 ? void 0 : options.wait) !== null && _a !== void 0 ? _a : 1000;
var debounced = useMemo(function () {
return debounce(function () {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
return fnRef.current.apply(fnRef, __spreadArray([], __read(args), false));
}, wait, options);
}, []);
useUnmount(function () {
debounced.cancel();
});
return {
run: debounced,
cancel: debounced.cancel,
flush: debounced.flush
};
}
export default useDebounceFn;
//课上写法
var useDebounce2 = function (value, delay) {
if (delay === void 0) {
delay = 500;
}
var _a = __read(useState(value), 2),
debouncedValue = _a[0],
setDebouncedValue = _a[1];
useEffect(function () {
var timer = setTimeout(function () {
setDebouncedValue(value); //一段时间value不变,取debouncedValue未最新的value
}, delay);
return function () {
clearTimeout(timer);
};
}, [value, delay]); //#value更新时执行上一次的return(清楚上次定时器)和本次内容(新建定时器)
return debouncedValue;
};
//setDebouncedValue(value) 触发了 setState,React 组件会重新渲染,useDebounce2 也会重新执行,return debouncedValue 会返回新的值