reactjs - setInterval 无法在反应中访问变量
问题描述
一个简单的反应脚本:
import React, { useState, useEffect } from 'react';
export default function App() {
const [indexesArray, setIndexesArray] = useState([]);
const doit = () => {
const arr = [];
for(let i = 0;i<10;i++){
arr.push(i);
}
setIndexesArray(arr);
}
useEffect(() => {
if(!indexesArray.length){
doit();
setInterval(function(){
console.log('indexesArray',indexesArray);
}, 2000);
}
}, [indexesArray]);
return (
<>
{indexesArray && JSON.stringify(indexesArray)}
</>
);
}
在页面上我可以看到数组的内容。但是,每 2 秒在控制台中打印一次数组会显示一个空数组。我错过了什么?
解决方案
所使用的indexesArray
绑定是setInterval
存在于创建区间的范围内的数组——它是空的。组件的重新渲染不会改变现有状态 - 它会app
在完全不同的范围内再次运行整体(但这次返回的新值由useState
)。
在您的效果挂钩中,仅当数组已被填充时才设置间隔(并且不要忘记之后清除间隔)。
function App() {
const [indexesArray, setIndexesArray] = React.useState([]);
const doit = () => {
const arr = [];
for(let i = 0;i<10;i++){
arr.push(i);
}
setIndexesArray(arr);
}
React.useEffect(() => {
if(!indexesArray.length){
doit();
} else {
const intervalId = setInterval(function(){
console.log('indexesArray',indexesArray);
}, 2000);
return () => clearInterval(intervalId);
}
}, [indexesArray]);
return indexesArray && JSON.stringify(indexesArray)
}
ReactDOM.render(<App />, document.querySelector('.react'));
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<div class='react'></div>
推荐阅读
- node.js - 具有自定义参数和 EventEmitter 的 Node.JS 模块不起作用
- regex - 拆分字符串,然后删除 Google 表格中的前缀
- python-3.x - 部署 Django 项目后 Weasyprint 不显示图像
- reactjs - UseEffect 中的异步生成器 - 如何取消订阅更新
- node.js - 如果任何值与集合中的数组元素匹配,则查找记录
- r - R组合字符串以循环访问对象
- mongodb - 如何在部署集中添加具有 mongodb 数据库的持久性卷声明,以供部署在 kubernetes 中的 nodejs 微服务使用
- reactjs - React Typescript:类型参数不可分配给类型参数
- javascript - 使用 JsPDF 将多个 Highcharts 图形导出到单个 PDF
- rest - groovyx.net.http 缺少 RESTClient