javascript - 使用“深度”数组对 useState 做出反应,而不是重新渲染组件
问题描述
我有一个使用useState()
React 存储的二维数组。当我更新数组中的一个值时(创建一个全新的 2D 数组,它实际上并没有使用新值重新渲染我的组件。只有在更新 2D 数组后执行其他操作时,组件才会更新导致组件
我的数组定义如下:
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
}
推荐阅读
- asp.net-core - 部分视图中的模型为空 - asp.net core razor pages
- angular - 角度材料表:即使没有设置过滤器,如何始终激活过滤?
- ios - 在后台扫描 BLE 外设的 RSSI
- java - 无法配置数据源:未指定“url”属性,并且在 application.properties 中设置了 dispite 属性
- javascript - 在javascript / typescript中处理链接回调的最佳方法是什么
- r - geom_text() 在 ggplot 中标记来自不同绘图的两个单独的点
- mysql - 优化分页查询
- python - PyMongo + Flask:如何用 jinja 渲染内容?
- python - Python从txt中提取列列表,然后删除重复项并在newlist中排序
- c# - 通过属性过滤字典