前端手撕题—倒计时组件

#一人分享一道面试手撕题#
得物、拼多多经常考,倒计时组件

1.倒计时组件
2.如何实现精确计时(setInterval 1s先就update以前知道写但没考虑到为什么,时间戳同步)

// Countdown.jsx
import React, { useEffect, useState, useRef } from 'react';

/**
 * props:
 *  - endAt: number (timestamp ms) 或 Date
 *  - onFinish?: () => void
 *  - tickMs?: number (minimal tick granularity, default 1000)
 */
export default function Countdown({ endAt, onFinish, tickMs = 1000 }) {
  const endTs = typeof endAt === 'number' ? endAt : endAt.getTime();
  const [remaining, setRemaining] = useState(Math.max(0, endTs - Date.now()));
  const mounted = useRef(true);

  useEffect(() => {
    mounted.current = true;
    // initial sync
    function update() {
      const now = Date.now();
      const rem = Math.max(0, endTs - now);
      if (!mounted.current) return;
      setRemaining(rem);
      if (rem === 0) {
        onFinish?.();
        return;
      }
      // Align next update to wall-clock second boundary (or tickMs)
      const delay = Math.min(
        tickMs,
        1000 - (now % 1000) // align to next second for nicer UX
      );
      // If <1s left, use requestAnimationFrame for smoothness
      if (rem <= 1000) {
        requestAnimationFrame(update);
      } else {
        setTimeout(update, delay);
      }
    }

    update();
    return () => {
      mounted.current = false;
    };
  }, [endTs, onFinish, tickMs]);

  const sec = Math.ceil(remaining / 1000);
  const mm = Math.floor(sec / 60);
  const ss = sec % 60;
  return (
    <div>
      {mm}:{String(ss).padStart(2, '0')}
    </div>
  );
}

全部评论
我去这让我手撕我直接死那儿了
1 回复 分享
发布于 01-11 15:43 湖北
倒计时怎么对齐
点赞 回复 分享
发布于 01-27 14:50 北京

相关推荐

03-12 09:11
门头沟学院 Java
先给结论:实习没人带、放养式管理,再正常不过;但学不到东西,也许是你自己的问题。很多实习生陷入一个误区:觉得学习就得有人手把手教,mentor&nbsp;不安排活、同事不带着做项目,就等于学不到东西,然后躺平摆烂、疯狂内耗,最后实习结束骂一句&nbsp;“垃圾公司,啥也学不到”。但你要先认清一个现实:职场不是校园,公司招实习生,不是请了个学生来免费上课,是找个人来解决问题、创造价值的。你的&nbsp;mentor&nbsp;和同事,没有义务当你的全职老师,拿自己的工作时间,手把手教你从&nbsp;0&nbsp;到&nbsp;1&nbsp;学东西。所谓的&nbsp;“放养”,从来不是放弃,是职场里最基础的考验。没人给你安排活,你就不会主动找活吗?看组里的过往项目文档、代码仓库,找&nbsp;mentor&nbsp;要一些边缘的、简单的活,哪怕是改&nbsp;bug、写测试用例,也比天天坐着打杂强;没人解答你的问题,你就不会正确提问吗?别张口就问&nbsp;“这个怎么做”,先自己查文档、搜解决方案,带着&nbsp;2&nbsp;个自己想的方案去问,别人只需要帮你判断对错,自然愿意教你;天天干打杂的活,就真的只能打杂吗?让你整理数据表格,你能不能顺便分析数据规律,做一个可视化看板?让你核对文档,你能不能顺便梳理清楚项目的业务逻辑?哪怕是贴发票,你都能搞懂公司的财务报销流程。实习是锻炼还是放弃,从来不是公司和&nbsp;mentor&nbsp;决定的,是你自己决定的。等着别人喂到嘴里的人,就算进了核心项目,也照样学不到东西;主动找机会、主动学习的人,就算是放养式实习,也能攒够秋招的硬通货。
实习学不到东西正常吗?
点赞 评论 收藏
分享
03-06 17:57
原来是我啊!主包是2月5日入职的,今天差不多在狐厂实习满一个月,写段实习感受分享给大家。【投递面试】主包是在小红书看到实习生找继任的帖子直接投递的。可能是因为主包有一段传统媒体实习经历,所以很快mt就联系我了,约了第二天上午面试。只有mt一轮面试,再加一个小作业测试(视频剪辑),下午老师告诉我通过面试,下周四报到入职就可以了。【landing】一开始上手会觉得一天剪四条视频很难,但现在主包已经是能一天剪五六条视频的人了哈哈哈哈。mt人超好,他特别害怕别人说他身上有“登味儿”,所以很有活人感,我们平时也会跟老师开玩笑(还给老师做了表情包哈哈哈哈哈),跟我们实习生打成一片(虽然老师年龄成谜)。老师真的是手把手带着教学,非常细致负责而且做的不好老师也不会说教啥的,而且也很将心比心,会站在实习生的角度理解我们(比如上次主包眼睛不舒服,老师给我减了工作量)。也在老师指导下剪出几条百万播放视频,成就感满满!【实习福利】狐厂经常会邀请一些艺人来扫楼,所以在狐厂我可以无痛追星。今天还收到了邓泽鸣的鲜花和小卡,超级大帅哥一枚啊,感觉看到俊男靓女后,所有工作疲惫感都一扫而空!(夸张了哈,坐在工位上腰又开始疼了)先写这么多!下个月再写点儿别的!
北京搜狐互联网信息服务有限公司公司氛围 475人发布
点赞 评论 收藏
分享
评论
4
27
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务