You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React JS实现倒计时功能使用setInterval仅首卡片显示问题求助

问题原因
  • 所有Timer组件都复用了相同的id="tmr",HTML中id属性全局唯一,document.getElementById("tmr")只会匹配页面中第一个出现的对应id元素,因此所有定时器的更新都只会作用到第一张赛事卡片的倒计时位置,其余卡片无内容更新。
  • 未遵循React声明式渲染逻辑,直接操作原生DOM修改内容,且组件每次重渲染都会重复创建新的setInterval定时器,没有做定时器清理逻辑,会引发内存泄漏问题。
可行解决方案

重写Timer组件,使用React的状态管理和副作用钩子实现倒计时,避免直接操作DOM,同时处理定时器的清理逻辑:

import { useState, useEffect } from 'react';

const Timer = (props) => {
  const [timeText, setTimeText] = useState('');

  useEffect(() => {
    const countDownDate = new Date(
      `${props.remainingDate} ${props.remainingTime}`
    ).getTime();

    // 先执行一次计算,避免首次渲染空白
    const calculateTime = () => {
      const now = new Date().getTime();
      const distance = countDownDate - now;
      
      if (distance < 0) {
        setTimeText('赛事已开始');
        return;
      }
      
      const days = Math.floor(distance / (1000 * 60 * 60 * 24));
      const hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
      const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
      const seconds = Math.floor((distance % (1000 * 60)) / 1000);
      
      setTimeText(`${days}d ${hours}h ${minutes}m ${seconds}s`);
    };

    calculateTime();
    const timer = setInterval(calculateTime, 1000);

    // 组件卸载时清除定时器,避免内存泄漏
    return () => clearInterval(timer);
  }, [props.remainingDate, props.remainingTime]);

  return <span>{timeText}</span>;
};

export default Timer;

内容的提问来源于stack exchange,提问作者vijay kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:36:05