我应该在 React 中存储大对象的状态吗?
Should I store the state of a large object in React?
我有一个非常大的 Game
对象,它完全决定了游戏的状态,包括渲染的数据和不渲染的数据。它的嵌套值经常更改。
我是否应该将这个非常大的对象存储在一个状态...
const [game, setGame] = useState(new Game()) // Very large Game object
并在游戏的每次小更新中使用 setGame
?例如,
function playerDamage(dmg) {
const nextState = game.copy();
nextState.player.health -= dmg;
setGame(nextState);
}
在我看来,制作 Game 的副本并使用 setGame
对 Game 的每一个小改动都是非常低效的。我的这个假设是否正确,或者 React 和 TS/JS 是否“在幕后”处理得很好?
我想重新表述这个问题:在 React 状态对象中频繁更新深层嵌套值的最佳方法是什么?
是的,如果您复制整个对象:
,您当前的方法可能效率很低
const nextState = game.copy();
如果 game
有那么大,那么频繁进行如此深的复制可能会成为一个问题。但是,对于这种特殊情况,有一个简单的解决方案:不要复制整个东西,只复制需要更改的对象。只有两个对象需要更改(加上新的最终外部状态对象),所以只更改那些,而不是递归复制所有内容。
function playerDamage(dmg) {
setGame({
...game,
player: {
...game.player,
health: game.player.health - dmg
}
});
}
这个版本的 playerDamage
函数会很便宜。
也许您应该尝试使用 Redux 来管理状态并使用商店来管理游戏状态。
我有一个非常大的 Game
对象,它完全决定了游戏的状态,包括渲染的数据和不渲染的数据。它的嵌套值经常更改。
我是否应该将这个非常大的对象存储在一个状态...
const [game, setGame] = useState(new Game()) // Very large Game object
并在游戏的每次小更新中使用 setGame
?例如,
function playerDamage(dmg) {
const nextState = game.copy();
nextState.player.health -= dmg;
setGame(nextState);
}
在我看来,制作 Game 的副本并使用 setGame
对 Game 的每一个小改动都是非常低效的。我的这个假设是否正确,或者 React 和 TS/JS 是否“在幕后”处理得很好?
我想重新表述这个问题:在 React 状态对象中频繁更新深层嵌套值的最佳方法是什么?
是的,如果您复制整个对象:
,您当前的方法可能效率很低const nextState = game.copy();
如果 game
有那么大,那么频繁进行如此深的复制可能会成为一个问题。但是,对于这种特殊情况,有一个简单的解决方案:不要复制整个东西,只复制需要更改的对象。只有两个对象需要更改(加上新的最终外部状态对象),所以只更改那些,而不是递归复制所有内容。
function playerDamage(dmg) {
setGame({
...game,
player: {
...game.player,
health: game.player.health - dmg
}
});
}
这个版本的 playerDamage
函数会很便宜。
也许您应该尝试使用 Redux 来管理状态并使用商店来管理游戏状态。