使用 'date-fns' 库时如何在 React 中自动刷新时间

How to auto-refresh time in React when using 'date-fns' library

我正在使用 React 处理我的个人作品集,我想在登陆页面上添加一条声明,向招聘人员显示我的本地时间和时区,如下所示:

我已经使用 date-fns 库实现了这一点,但我目前面临一个问题。随着时间的流逝,屏幕上的时间值保持不变,不会自动更新。就在我们说话的时候,现在是 16:58,但时间仍然显示 16:47。我必须手动刷新才能显示更新的时间值。我想以这样的方式实现这一点,即时间每 60 秒更新一次并始终显示当前时间。

我写了这个 Class 组件来实现功能:

export class Time extends Component {

  constructor() {
  super();
    var today = new Date();

    var time = format(today, 'HH:mm')

    this.state = {

      currentTime: time

    }

  }

   
  render() {
    return (
      <div className="time">
        <p>
          My Local Time is { this.state.currentTime } GMT +3
        </p>
      </div>
    );
  }

}

setInterval(Time, 60000);

我该怎么做才能使这成为可能?

创建一个 componentDidMount 方法,并将 setInterval 放在那里。确保 setInterval 更新 this.state.currentTime。之后清除间隔也是一个好主意,所以存储间隔id然后在componentWillUnmount.

中调用clearInterval

像这样

export class Time extends Component {
    intervalId

    constructor() {
        super()
        var today = new Date()

        var time = format(today, "HH:mm")

        this.state = {
            currentTime: time,
        }
    }

    componentDidMount() {
        var today = new Date()

        var time = format(today, "HH:mm")

        intervalId = setInterval(() =>
            this.setState({
                currentTime: time,
            }),
            60000
        )
    }

    componentWillUnmount() {
        clearInterval(intervalId) // Clear interval to prevent memory leaks
    }

    render() {
        return (
            <div className="time">
                <p>My Local Time is {this.state.currentTime} GMT +3</p>
            </div>
        )
    }
}


我建议您阅读 React Docs,因为这些是 React 的基础知识。

我尝试使用 ,但我 运行 遇到了 intervalId 变量声明的问题。因此,我求助于使用 React Hooks 并将此组件转换为功能组件。

下面的代码有效:

export const Time = () => {
   

  const [time, setTime] = useState(new Date());

  useEffect(
    () => {
      const intervalId = setInterval(() => {
      
        setTime(new Date());
      }, 60000);
      return () => {
        clearInterval(intervalId)
      }
    } 
  )

  return(
    <div>
      <p>{`My local time is ${format(time, 'HH:mm')} GMT+3`} </p>
    </div>
  )

}