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

React二维数组状态偶尔被填充为全零,如何解决?

解决React中二维邻接矩阵状态更新异常问题

问题根源

你代码里的核心问题是二维数组的浅拷贝:

  • 使用const newAdjacencyMatrix = [...adjacencyMatrix]仅拷贝了外层数组,内层的每个子数组仍然和原状态共享引用。修改新数组的内层元素时,会直接污染原状态,导致React DevTools显示的状态与UI不一致,后续更新还会出现数值被意外清零的情况。
  • 另外你的差值计算逻辑完全可以简化,没必要绕弯子直接用输入值即可。

修复方案

需要对二维数组做深拷贝,确保新状态与原状态完全独立,以下是两种可靠的实现方式:

方式1:使用map逐行拷贝(推荐,性能更优)

这种方式只拷贝需要的层级,适合结构固定的二维数组:

<input
  type="number"
  value={adjacencyMatrix[rowNode.id - 1][columnNode.id - 1]}
  min={0}
  step={1}
  onChange={(event) => {
    const inputValue = +event.target.value;
    // 深拷贝二维数组:外层数组拷贝 + 每个子数组单独拷贝
    const newAdjacencyMatrix = adjacencyMatrix.map(row => [...row]);
    const rowIdx = rowNode.id - 1;
    const colIdx = columnNode.id - 1;

    // 更新当前单元格
    newAdjacencyMatrix[rowIdx][colIdx] = inputValue;
    // 对称更新(非对角线情况)
    if (rowNode.id !== columnNode.id) {
      newAdjacencyMatrix[colIdx][rowIdx] = inputValue;
    }

    setAdjacencyMatrix(newAdjacencyMatrix);
  }}
  id={`adjacency${rowNode.id}${columnNode.id}`}
/>

方式2:JSON序列化反序列化(适合简单结构)

如果你的矩阵元素都是基础类型(比如数字),可以用这种快速深拷贝方式:

// 替换拷贝逻辑即可
const newAdjacencyMatrix = JSON.parse(JSON.stringify(adjacencyMatrix));

修复原理

通过深拷贝生成完全独立的新数组后,修改新数组的元素不会影响原状态,React能够正确追踪状态的变化,确保DevTools显示的状态与UI同步,后续更新也不会出现之前的清零问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:25:56