我有这个代码,我想从这个组件外部清除Interval(假设我用调用clearInterval函数的onClick方法呈现了一个按钮(。我试图将interval值作为ref传递,但一旦状态更新,这个值就会更改。
useEffect(() => {
(intervalRef.current as ReturnType<typeof setInterval> | undefined) = setInterval(() => {
fetch().then((items) => {
items.forEach((item, id) => {
// set state based on the values
});
});
}, 5000);
return () => clearInterval(intervalRef.current);
}, [state]);
我还收到了return () => clearInterval(intervalRef.current)
的esint警告,所以我认为它在这个方法内部也不会正确清除。
"运行此效果清除函数时,ref值"intervalRef.current"可能已更改。如果此ref指向React渲染的节点,请将"intervalRef.current"复制到效果内部的变量,并在cleanup函数中使用该变量">
React中对此类问题的正确处理方法是什么?
useEffect(() => {
const intervalId = setInterval(() => {
fetch().then((items) => {
items.forEach((item, id) => {
// set state based on the values
});
});
}, 5000);
return () => clearInterval(intervalId);
}, [state]);
如果您只想在卸载时清除间隔,则不需要将其设为ref。只需将其分配给一个变量,然后将其传递给清理函数即可。
注意:我看到你正在计划进行一次状态更新。您可能会遇到这样的问题:组件被卸载,然后promise回调被触发,试图更新状态。所以也许放一个isMounted检查
"ref值"intervalRef.current"可能已由此效果清除函数运行的时间。如果此引用指向一个节点由React呈现,将"intervalRef.current"复制到效果,并在cleanup函数中使用该变量">
这意味着在useEffect
钩子的回调闭包中保存对ref值的引用,以便在cleanup函数中使用。
useEffect(() => {
(intervalRef.current as ReturnType<typeof setInterval> | undefined) = setInterval(() => {
fetch().then((items) => {
items.forEach((item, id) => {
// set state based on the values
});
});
}, 5000);
const timerId = intervalRef.current;
return () => clearInterval(timerId);
}, [state]);
如果您需要或希望从组件范围内的任何其他位置清除间隔,只需像通常使用当前参考值一样清除间隔:
clearInterval(intervalRef.current);