react 倒计时

import React, { useState, useEffect } from "react";

function Countdown() {
  const [countdown, setCountdown] = useState(0);

  useEffect(() => {
    const timer = setInterval(() => {
      const now = new Date().getTime();
      const endTime = new Date("2023-04-01").getTime();
      const distance = endTime - now;
      // 倒计时不会变成负数,即如果当前时间超过了结束时间,倒计时将显示为0。
      setCountdown(Math.max(distance, 0));
    }, 1000);

    return () => {
      clearInterval(timer);
    };
  }, []);

  const days = Math.floor(countdown / (1000 * 60 * 60 * 24));
  const hours = ("0" + Math.floor((countdown % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60))).slice(
    -2,
  );
  const minutes = ("0" + Math.floor((countdown % (1000 * 60 * 60)) / (1000 * 60))).slice(-2);
  const seconds = ("0" + Math.floor((countdown % (1000 * 60)) / 1000)).slice(-2);

  return (
    <div>
      <h1>倒计时</h1>
      <p>{`${days}${hours}小时 ${minutes}分钟 ${seconds}`}</p>
    </div>
  );
}

export default Countdown;

疑问点:

下述代码是什么时候执行?

return () => {
      clearInterval(timer);
    };

这代码是每次都要执行的呢?

这段代码不是每次都会执行的,它只在以下情况下才会执行:

  • 当组件卸载时。
  • 当 useEffect 中的依赖项发生变化时。

在这个示例中,我们使用空数组 [] 作为 useEffect 的依赖项,这意味着 useEffect 中的函数只会在组件挂载时执行一次,因此清理函数也只会在组件卸载时执行一次。

当组件卸载时,React 将自动执行清理函数来清除计时器。这是因为计时器是在 useEffect 中创建的,而 React 会确保在组件卸载时清除由 useEffect 创建的任何资源。因此,我们不必担心清理函数会在其他情况下执行。

总之,return () => { clearInterval(timer); }; 这段代码只在组件卸载时执行一次,以清除由 setInterval 创建的计时器。


==补充说明:==

这段代码是使用 useEffect 中的函数作为清理函数(Cleanup Function)。当组件卸载时或 useEffect 中的依赖项发生变化时,React 会先执行清理函数,然后再执行 useEffect 中的函数。在这个例子中,我们使用 setInterval 来更新倒计时,并将返回的计时器 ID 存储在变量 timer 中。为了避免内存泄漏和不必要的计时器运行,我们需要在组件卸载或 useEffect 依赖项发生变化时清除计时器。

因此,这段代码的作用是在组件卸载时清除计时器 timer。我们使用 clearInterval 函数来停止计时器的运行。通过在清理函数中返回这个函数,我们确保了计时器在组件卸载时被清除,从而避免了内存泄漏和不必要的计时器运行。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值