我正在构建我的第一个React应用,并且遇到了这种情况,在这种情况下,我必须在一个方法中两次调用this.setState()。这些调用之一也是在从该方法调用的嵌套函数中进行的。
就我而言,我正在开发扫雷游戏,而我试图实现的目标是找出玩家在正确标记所有地雷之后是否真正获胜。当设置标志超过包含地雷的每个单元时,玩家将获胜,因此您无法单击它。为此,我创建了一个名为checkIfWin()的方法,该方法执行以下操作:
此函数从两个不同的地方调用
React可以将多个setState()调用批处理为单个更新以提高性能。
所以(很抱歉,问题的长度)是,是否有什么办法可以做到这一点?我实际上将此标记方法绑定为Board的render()内部组件的右键单击处理程序。代码如下。我不在乎您是否知道某些代码或伪代码解决方案。我会把两者都考虑进去,因为我似乎没有为此找到合适的解决方法。我想知道什么
代码:
Inside Board.js render() render() {
const board = this.renderBoard(this.state.boardData);
return (
<div className={classes.board}>
<div className={classes.gameInfo}>
<h1>
{this.state.gameStatus}
</h1>
<span className={classes.info}>
Mines remaining: {this.state.mineCount}
</span>
</div>
{board} //This is a Board component that holds Tiles to which the rightClickHandler() is binded as a prop
</div>
用于管理Tiles标记的rightClickHandler():
rightClickHandler(event, x, y) { event.preventDefault(); // prevents default behaviour such as right click const clickedTile = { ...this.state.boardData[x][y] } //ommit if revealed and if game is ended if (!clickedTile.isRevealed && !(this.state.gameStatus === "YOU WON!")) { let minesLeft = this.state.mineCount; //if not revealed it can be flagged or not if (clickedTile.isFlagged) { //if flagged, unflag it clickedTile.isFlagged = false; minesLeft++; } else { //if not flagged, flag it clickedTile.isFlagged = true; minesLeft--; } //Update the state with new tile and check game status const updatedData = [...this.state.boardData]; updatedData[x][y] = { ...clickedTile }; this.setState({ boardData: updatedData, mineCount: minesLeft, }); //THIS IS WHERE I WOULD LIKE TO checkIfWin() }
最后,checkIfWin():
//Check game progress and returns a boolean: true if win, false if not. checkIfWin() { //No need to create a new array, I'll just reference the one inside state const data = this.state.boardData; const minesLeft = this.state.mineCount; //If flagged as many tiles as mines were initially if (minesLeft === 0) { //get mines as an array of positions const mineArray = this.getMines(data); //get flags as array of positions const flagArray = this.getFlags(data); if (JSON.stringify(mineArray) === JSON.stringify(flagArray)) { //if both arrays are equal, game is won return true; } } else { //if more than 0 mines are left return false return false; } }
TL; DR:我正在尝试使用过时状态访问组件属性的值,该状态应该从render()内JSX组件的单击处理程序中的先前this.setState()调用进行更新。 >
很抱歉,篇幅太长,我希望这是可以理解的。我正在构建我的第一个React应用,并且遇到了这种情况,在这种情况下,我必须在一个方法中两次调用this.setState()。这些调用之一是在从方法...
rightClickHandler(event, x, y) {
// Rest of your code...
// Pass a callback to your setState
this.setState({
boardData: updatedData,
mineCount: minesLeft,
}, this.checkIfWin);
}