javascript - 如何使用 setInterval 或其他方式在 React 中重新渲染特定组件?

标签 javascript reactjs ecmascript-6 setinterval

我已经在 React 中为时间计数器创建了功能组件。一切正常。但是,组件不会在每一秒后重新渲染。我是 React 的新手。

那么,我们如何使用 setInterval() 重新渲染功能组件?

import React from 'react'
import withStyle from 'react-jss'


const counterStyle = {
    counter:{
        color:'#FFFFFF'
    }
}

let date = new Date();    
let todayDate = date.getDate();
let hours = date.getHours()
let minutes = date.getMinutes();
let second = date.getUTCSeconds();    

const timerDisplay = () => {
     date = new Date();    
     todayDate = date.getDate();
     hours = date.getHours()
     minutes = date.getMinutes();
     second = date.getUTCSeconds();    
}

const TimeCounter = ({classes}) => {
    setInterval(() => {
        timerDisplay()
    }, 1000);
    return(
        <div className={classes.counter}>
            <h1>{`${hours} : ${minutes} : ${second} : ${todayDate}`}</h1>
        </div>
    )
}

export default withStyle(counterStyle)(TimeCounter);

最佳答案

您可以使用 useState钩子(Hook)存储 date,

const [timer, setTimer] = useState(new Date());

您必须使用 useEffect钩子(Hook)以间隔更新状态,

useEffect(() => {
   const interval = setInterval(() => {
      console.log('This will run every second!');
      setTimer(new Date());
   }, 1000);

   // This is important, you must clear your interval when component unmounts
   return () => clearInterval(interval);

}, [])  // [] is for to execute `useEffect` only once as `componentWillMount`

Demo

关于javascript - 如何使用 setInterval 或其他方式在 React 中重新渲染特定组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57413748/

相关文章:

javascript - 从 dom 中隐藏输入值属性

javascript - Svelte 3,异步 onMount 还是有效的替代方案?

javascript - 如何使用jquery获取div的宽度?

javascript - 正则表达式中的多个匹配并存储或打印它

javascript - 在 transitionend 之后向类添加 css 属性

javascript - 当第一次在 useEffect 上获取数据时,为什么 React 的 useReducer 返回空状态?

javascript - DataTables:按列对表进行排序,固定 i++ 值?

javascript - 在 React JS 中使用另一个组件内的组件进行导航

javascript - 如何解构newValue = value.value?

javascript - 在一个对象在另一个对象中声明之前传递该对象