javascript - 为什么我的组件的这一部分会在间隔调用时重新渲染?

标签 javascript reactjs react-hooks setinterval

我正在使用 React hooks 构建一个测验应用程序,但遇到了一些问题。

我有一个从 20 开始的倒计时,并且设置了间隔,但这会导致我的组件中一些不相关的内容重新渲染。

当组件安装时,我使用Effect为每个头像附加一个分数。 allAvatars 是传入此组件的 prop。

 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这样即使父组件重新渲染它也不会(假设它的 props 不改变)。

关于javascript - 为什么我的组件的这一部分会在间隔调用时重新渲染?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61642036/

相关文章:

reactjs - 获取 Ant Design Multi Upload 列表的 Base64 字符串

reactjs - Provider 实例之间是否共享从 React 中的相同上下文派生的上下文值?

reactjs - 如何使用组件中的 Redux-hooks useDispatch 在操作中通过 API 调用来调用函数?

reactjs - 为什么从 React 的 useEffect 依赖列表中省略函数是不安全的?

javascript - HTML5 DnD dataTransfer setData 或 getData 不适用于除 Firefox 之外的所有浏览器

javascript - iOS 的 Javascript 是 "other executable code"吗?

javascript - 带有 es6 import 的包装函数,不需要变量名(用于 React 高阶组件)

javascript - 如何在React JS中设置两个循环

javascript - 为什么 JSLint 在此代码上报告 'bad escapement'?

javascript - 订阅 AngularJS 中的属性更改