【发布时间】:2020-03-19 21:31:30
【问题描述】:
我在使用 useState 和 useEffect 挂钩时遇到问题
import { useState, useEffect } from "react";
const counter = ({ count, speed }) => {
const [inc, setInc] = useState(0);
useEffect(() => {
const counterInterval = setInterval(() => {
if(inc < count){
setInc(inc + 1);
}else{
clearInterval(counterInterval);
}
}, speed);
}, [count]);
return inc;
}
export default counter;
上面的代码是一个计数器组件,它在props中获取count,然后用0初始化inc并递增直到它等于count
问题是每次我得到 0 时,我都没有在 useEffect 和 setInterval 的回调中获得更新的 inc 值,因此它将 inc 呈现为 1,而 setInterval 永远不会清楚。我认为 inc 必须关闭使用 useEffect 和 setInterval 的回调,所以我必须在那里获取更新 inc,所以也许这是一个错误?
我无法在依赖项中传递 inc(在其他类似问题中建议),因为在我的情况下,我在 useEffect 中设置了 setInterval,因此在依赖项数组中传递 inc 会导致无限循环
我有一个使用有状态组件的可行解决方案,但我想使用功能组件来实现这一目标
【问题讨论】:
-
对否决票有什么解释吗?
-
尝试使用回调来使用最新值:
setInc(inc => inc + 1);。如果有帮助,请告诉我。 -
那么请告诉我们你是如何使用这个钩子的
-
请注意,你的钩子不能这么简单,因为 useEffect 需要
speed和inc作为依赖项,你应该返回一个函数来清除间隔 -
@Alvaro,我尝试使用 setInc(inc => inc + 1);现在我在 setInc 的回调中更新了 inc,但仍然没有在 setInterval 的回调中更新 inc,所以它永远不会进入导致无限循环的 else 条件
标签: javascript reactjs react-hooks use-effect