javascript - 使用 "deep"数组 react useState 不重新渲染组件

标签 javascript reactjs

我在 React 中使用 useState() 存储了一个二维数组。当我更新数组中的某个值时(创建一个全新的二维数组),它实际上不会使用新值重新渲染我的组件。只有在更新二维数组后我执行其他操作时,该组件才会更新导致组件

我的数组定义如下:

const [grid, setGrid] = useState([
    ['', '', ''],
    ['', '', ''],
    ['', '', '']
  ]

我是这样更新的

    setGrid(prevGrid => {
      const newRow = prevGrid[posy]
      newRow[posx] = currentPlayer
      const newGrid = prevGrid
      newGrid[posy] = newRow
      return newGrid
    }

最后,我在这样的组件中使用它:

<Square status={grid} y={2} x={0} clickEvent={() => handleBoxClick(2, 0)} /

我怀疑问题与状态对象的“深度”有关,但我不认为 React 存在与 Vue 没有检测深度更新相同的问题。 (我以前是 Vue 开发人员)所以,我认为我在更新状态方面做错了什么。

谢谢

最佳答案

React 使用引用比较来检测更改,因此您必须以不可变的方式修改数组。

setGrid(prevGrid => {
  const newRow = [...prevGrid[posy]]
  newRow[posx] = currentPlayer
  const newGrid = [...prevGrid]
  newGrid[posy] = newRow
  return newGrid
}

关于javascript - 使用 "deep"数组 react useState 不重新渲染组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68684549/

相关文章:

javascript - FFmpeg HLS 单个文件扩展名和按字节范围格式化

javascript - 如何在 javascript 中对所有 child 的属性求和?

javascript - Angular 7 和 webpack 中的未捕获错误 : Can't resolve all parameters for LoginComponent: (?)

reactjs - 使用webpack时如何临时开启/关闭React开发模式?

reactjs - 如何获取ag-Grid中的选择顺序?

javascript - 使用 ScrollMagic 在 iOS Safari 上的全高视差页面上滚动时,引脚会跳​​动

javascript - CAML 查询在周已拆分月时不起作用,即第 31 至第 4 只返回第 31

javascript - react 路由器 : hiding or removing a component on a specific path

reactjs - 使用 React 和 Material-UI 控件显示选择控件的默认值

javascript - React-router - 如何在 React 中的页面之间传递数据?