You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React.js开发围棋游戏时历史棋盘状态遭突变覆写的问题

React围棋游戏历史状态同步修改问题解决

我用React开发围棋游戏,采用二维数组存储棋盘状态,更新最新状态没问题,但所有历史记录里的过往棋盘状态都会被修改成最新状态,导致跳转历史时棋盘没有变化。

问题根源

JavaScript中数组属于引用类型,你在handlePlay里直接将nextSquares添加到历史数组时,只是把同一个数组的引用存了进去。后续修改这个数组时,所有指向它的历史项都会同步变化——因为它们本质上是同一个数组。

解决方法

每次添加新状态到历史记录前,对棋盘数组做深拷贝,让每个历史状态都是独立的二维数组,互相不影响。

修改handlePlay函数,对nextSquares进行深拷贝:

function handlePlay(nextSquares) {
  // 深拷贝二维数组:遍历每一行并拷贝,生成全新的棋盘数组
  const newBoard = nextSquares.map(row => [...row]);
  const nextHistory = [...history.slice(), newBoard];
  setHistory(nextHistory);
  setCurrentMove(nextHistory.length - 1);
}

也可以在生成nextSquares的环节(比如落子计算新棋盘时)直接创建新数组,从源头避免引用问题:

// 示例:落子时生成新棋盘的逻辑
function makeMove(x, y, player) {
  // 先拷贝当前棋盘,生成新数组
  const newSquares = currentBoard.map(row => [...row]);
  // 修改新棋盘的对应位置
  newSquares[x][y] = player;
  // 传递新棋盘给handlePlay
  handlePlay(newSquares);
}

验证效果

修改后,每个历史记录项都是独立的二维数组,后续修改新状态不会影响之前的历史数据,调用jumpTo跳转时,棋盘就能正确显示对应历史状态了。

内容的提问来源于stack exchange,提问作者WillEu Jeans

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:25:25