reactjs - 反应渲染状态不是真实状态
问题描述
我尝试在一秒钟后将我的arr加载设置为false。但是html中的渲染功能似乎与react dev工具中的状态不一样。这是代码和截图。
import { useEffect, useState } from 'react';
const App = (p: any) => {
console.log('render!!');
const [arr, setArr] = useState([{}, {}, {}, {}]);
useEffect(() => {
changeArr();
}, []);
const changeArr = async () => {
const localArr = JSON.parse(JSON.stringify(arr));
for (let i = 0; i < 4; i++) {
const p = new Promise(res => {
setTimeout(() => {
res('');
}, 1000);
});
const res = await p;
localArr[i].loading = false;
setArr(localArr);
}
};
return (
<>
<div>{JSON.stringify(arr)}</div>
</>
);
};
export default App;
解决方案
您应该使用then
来获得承诺的结果
import { useEffect, useState } from "react";
const App = () => {
const [array, setArray] = useState([{}, {}, {}, {}]);
useEffect(() => {
changeArray();
}, []);
function myPromise() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve("");
}, 1000);
});
}
async function changeArray() {
JSON.parse(JSON.stringify(array));
for (let i = 0; i < 4; i++) {
await myPromise().then(() => {
const newArray = [...array];
newArray[i].loading = false;
setArray(newArray);
});
}
}
return (
<>
<div>{JSON.stringify(array)}</div>
</>
);
};
export default App;
推荐阅读
- php - adobe echosine :create webhook from api 给出了 INVALID_API_ACCESS_POINT 的响应
- javascript - JS:如何从base64创建图像类型的文件
- java - 我正在获取 MySQL 服务器版本,以便在“.null”附近使用正确的语法
- android - 由于缺少 JAR 签名,Android Studio 不允许我上传 APK
- ember.js - 尝试将 Ember 2.14.2 更新到 Ember 2.18.2 时出错
- web-services - 如何在短时间内从 GAE 服务轮询 Web 服务?
- c# - 使用数据行测试是否可以在构建时对 TestCategory 进行过滤?
- flutter - 颤振行将一项放在开始,另一项放在中间
- java - 波纹效果在 Android 9(Api 28,Pie)上无法正常工作
- sql-server - SQL Server:字符串连接句柄