无痛实现防抖的 React 库!
yarn add use-debounce # 或 npm i use-debounce --save
简单用法:https://codesandbox.io/s/kx75xzyrq7
防抖 HTTP 请求:https://codesandbox.io/s/rr40wnropq
带 leading
参数的防抖 HTTP 请求:https://codesandbox.io/s/cache-example-with-areas-and-leading-param-119r3i
简单用法:https://codesandbox.io/s/x0jvqrwyq
与原生事件监听器结合:https://codesandbox.io/s/32yqlyo815
取消、最大等待时间和记忆化:https://codesandbox.io/s/4wvmp1xlw4
HTTP 请求:https://codesandbox.io/s/use-debounce-callback-http-y1h3m6
https://github.com/xnimorz/use-debounce/blob/master/CHANGELOG.md
根据 https://twitter.com/dan_abramov/status/1060729512227467264 WebArchive 链接:https://web.archive.org/web/20210828073432/https://twitter.com/dan_abramov/status/1060729512227467264
import React, { useState } from 'react'; import { useDebounce } from 'use-debounce'; export default function Input() { const [text, setText] = useState('Hello'); const [value] = useDebounce(text, 1000); return ( <div> <input defaultValue={'Hello'} onChange={(e) => { setText(e.target.value); }} /> <p>实际值:{text}</p> <p>防抖值:{value}</p> </div> ); }
这个钩子使用浅比较来比较前后的值。这意味着设置一个对象 {}
将触发防抖计时器。如果你需要比较对象(https://github.com/xnimorz/use-debounce/issues/27#issuecomment-496828063),你可以使用下面介绍的 useDebouncedCallback
:
除了用于值的 useDebounce
,你还可以对回调进行防抖,这是更常见的防抖理解方式。
带有 Input 的示例(和 React 回调):https://codesandbox.io/s/x0jvqrwyq
import { useDebouncedCallback } from 'use-debounce'; function Input({ defaultValue }) { const [value, setValue] = useState(defaultValue); // 防抖回调 const debounced = useDebouncedCallback( // 函数 (value) => { setValue(value); }, // 延迟时间(毫秒) 1000 ); // 你应该使用 `e => debounced(e.target.value)`,因为 React 使用合成事件 return ( <div> <input defaultValue={defaultValue} onChange={(e) => debounced(e.target.value)} /> <p>防抖值:{value}</p> </div> ); }
带有滚动的示例(和原生事件监听器):https://codesandbox.io/s/32yqlyo815
function ScrolledComponent() { // 仅用于显示没有不必要更新的计数器 const updatedCount = useRef(0); updatedCount.current++; const [position, setPosition] = useState(window.pageYOffset); // 防抖回调 const debounced = useDebouncedCallback( // 函数 () => { setPosition(window.pageYOffset); }, // 延迟时间(毫秒) 800 ); useEffect(() => { const unsubscribe = subscribe(window, 'scroll', debounced); return () => { unsubscribe(); }; }, []); return ( <div style={{ height: 10000 }}> <div style={{ position: 'fixed', top: 0, left: 0 }}> <p>防抖后的顶部位置:{position}</p> <p>组件重新渲染次数:{updatedCount.current}</p> </div> </div> ); }
debounced()
的返回值对防抖函数 debounced
的后续调用会返回最后一次函数调用的结果。
注意,如果之前没有调用,这意味着你将得到 undefined。你应该在代码中适当地检查这一点。
示例:
it('