下面是一个可变 ref 的示例,该示例存储来自Overreacted 博客的当前回调:
function useInterval(callback, delay) {
const savedCallback = useRef();
// update ref before 2nd effect
useEffect(() => {
savedCallback.current = callback; // save the callback in a mutable ref
});
useEffect(() => {
function tick() {
// can always access the most recent callback value without callback dep
savedCallback.current();
}
let id = setInterval(tick, delay);
return () => clearInterval(id);
}, [delay]);
}
Run Code Online (Sandbox Code Playgroud)
然而,React Hook FAQ 指出不推荐使用该模式:
另请注意,此模式可能会导致并发模式出现问题。[...]
在任何一种情况下,我们都不推荐这种模式,只是为了完整起见在这里展示它。
我发现这种模式对于回调非常有用,但我不明白为什么它会在 FAQ 中出现危险信号。例如,客户端组件可以使用 …