javascript - 反应状态更新:更新计时器中的状态不会正确更新值
问题描述
我正在尝试渲染roles
数组中的每个元素。此代码在计时器(setInterval
)中工作如下:
分配变量中状态的重复值及其在
let prevRole
变量中的对应索引let prevRoleIndex
。以 50 毫秒的延迟迭代渲染随机字符串 10 次。
现在
roles
数组中的下一个元素被分配给let newRole
变量,通过添加 +1previousRoleIndex
然后使用 newRole 变量更新状态。
import {useState, useEffect} from 'react'
const roles = ['Web Developer & UX Designer', 'Software Developer / Engineer', 'Blockchain Developer', 'Data Anaylist/ Scientist']
export default function App() {
const [role, setRole] = useState(roles[0])
const sleep = (value) =>{
return new Promise(r => setTimeout(r, value));
}
const getRandomString = () =>{
return (Math.random()).toString(36).substring(2);
}
useEffect(() => {
const timer = setInterval(async() => {
console.log("Timer has started")
let prevRole = role;
let prevRoleIndex = roles.findIndex((ele)=>ele===prevRole)
console.log("Previous Role State: "+ prevRole)
for(let i=0; i<10; i++){
setRole(getRandomString())
await sleep(50)
}
prevRoleIndex = prevRoleIndex+1 >= roles.length? -1: prevRoleIndex
let newRole = roles[prevRoleIndex+1]
console.log("New Role State: "+ newRole)
setRole(newRole)
}, 3000);
return () => clearInterval(timer);
}, []);
return(
<div>
<h1>{role}</h1>
</div>
)
}
该代码在第一次计时器迭代期间工作正常,在第二次迭代后状态不会更新。
解决方案
推荐阅读
- lua - 如何在一段时间内保持一个值
- kubernetes - 如何将 Istio-ingressgateway 类型从“LoadBalancer”更改为“ClusterIP”
- python - 501 无效请求
- angular - 错误:发生未处理的异常:对象原型可能只是一个对象或 null:从 Angular 7 迁移到 9 时未定义
- excel - 在工作簿中循环通过 Excel 工作表
- python - Streamlit 输入更改时的重置结果
- java - 使用二进制搜索查找旋转点,为什么要与第一个元素进行比较?
- vuetify.js - Vuetify:单击 v-tab 中的选项卡时更新 URL
- xml - XPath 后代属性过滤器包含
- go - golang:使 select statemet 具有确定性?