reactjs React、setInterval工作不正常,h1元素未正确更新

6g8kf2rb  于 2023-02-18  发布在  React
关注(0)|答案(4)|浏览(113)

我想创建一个简单的React应用程序,使用setInterval函数每秒更新一个h1元素。我有一个字符串数组,我想每秒从该数组中随机选取一个字符串,并在h1中使用该字符串。但我的代码无法正常工作。h1不是每秒更新,而是每毫秒更新。

import PersonalInfo from './PersonalInfo.js'
import { useState } from 'react';

function App() {
  const myPersonalInfo = ['books', 'music', 'code']; 
  const [state, changeState] = useState(myPersonalInfo[Math.floor(Math.random() * myPersonalInfo.length)]);

  setInterval(() => {
    changeState(myPersonalInfo[Math.floor(Math.random() * myPersonalInfo.length)]);
  }, 2000);

  return (
    <div className="App">
      <PersonalInfo title={state} />
    </div>
  );
}

export default App;
function PersonalInfo({ title}) {
    return <div>
        <h1>I Love {title} </h1>
    </div>
}

export default PersonalInfo
q43xntqr

q43xntqr1#

import PersonalInfo from './PersonalInfo.js'
    import { useState } from 'react';
    
    function App() {
      const myPersonalInfo = ['books', 'music', 'code']; 
      const [state, changeState] = useState(myPersonalInfo[Math.floor(Math.random() * myPersonalInfo.length)]);
    
      useEffect(() => {
         setInterval(() => {
            changeState(myPersonalInfo[Math.floor(Math.random() * myPersonalInfo.length)]);
         }, 2000);
      }, [])
    
      return (
        <div className="App">
          <PersonalInfo title={state} />
        </div>
      );
    }
    
    export default App;

使用useEffect挂钩

vlju58qv

vlju58qv2#

使用React使用效果
具有空依赖项的useEffect仅在第一次渲染时运行
clear interval组件卸载

import PersonalInfo from './PersonalInfo.js'
import React, { useState, useEffect } from 'react';

function App() {
  const myPersonalInfo = ['books', 'music', 'code']; 
  const [state, changeState] = useState(myPersonalInfo[Math.floor(Math.random() * myPersonalInfo.length)]);

  useEffect(() => {
    const intervalId = setInterval(() => {
      changeState(myPersonalInfo[Math.floor(Math.random() * myPersonalInfo.length)]);
    }, 2000);
    
    return () => clearInterval(intervalId)
  }, [])

  return (
    <div className="App">
      <PersonalInfo title={state} />
    </div>
  );
}

export default App;
f2uvfpb9

f2uvfpb93#

使用useEffect并将state设置为依赖项。

useEffect(() => {
  setInterval(() => {
    changeState(myPersonalInfo[Math.floor(Math.random() * myPersonalInfo.length)]);
  }, 2000);
}}, [state])
deyfvvtc

deyfvvtc4#

您可能希望使用useEffect和一个空的dependencies数组,以确保设置间隔的代码只在挂载时运行一次,否则您将在内存中为每个状态更改创建一个新的间隔,并且您还希望在卸载时清除该间隔。
另外,你可以使用一个函数来更新状态,否则,你将在内存中注册一个设置的间隔,该间隔将使用相同的值(第一个随机值)不断更新状态。状态更新器函数确保你在evrytime中使用一个新值来水合间隔。

import PersonalInfo from './PersonalInfo.js'
import { useState } from 'react';

function App() {
  const myPersonalInfo = ['books', 'music', 'code']; 
  const [state, changeState] = useState(myPersonalInfo[Math.floor(Math.random() * myPersonalInfo.length)]);

  
  
  useEffect(()=>{
   const id = setInterval(() => {
       changeState(prev => myPersonalInfo[Math.floor(Math.random() * myPersonalInfo.length)]);
    }, 2000);
    
    // clear the interval before the component gets unmounted
    return ()=>clearInterval(id);
  
  },[])

  return (
    <div className="App">
      <PersonalInfo title={state} />
    </div>
  );
}

export default App;

相关问题