reactjs - 在 useEffect 中使用 setter 和 setInterval 时状态不更新
问题描述
我有以下代码,我希望它每 2 秒在屏幕上多打印 10 个。但是,它只打印 10 次。console.log(digits)
给了我正确的 10 数组。如何每 2 秒向数组添加 10 并在每次添加 10 时在屏幕上打印更新的数组?
这里的代码沙箱:https ://codesandbox.io/s/silly-https-zk58p?file=/src/App.js
import { useEffect, useState } from "react";
let data = [];
export default function App() {
const [digits, setDigits] = useState([]);
useEffect(() => {
let timer = setInterval(() => {
data.push(10);
setDigits(data);
console.log(digits);
}, 2000);
return () => clearInterval(timer);
}, [digits]);
return <div className="App">{digits}</div>;
}
解决方案
问题在于setDigits(data)
. 使用数组,您应该执行setDigits([...data])
.
另一种方法是这样做:
let timer = setInterval(() => {
setDigits([...digits, 10]);
}, 2000);
每当处理对象时,您应该将它们视为不可变对象。这里发生的是你修改一个数组并将 SAME 数组推入一个状态。虽然值可能不同,但数组实际上是相同的,因此它不会更新渲染。每当这样做[...data]
时,它都会创建一个具有相同值的新数组,从而触发更新。
useEffect
获取新的值更改,因此它为什么再次触发(不能被观察到console.log()
),但这不会触发组件的重新渲染。
推荐阅读
- java - Android Firebase 实时数据库 orderByChild 不起作用
- mysql - MySQL删除多个表上所有匹配记录的连接
- swift - “未能获得匹配的快照:评估 UI 查询时超时。” 在 XCUITest
- javascript - 如何使用棘轮通过单个 websocket 发送请求发送对象数组?
- python - 翻译 Python 字典中的数字代码值
- javascript - 传单有时会在设置为当前位置时显示世界地图
- amp-html - 修改 AMP 页面中链接的亚马逊会员 ID
- javascript - 如果存在分隔符,如何匹配字符串结尾,如果不存在,如何匹配字符串结尾,并使用正则表达式提取它?
- python - 图 api 的 Python 脚本在 power bi 中刷新时出错
- c++ - 如何在文本的左侧和右侧用空格填充字符数组