UNPKG

@react-hook/debounce

Version:

A React hook for debouncing setState and other callbacks

71 lines (54 loc) 2.25 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) : typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) : (global = global || self, factory(global.UseDebounce = {}, global.React)); }(this, (function (exports, React) { 'use strict'; var useLatest = function useLatest(current) { var storedValue = React.useRef(current); storedValue.current = current; return storedValue; }; var useDebounceCallback = function useDebounceCallback(callback, wait, leading) { if (wait === void 0) { wait = 100; } if (leading === void 0) { leading = false; } var storedCallback = useLatest(callback); var timeout = React.useRef(); var deps = [wait, leading, storedCallback]; // Cleans up pending timeouts when the deps change function _ref() { timeout.current && clearTimeout(timeout.current); timeout.current = void 0; } React.useEffect(function () { return _ref; }, deps); function _ref2() { timeout.current = void 0; } return React.useCallback(function () { // eslint-disable-next-line prefer-rest-params var args = arguments; var current = timeout.current; // Calls on leading edge if (current === void 0 && leading) { timeout.current = setTimeout(_ref2, wait); // eslint-disable-next-line prefer-spread return storedCallback.current.apply(null, args); } // Clear the timeout every call and start waiting again current && clearTimeout(current); // Waits for `wait` before invoking the callback timeout.current = setTimeout(function () { timeout.current = void 0; storedCallback.current.apply(null, args); }, wait); }, deps); }; var useDebounce = function useDebounce(initialState, wait, leading) { var state = React.useState(initialState); return [state[0], useDebounceCallback(state[1], wait, leading), state[1]]; }; exports.useDebounce = useDebounce; exports.useDebounceCallback = useDebounceCallback; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=use-debounce.dev.js.map