@react-hook/throttle
Version:
A React hook for throttling setState and other callbacks
1 lines • 2.92 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../../src/index.tsx"],"sourcesContent":["import * as React from 'react'\nimport useLatest from '@react-hook/latest'\n\nconst perf = typeof performance !== 'undefined' ? performance : Date\nconst now = () => perf.now()\n\nexport function useThrottleCallback<CallbackArguments extends any[]>(\n callback: (...args: CallbackArguments) => void,\n fps = 30,\n leading = false\n): (...args: CallbackArguments) => void {\n const storedCallback = useLatest(callback)\n const ms = 1000 / fps\n const prev = React.useRef(0)\n const trailingTimeout = React.useRef<ReturnType<typeof setTimeout>>()\n const clearTrailing = () =>\n trailingTimeout.current && clearTimeout(trailingTimeout.current)\n const deps = [fps, leading, storedCallback]\n\n // Reset any time the deps change\n React.useEffect(\n () => () => {\n prev.current = 0\n clearTrailing()\n },\n deps\n )\n\n return React.useCallback(function () {\n // eslint-disable-next-line prefer-rest-params\n const args = arguments\n const rightNow = now()\n const call = () => {\n prev.current = rightNow\n clearTrailing()\n storedCallback.current.apply(null, args as any)\n }\n const current = prev.current\n // leading\n if (leading && current === 0) return call()\n // body\n if (rightNow - current > ms) {\n if (current > 0) return call()\n prev.current = rightNow\n }\n // trailing\n clearTrailing()\n trailingTimeout.current = setTimeout(() => {\n call()\n prev.current = 0\n }, ms)\n }, deps)\n}\n\nexport function useThrottle<State>(\n initialState: State | (() => State),\n fps?: number,\n leading?: boolean\n): [State, React.Dispatch<React.SetStateAction<State>>] {\n const state = React.useState<State>(initialState)\n return [state[0], useThrottleCallback(state[1], fps, leading)]\n}\n"],"names":["useThrottleCallback","callback","fps","leading","prev","current","clearTrailing","storedCallback","useLatest","ms","React","trailingTimeout","clearTimeout","deps","args","arguments","rightNow","now","call","apply","setTimeout","useThrottle","initialState","state","perf","performance","Date"],"mappings":"AAMO,SAASA,EACdC,EACAC,EACAC,gBAaIC,EAAKC,QAAU,EACfC,aAfJJ,IAAAA,EAAM,aACNC,IAAAA,EAAU,OAEJI,EAAiBC,EAAUP,GAC3BQ,EAAK,IAAOP,EACZE,EAAOM,EAAa,GACpBC,EAAkBD,IAClBJ,EAAgB,IACpBK,EAAgBN,SAAWO,aAAaD,EAAgBN,SACpDQ,EAAO,CAACX,EAAKC,EAASI,UAG5BG,EACE,MAIAG,GAGKH,GAAkB,eAEjBI,EAAOC,UACPC,EAAWC,IACXC,EAAO,KACXd,EAAKC,QAAUW,EACfV,IACAC,EAAeF,QAAQc,MAAM,KAAML,IAE/BT,EAAUD,EAAKC,WAEjBF,GAAuB,IAAZE,EAAe,OAAOa,OAEjCF,EAAWX,EAAUI,EAAI,IACvBJ,EAAU,EAAG,OAAOa,IACxBd,EAAKC,QAAUW,EAGjBV,IACAK,EAAgBN,QAAUe,WAAW,KACnCF,IACAd,EAAKC,QAAU,GACdI,KACFI,GAGE,SAASQ,EACdC,EACApB,EACAC,OAEMoB,EAAQb,EAAsBY,SAC7B,CAACC,EAAM,GAAIvB,EAAoBuB,EAAM,GAAIrB,EAAKC,mHAzDvD,IAAMqB,EAA8B,oBAAhBC,YAA8BA,YAAcC,KAC1DT,EAAM,IAAMO,EAAKP"}