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

React时钟组件优化:实现每分钟重渲染并修复Tooltip显示问题

解决React时钟组件每分钟重渲染及Tooltip异常问题

问题根源

你现在的核心问题是定时器逻辑写错了——原代码里的while循环配合setInterval的写法根本行不通,setInterval是异步的,while会直接卡死主线程,不仅没法等到秒数归0,而且只执行了一次就返回清除函数,完全没有实现每分钟更新的逻辑,导致组件要么不更新,要么因错误逻辑引发频繁重渲染,直接搞崩了Tooltip的显示。

修复方案

1. 重写定时器逻辑,精准实现每分钟更新

先计算当前时间到下一分钟0秒的延迟,设置第一个定时器等到下一分钟再更新状态,之后再启动每分钟一次的定时任务,确保只有分钟变化时才更新状态,彻底避免每秒重渲染。

2. 增加缓存优化,减少无意义计算与组件刷新

用useMemo缓存格式化后的日期字符串,避免每次重渲染重复计算;如果你的TooltipComp是函数组件,用React.memo包裹它,防止父组件更新时它无意义刷新。

完整修复后的代码

import TooltipComp from '@components/Shared/TooltipComp'
import React, { useEffect, useState, useMemo } from 'react'
import { useTranslation } from 'react-i18next'

// 给Tooltip组件加memo,避免父组件更新时无意义重渲染
const MemoizedTooltip = React.memo(TooltipComp)

const Clock = () => {
    const [time, setTime] = useState(new Date())
    const { t } = useTranslation();

    useEffect(() => {
        const updateTime = () => {
            setTime(new Date());
        };

        // 计算距离下一分钟0秒剩余的毫秒数
        const now = new Date();
        const delay = (60 - now.getSeconds()) * 1000 - now.getMilliseconds();

        // 先等下一分钟再更新,之后每分钟执行一次
        const firstTimer = setTimeout(() => {
            updateTime();
            const minuteInterval = setInterval(updateTime, 60 * 1000);
            return () => clearInterval(minuteInterval);
        }, delay);

        // 组件卸载时清除第一个定时器
        return () => clearTimeout(firstTimer);
    }, []);

    const formatTime = (num) => {
        return num < 10 ? `0${num}` : num;
    };

    // 缓存日期字符串,仅当时间或语言切换时重新生成
    const date = useMemo(() => {
        return time.toLocaleDateString(t('locale'), {
            weekday: 'long',
            year: 'numeric',
            month: 'long',
            day: 'numeric'
        });
    }, [time, t('locale')]);

    return (
        <MemoizedTooltip text={date}>
            <div style={{fontSize: "9px", fontFamily: "PX", cursor: "default"}}>
                {formatTime(time.getHours())}
                &thinsp;:&thinsp;
                {formatTime(time.getMinutes())}
            </div>
        </MemoizedTooltip>
    );
}

export default Clock

关键说明

  • 定时器逻辑修正:先等待下一分钟再启动定时,保证第一次更新正好在分钟切换点,之后每分钟更新一次,彻底杜绝每秒重渲染问题。
  • 缓存优化:useMemo减少日期字符串的重复计算,React.memo避免Tooltip组件无意义刷新,解决Tooltip显示异常问题。
  • 内存泄漏防护:组件卸载时清除所有定时器,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 21:57:25