为什么我的组件的这一部分在间隔调用时重新呈现?
Why is this part of my component rerending on interval call?
我正在构建一个带有 React 钩子的测验应用程序,但遇到了一些问题。
我有一个从 20 开始的倒计时,设置了间隔,但这导致我的组件中一些不相关的东西重新呈现。
当组件挂载时,我使用Effect 为每个头像附加一个分数。 allAvatars 是传递给该组件的道具。
const [userScores, setUserScores] = useState([])
useEffect(() => {
const userScoreObject = allAvatars.map((user) => {
user.score = 0;
return user;
})
setUserScores(userScoreObject);
}, [])
然后我根据游戏状态为我的计时器设置另一个 useEffect。
useEffect(() => {
let interval;
if (gameState === 'play') {
interval = setInterval(() => {
setTimer(timer -= 1)
}, 1000)
} else if (gameState === 'pause') {
return clearInterval(interval);
}
return () => clearInterval(interval)
}, [gameState])
我只将 gameState 放在依赖项数组中,因为我只希望在游戏状态更改时调用此效果。游戏状态初始化为'play'
在我的 JSX 中映射这些用户分数。
{
userScores &&
userScores.map((user, index) => {
console.log(user)
return (
<div key={index} >
<img src={user.avatar} alt='avatar'></img>
<p>{user.score}</p>
</div>
)
})
}
问题是这个控制台日志每秒都在发生。为什么计时器会导致它重新渲染?
谢谢
当组件的状态发生变化时,React 总是会完全重新渲染组件。因此,setTimer
调用将导致您的渲染函数执行。请确保不要将 重新渲染 与 DOM 更新.
混淆
由于虚拟 DOM 减少了对页面的更改,因此重新呈现通常是可以接受的性能影响,但会产生 一些 成本。如果正在进行一些昂贵的渲染,你可以考虑将你不想重新渲染的部分拆分成它自己的组件,并在其上使用 React.memo
这样即使父组件重新渲染它不会(前提是它的道具不改变)。
我正在构建一个带有 React 钩子的测验应用程序,但遇到了一些问题。
我有一个从 20 开始的倒计时,设置了间隔,但这导致我的组件中一些不相关的东西重新呈现。
当组件挂载时,我使用Effect 为每个头像附加一个分数。 allAvatars 是传递给该组件的道具。
const [userScores, setUserScores] = useState([])
useEffect(() => {
const userScoreObject = allAvatars.map((user) => {
user.score = 0;
return user;
})
setUserScores(userScoreObject);
}, [])
然后我根据游戏状态为我的计时器设置另一个 useEffect。
useEffect(() => {
let interval;
if (gameState === 'play') {
interval = setInterval(() => {
setTimer(timer -= 1)
}, 1000)
} else if (gameState === 'pause') {
return clearInterval(interval);
}
return () => clearInterval(interval)
}, [gameState])
我只将 gameState 放在依赖项数组中,因为我只希望在游戏状态更改时调用此效果。游戏状态初始化为'play'
在我的 JSX 中映射这些用户分数。
{
userScores &&
userScores.map((user, index) => {
console.log(user)
return (
<div key={index} >
<img src={user.avatar} alt='avatar'></img>
<p>{user.score}</p>
</div>
)
})
}
问题是这个控制台日志每秒都在发生。为什么计时器会导致它重新渲染?
谢谢
当组件的状态发生变化时,React 总是会完全重新渲染组件。因此,setTimer
调用将导致您的渲染函数执行。请确保不要将 重新渲染 与 DOM 更新.
由于虚拟 DOM 减少了对页面的更改,因此重新呈现通常是可以接受的性能影响,但会产生 一些 成本。如果正在进行一些昂贵的渲染,你可以考虑将你不想重新渲染的部分拆分成它自己的组件,并在其上使用 React.memo
这样即使父组件重新渲染它不会(前提是它的道具不改变)。