我正在学习 React 并正在开发 John Conway 的 Game of Life 应用程序。我在状态/构造函数中定义了一个二维数组,它创建了一个正方形游戏板。我有一个名为的函数isSquareAlive
,它处理网格中的特定方块在生命游戏的意义上是否“活着”,并更新方块并将它们设置为如果用户点击它们则它们是活着的。我还有另一个名为selectBoardSize
的函数,它允许用户单击按钮并调整板的大小。
当应用程序安装时,我会生成一个随机板,其中填充了一些设置为“活动”的方块,而另一些则没有。我在里面处理这个componentDidMount
:
componentDidMount = () => {
const data = this.state.board;
// Creates random decimal number between 0 and 1
const startingBoard = data.map(a => a.map(Math.random));
// Rounds decimal numbers to either 0 or 1 so the grid can display whether the cell is alive or dead
const rounded = startingBoard.map(a => a.map(Math.round));
this.setState({
board: rounded
});
}
这工作正常。如果用户尝试通过selectBoardSize
我想更改板的大小来调整板的大小,然后再次用随机的“活动”单元格填充它。这里是selectBoardSize
:
// Allows user to click button and change size of game board
selectBoardSize = (width, height) => {
this.setState({
boardHeight: height,
boardWidth: width,
board: Array(this.state.boardHeight).fill(0).map(_ =>
Array(this.state.boardWidth).fill(0))
});
{/*this.onChangeBoardSize(width, height);*/}
}
当用户更改电路板尺寸时,我试图用来componentDidUpdate
获取新的电路板尺寸并用该电路板尺寸的随机“活动”单元格填充它,就像我最初使用componentDidMount
. 这是我遇到困难的地方。
这是我的componentDidUpdate
:
// Attempts to fill board with random alive squares when user resizes the size of the board via onClick/selectBoardSize()
componentDidUpdate = (prevProps, prevState) => {
console.log('PrevState is : ' + prevProps, prevState);
// Attempts to update board height and width and then populate board with random "alive" squares
if(this.state.boardWidth !== prevState.boardWidth) {
if(this.state.boardHeight !== prevState.boardHeight) {
// Console.log runs, if statements equate to true when user resizes board
console.log('Nested if statements in componentDidUpdate triggered');
const boardWidth = this.state.boardWidth;
const boardHeight = this.state.boardHeight;
const data = this.state.board;
// Creates random decimal number between 0 and 1
const startingBoard = data.map(a => a.map(Math.random));
// Rounds decimal numbers to either 0 or 1 so the grid can display whether the cell is alive or dead
const rounded = startingBoard.map(a => a.map(Math.round));
this.setState({
boardWidth: boardWidth,
boardHeight: boardHeight,
board: rounded
})
}
}
}
当用户单击按钮来调整它的大小时,板成功地改变了尺寸,但它不会像它应该那样生成随机的“活动”方块。它只是改变了板的高度和宽度,但板是空的。
调整大小时如何使用componentDidUpdate
随机“活动”单元填充游戏板(类似于最初安装时的操作,但在板改变大小时调整大小)。是componentDidUpdate
正确的方法吗?这是 setState 异步的问题吗?
很确定我想多了。
您可以在codesandbox上查看代码。