我正在尝试在功能组件中使用来自 lodash
的 throttle
方法,例如:
const App = () => {
const [value, setValue] = useState(0)
useEffect(throttle(() => console.log(value), 1000), [value])
return (
<button onClick={() => setValue(value + 1)}>{value}</button>
)
}
由于 useEffect
里面的方法在每次渲染时都会重新声明,所以节流效果不起作用。
有没有人有一个简单的解决方案?
原文由 Alexandre Annic 发布,翻译遵循 CC BY-SA 4.0 许可协议
经过一段时间后,我确信使用
setTimeout/clearTimeout
(并将其移动到单独的自定义挂钩中)自己处理事情比使用功能帮助程序要容易得多。在我们将其应用于useCallback
之后,处理后一个会产生额外的挑战,因为依赖关系的变化可以重新创建,但我们不想重置延迟运行。下面的原始答案
您可能(并且可能需要)
useRef
在渲染之间存储值。就像 为计时器建议的那样类似的东西
至于
useCallback
:它也可以作为
但是如果我们尝试重新创建回调一次
value
被更改:我们可能会发现它不会延迟执行:一旦
value
被更改,回调会立即重新创建并执行。所以我看到
useCallback
在延迟运行的情况下不会提供显着优势。由你决定。[UPD] 最初是
但是这样
throttled.current
必须通过关闭来初始value
(0)。因此,即使在下一次渲染中,它也从未改变过。因此,由于闭包特性,将函数推入
useRef
时要小心。