reactjs - 反应 setInterval 状态未更改/更新
问题描述
也许我错过了一些东西,但我找不到解决方案。
我有一个 React 组件,想要运行一些周期性的后台作业 (setInterval) 这个作业使用组件状态的一些信息,并且应该能够改变它。
我的组件:
export default function Form() {
const [state, setState] = useState<IState>(initialState);
useEffect(() => {
//init component and other stuff
// trigger background Task
setInterval(backgroundJob, 10000);
}, []);
function backgroundJob(){
state.xxx
}
function handleButtonClick(){
state.xxx = state.xxx + 1;
setState({
...state,
});
}
}
主要问题是, backgroundJob 函数能够访问状态,但它只是initalState
. 如果更新了,(例如,通过函数state
单击按钮),下一个间隔刻度在handleButtonClick()
state
我在这里误解了一些基本概念吗?
解决方案
您需要添加backgroundJob
到您的依赖项列表,但还需要在重新运行效果时清除此间隔:
请注意,在您编写代码的方式中,每次组件呈现时都会发生这种情况。如果需要,您可以使用useCallback进行优化。
useEffect(() => {
//init component and other stuff
// trigger background Task
const intervalId = setInterval(backgroundJob, 10000);
return () => clearInterval(intervalId)
}, [backgroundJob]);
如果不这样做,backgroundJob
您正在运行的是来自第一个渲染的那个,它只“看到”(通过它的关闭)初始状态(AKA Stale Closure)
推荐阅读
- arrays - TypeScript - 防止只有接口实现的对象推送到对象类实例数组
- c++ - 在模板类的声明和定义分离的情况下防止重新定义问题
- c++ - 在 C++ 中使用 MinGW 工具包含多个类/.o 文件
- flutter - 如何将 RaisedButton 移动到屏幕的底部中心?
- javascript - 输入到输入字段的文本被复制到另一个输入字段值的状态 - 为什么?
- django - DRF 简单 jwt。如何更改 TokenObtainPairView 的响应以获取访问令牌 EXPIRES 时间
- python - numpy 从一维数组中选择多个范围
- r - 如何在 R 中使用 plotly 包中的 ggplotly() 时自定义悬停信息?
- laravel - laravel 枚举验证规则
- javascript - 无法读取未定义的道具