【发布时间】:2020-12-04 09:27:40
【问题描述】:
我需要下面的第一个 useEffect 在更改网格状态时重新渲染。具体来说,当我将网格对象的一个值重新分配为 true 时,一旦在 changeWall 函数中为 grid 注册了状态更改,我需要包含 initializeGrid() 的 useEffect 重新渲染。我需要此更改以立即重新渲染 initializeGrid() 函数
import React, { useState, useEffect } from "react";
const Pathfind = () => {
const [grid, setGrid] = useState(false);
useEffect(() => {
initializeGrid();
}, []);
const initializeGrid = () => {
grid = new Array(X);
for (let i = 0; i < Y; i++) {
grid[i] = new Array(Y);
}
setGrid(grid);
};
let isMouseDown = false;
function changeWall(e) {
let id = e.target.id;
grid[id.y][id.x].isWall = true;
}
useEffect(() => {
document.addEventListener("mousedown", function () {
isMouseDown = true;
document.onmouseup = () => {
isMouseDown = false;
document.removeEventListener("mouseover", changeWall);
};
if (mouseIsDown) {
document.addEventListener("mouseover", changeWall);
}
});
}, []);
};
export default Pathfind;
【问题讨论】:
-
首先你的代码看起来很奇怪,我不认为你可以在功能组件之外使用反应钩子,也没有渲染?
-
如果您在任何网格中运行您的 initializeGrid 函数,则更改其创建新网格而不进行更改,并为该网格分配设置状态,因此您将看不到任何更改
-
我看到了循环的风险,如果您希望 useEffect 对触发更改的同一属性的更改做出反应。我建议您仅使用 useEffect 对组件外部的更改做出反应。您可能想改为运行 initializeGrid。这样,在组件首次启动时设置网格,并在需要更改网格时重置。将新值传递给 initializeGrid 而不是直接传递给 setGrid。如上所述,您的示例中缺少一些代码。
标签: reactjs rendering addeventlistener use-effect use-state