【发布时间】:2023-03-11 16:28:01
【问题描述】:
我创建了这个非常简单的应用程序来解释这个问题。
我尝试使用记忆和回调,但我相信它会重新渲染,因为一旦我输入文本输入,playerArr 总是会发生变化。
我的实际列表大小只有 15 个元素,但重新渲染导致它在输入输入时变得非常慢。
有什么建议吗?我有一个最后期限,我感到压力很大 =( 会回到非钩子帮助吗?或实施 redux?不确定性能因素。
function App() {
const [player1, setPlayer1] = React.useState({
firstName: "First",
lastName: "Last ",
id: uuidv4()
});
const [player2, setPlayer2] = React.useState({
firstName: "First",
lastName: "Last",
id: uuidv4()
});
const [player3, setPlayer3] = React.useState({
firstName: "First",
lastName: "Last",
id: uuidv4()
});
return (
<div>
<State
player1={player1}
player2={player2}
player3={player3}
setPlayer1={setPlayer1}
setPlayer2={setPlayer2}
setPlayer3={setPlayer3}
/>
</div>
);
}
//----------------------------------------------------------
export const State = React.memo(({player1, player2, player3, setPlayer1, setPlayer2, setPlayer3}) => {
const playerArr = [player1, player2, player3];
const setPlayerArr = [setPlayer1, setPlayer2, setPlayer3];
return (
<div>
<Playlist
playerArr={playerArr}
setPlayerArr={setPlayerArr}
/>
</div>
);
});
//----------------------------------------------------------
export const Playlist = React.memo(({playerArr, setPlayerArr}) => {
return (
<div>
{
playerArr.map((player, index) => (
<Player
key={player.id}
player={player}
setPlayer={setPlayerArr[index]}
/>
))
}
</div>
);
});
//----------------------------------------------------------
export const Player = React.memo(({player, setPlayer}) => {
const handleOnChange = React.useCallback((event) => {
const playerCopy = {...player};
playerCopy[event.target.name] = event.target.value;
setPlayer(playerCopy);
}, [player, setPlayer]);
return (
<div>
<input type={"text"} name={"firstName"} value={player.firstName} onChange={handleOnChange}/>
<input type={"text"} name={"lastName"} value={player.lastName} onChange={handleOnChange}/>
</div>
);
});
编辑:我根据讨论编辑了应用程序。同样的事情发生
【问题讨论】:
-
那是因为你定义了渲染发生的播放器数组。
-
@JohnRuddell 嘿嘿!那么解决这个问题的最佳方法是什么?谢谢你昨晚的帮助
-
哦嘿哈哈!我可能会将此作为类组件大声笑
-
@JohnRuddell 哈哈。将它作为一个类组件真的会阻止重新渲染吗?为什么这与钩子相比会有所不同?我基本上还是会做同样的事情,不是吗?
-
我可能会做这样的事情。 codesandbox.io/s/react-example-63f0t 。如果您查看控制台日志,您会看到正在呈现的项目。除非您确实需要,否则您不应该真正担心性能方面的任何较重的事情。
标签: javascript reactjs