前端手撕题—倒计时组件

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

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>
  );
}

全部评论
我去这让我手撕我直接死那儿了
点赞 回复 分享
发布于 01-11 15:43 湖北

相关推荐

1.先做个自我介绍吧,重点介绍下你最近做的项目。2.挑一个你最熟悉的项目,说一下项目的技术架构、你的角色和主要贡献。3.说-下&nbsp;JavaScript&nbsp;的数据类型,基本类型和引用类型的区别是什么?4.null&nbsp;和&nbsp;undefined&nbsp;的区别?typeofnull&nbsp;的结果是什么,为什么?5.讲一下原型和原型链,proto&nbsp;和&nbsp;prototype&nbsp;的关系是什么?6.ES6&nbsp;的&nbsp;class&nbsp;和&nbsp;ES5&nbsp;的构造函数有什么区别和联系?7.讲一下作用域链和闭包,闭包的应用场景有哪些?可能会有什么问题?8.聊聊对&nbsp;Promise&nbsp;的理解,它的实现原理是什么?async/await&nbsp;和它是什么关系?9.如何实现一个元素的水平垂直居中?你知道几种方法?10.BFC是什么?如何触发?它解决了哪些问题?11.CSS&nbsp;选择器的优先级是怎么计算的?12.Vue&nbsp;的双向绑定原理是什么?13.Vue&nbsp;的&nbsp;computed&nbsp;和&nbsp;watch&nbsp;有什么区别?分别在什么场景下使用?14.Vue&nbsp;的生命周期钩子有哪些?父子组件的生命周期执行顺序是怎样的?15.v-if和&nbsp;v-show&nbsp;的区别是什么?16.Vue&nbsp;组件间的通信方式有哪些?17.看过&nbsp;Vue&nbsp;的源码吗?简单说-下&nbsp;diff&nbsp;算法的原理。18.Webpack的核心概念有哪些?Loader和&nbsp;Plugin&nbsp;的区别是什么?19.做过哪些&nbsp;Webpack&nbsp;相关的性能优化?20.从浏览器地址栏输入&nbsp;URL到页面最终展示,中间发生了什么?21.HTTP&nbsp;常见的状态码有哪些?301和&nbsp;302&nbsp;有什么区别?22.聊聊浏览器的缓存机制。23.跨域是什么?有哪些解决方案?24.算法题:实现一个函数,判断一个字符串是否是有效的回文。
查看24道真题和解析
点赞 评论 收藏
分享
评论
2
17
分享

创作者周榜

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