arrays - 尝试在 React Native 中更新 useState 数组中的某些字段
问题描述
我试图从 SQLite 数据库中取回数据行,然后遍历它们,以便我可以操纵每一行的数据以不同的方式呈现它们(即,将日期转换为自定义格式)。
带回数据很好(来自 ReadEntries 函数),我在 useEffect 中执行此操作,以便它只在屏幕加载时运行一次,但复制数组然后更新行似乎不起作用。我认为这可能与设置 useState 数组的值不够快以更新我的重复数组然后对其进行完整快照的事实有关。
当我在 VS Code 中多次保存时,它有时会起作用,大概是因为状态已经存储以供后续屏幕刷新。
useEffect(() => {
var results: SQLite.ResultSetRowList;
const response = async (): Promise<any> => {
await ReadEntries(projectID).then((value) => {
results = value as SQLite.ResultSetRowList;
setEntries(results.raw); //this works
let newEntries = [...entries];
for (let i = 0; i < newEntries.length; i++) {
let newStartDate = new Date(newEntries[i].startDate);
newEntries[i].dateOfEntry = newEntries[i].dateOfEntry;
newEntries[i].startDate =
newStartDate.getDate().toString() +
"/" +
newStartDate.getMonth().toString() +
"/" +
newStartDate.getFullYear().toString();
}
setEntries(newEntries);
});
};
response().catch((error) => {
"ERROR: " + error;
});
}, []);
谢谢
解决方案
带有钩子的状态更新不仅是异步的,而且还受闭包的约束。您不应回复更新的状态以触发同一函数调用中的另一个更改
查看这篇文章以获取更多详细信息:useState set method not reflection change immediate
您可以利用获取的数据来执行操作
useEffect(() => {
var results: SQLite.ResultSetRowList;
const response = async (): Promise<any> => {
await ReadEntries(projectID).then((value) => {
results = value as SQLite.ResultSetRowList;
setEntries(results.raw); // This shouldn't be required.
let newEntries = [...results.raw]; // use results instead of entries
for (let i = 0; i < newEntries.length; i++) {
let newStartDate = new Date(newEntries[i].startDate);
newEntries[i].dateOfEntry = newEntries[i].dateOfEntry;
newEntries[i].startDate =
newStartDate.getDate().toString() +
"/" +
newStartDate.getMonth().toString() +
"/" +
newStartDate.getFullYear().toString();
}
setEntries(newEntries);
});
};
response().catch((error) => {
"ERROR: " + error;
});
}, []);
推荐阅读
- merge - 比较实例和合并drawcall和native之间的FPS
- python - 如何在 gspread 中使用 batch_update 插入行和更改单元格样式?
- eclipse - Netbeans“在文件中查找”,带有周围内容的预览(如 IntelliJ“在路径中查找”/Eclipse“快速搜索”)
- excel - 在表中插入和计算列
- ios - Swift 中的推送通知
- ansible - 如何连接以在远程主机上的 docker 容器内运行 ansible 任务(通过 ssh)
- r - 时间序列 - 按行顺序附加增长数据
- excel - 如何将数据从 Internet Explorer 站点传输到 Excel?按 ID 获取元素(ng-content)
- mysql - mysql查询在几行上查找id满足条件
- fortran - 如何使用字符在 Fortran 中打印数组