python - 如何在每次循环迭代时更新 React 状态
问题描述
我已经构建了一个解决迷宫的 python 程序,并且我正在尝试制作一个 React 应用程序来可视化它。我已经成功连接了 python 端和我拥有的基本 React 端,我可以可视化程序的迷宫部分。问题是解决迷宫的代理只会出现在目标上方,而不是通过迷宫
迷宫是一个网格,上面随机放置障碍物(如图) 有障碍的迷宫
我试图让代理(这将是一个蓝色方块)一次通过迷宫一个瓷砖,大约每 100 毫秒。React端从python端获取的数据如下:
Python 传递带有目标的初始迷宫矩阵,只有障碍物
Python 然后传递一个数组,其中包含代理移动到
EX 的每个坐标。[[0,0],[0,1],[1,1],[2,1]]
React 显示带有障碍物和目标的初始迷宫矩阵,但是当我尝试遍历代理的坐标数组时,它只显示代理最后一次全部移动的每个图块(如图所示)显示的代理位置 这是新的迷宫生成,障碍物与第一张图像不同
我知道 React 状态只会在循环结束时更新一次。我想找到一种方法让它每次迭代更新一次,迷宫在每次迭代开始时重置为原始状态,然后放置代理。我认为相关的代码如下
开始迷宫动作(在用户按下按钮后发生)
startMaze = () => {
this.state.apiClient.startMaze().then((data) => this.moveAgent(data));
};
移动代理函数(注意:有一个初始矩阵和一个当前矩阵。当前矩阵是我拥有的持有目标和障碍物的代理位置,初始矩阵只有目标和障碍)
moveAgent = (data) => {
data.map((coords) => {
var newMatrix = this.state.matrix;
newMatrix[coords[0]][coords[1]] = 2;
this.setState({ currentMatrix: newState });
sleep(1000);
});
};
如果还有其他需要解决的问题,请告诉我,我会添加它。
解决方案
我想你可以用它setTimeout
来解决你的问题。也许是这样的:
moveAgent = (data) => {
if(data.length < 1) return;
var coords = data.shift();
var newMatrix = this.state.matrix;
newMatrix[coords[0]][coords[1]] = 2;
this.setState({ currentMatrix: newState });
setTimeout(() => { moveAgent(data); }, 1000);
};
JS 中不存在睡眠。所以我们在这里使用的是setTimeout
在给定时间(这里是 1000 毫秒,所以是 1 秒)之后调用一个函数。我们用它再次调用函数,每次都使用和删除数组的第一个元素。
推荐阅读
- swift - 使用 Swift 在 Firebase 中通过给定电子邮件获取用户的 uid
- python - 为什么 patch.dict 在用作装饰器时不起作用?
- java - 带有来自 HSM 的密钥库的 CXF WS-Security
- wsdl - API自动化测试中的wsdl
- java - 片段中的 OnPostExecute 方法
- tkinter - Python tkinter 入口小部件,将点保持在固定位置
- java - 如何阅读成绩并删除低于平均水平的成绩
- mongodb - 如何加载 v2.4 数据库的 mongodump
- sql - 如何区分表中使用相同查找表的两列?
- php - 如何在laravel中缓存函数的结果