【前端校招面经】得物App 前端二面面经

之前的一面面经在这里:

https://www.nowcoder.com/discuss/430759928832258048

  • 自我介绍
  • 你知道哪些前端构建工具, WebpackVite各自的优势有哪些
  • 列举ES6语法, 哪些你用得多
  • 你刚才提到了Promise, 会手写 Promise 吗?
  • 列举你知道的数组的方法, Array.prototype
  • forEachmap的区别
  • React 你知道有哪些hooks方法
  • useCallback原理
  • 代码题: 用 React hooks 写一个计数器组件, 要求:
    • 页面上有一个计数器, 一个开始按钮, 一个暂停按钮
    • 点击开始按钮开始计数, 每秒计数器显示的数字 +1, 直到计数器到 20 后归零
    • 点击暂停按钮会暂停数字的增长, 再次点击开始按钮会继续计数
    • 计数器启动时, 开始按钮被禁止点击; 计数器未启动时, 暂停按钮被禁止点击

参考答案:

/* @file Counter.tsx */
import { Button } from 'antd';
import useCounter from './useCounter';

export default () => {
  const { count, startCounter, pauseCounter, isRunning } = useCounter();
  return (
    <>
      <p>count is: {count}s</p>
      <Button onClick={startCounter} disabled={isRunning}>Start</Button>
      <Button onClick={pauseCounter} disabled={!isRunning}>Pause</Button>
    </>
  );
};

/* @file configs.ts */
export const MAX_COUNT = 20;

/* @file useCounter.ts */
import { useState, useCallback } from 'react';
import { MAX_COUNT } from './configs';

export default function useCounter() {
  const [count, setCount] = useState(0);
  const [timer, setTimer] = useState<number | null>(null);

  // 清空 timer, 用于用户点击暂停时或者计数器达到 MAX_COUNT 时复位
  const clearTimer = useCallback(() => {
    setTimer(prevTimer => {
      clearInterval(prevTimer as number);
      return null;
    });
  }, []);

  // 点击开始按钮的响应
  const startCounter = useCallback(() => {
    const newTimer = setInterval(() => {
      setCount(prevCount => {
        const shouldReset = prevCount >= MAX_COUNT; // 判断计数是否已经到最大值
        if (shouldReset) {
          clearTimer();
          return 0;
        }
        return prevCount + 1;
      });
    }, 1000);
    setTimer(newTimer);
  }, []);

  return {
    count, // 组件展示的计数
    startCounter,
    pauseCounter: clearTimer, // 点击暂停按钮的响应
    isRunning: !!timer // 控制 2 个按钮的 disabled 状态
  };
}

本题主要考察的点在于:

  • 设计 20 秒复位时要考虑 hooks 带来的闭包问题, 因此在使用 setCount 时, 不能直接传值; 设计 setTimer 时同理
  • 或者使用 useRef 替代 useState 来存储 timer, 因为 useRef 需通过 current 属性来访问被存储的目标值, 因此可避免闭包陷阱

更新: 一月初时 HR 给意向, base: sh, hz 可选, 薪资相同

#前端工程师精选面经合集##得物app#
全部评论

相关推荐

距离第一次面试刚刚好过去一个月,总算是oc了,后面也不打算再找了,所以简单做个总结bg双九科班简历牛客论坛+黑马点评,有个挑战杯大模型相关比赛决赛一等奖无实习经历,LeetCode除hot100之外有额外刷一些,大概200左右,八股一般,主要背了redis相关大概4月初开始投,虽然bg让我有不少面试机会,但大多都是一面挂,只有阿里智能信息顺利oc,鹅的复活赛进了一次二面。总结失败经验:没有实习经验、项目烂大街加上最开始确实没有完全吃透,基本一深入问就g以下记录一下时间线:美团&nbsp;4.23&nbsp;一面挂阿里国际&nbsp;4.29&nbsp;一面挂腾讯&nbsp;5.8&nbsp;一面挂阿里云&nbsp;5.9&nbsp;一面挂腾讯复活赛一番战&nbsp;5.13&nbsp;一面&nbsp;5.20二面挂淘天&nbsp;5.14&nbsp;一面挂(阿里妈妈的压迫感太强了)腾讯音乐&nbsp;5.14&nbsp;一面挂阿里智能信息&nbsp;5.15一面&nbsp;5.20二面&nbsp;5.23HR面&nbsp;HR面后三小时oc其实还投了不少,饿了么笔试没后续,蚂蚁笔试没后续,OPPO笔试挂,虾皮笔试挂,阿里控股、京东还在池子里,很早就投的顺丰发了个面试时间意向邮件后无后续以下是面经:美团、阿里国际、阿里智能信息已单独发腾讯一面:讲讲session和cookie,了不了解单点登录csrf攻击布隆过滤器讲讲cas讲讲redis里的数据结构,跳表有了解吗热帖排行功能展开讲讲讲讲你项目里的分布式锁acid、隔离级别,mysql默认是哪个级别,为什么ioc和aop手撕:连续子数组的最大和其实这次面试体验还挺好,就是单点登录问题面试官前面暗示了很多次,最后直截了当问了,但我这块当时确实没准备到淘天一面:除了maven还有什么管理第三方包;如何处理maven依赖冲突AC自动机了解吗布隆过滤器threadlocal,如何跨线程传递值mysql的锁了解吗,什么情况下会产生死锁商品数量多时如何考虑分库分表redisson自动续锁怎么解决死锁问题get和post的区别;为什么get中带url是不安全的循环依赖是什么,spring中如何解决,适用于什么情况ioc、aop讲讲为什么要做这两个项目csrf手撕快排,讲原理被拷打最狠的一集,阿里妈妈不愧是阿里妈妈,是我完全高攀不起了腾讯复活赛一番战一面:static的作用final和finally的区别==和equals的区别为什么有了equals还需要hashcode为什么重写&nbsp;equals()&nbsp;时必须重写&nbsp;hashCode()&nbsp;方法?ioc和aopredis有哪些部署架构讲讲redisson对分布式锁的优化,什么情况下只使用单体redis手撕:删除有序链表中的重复值都是很基础的八股
点赞 评论 收藏
分享
06-11 19:19
门头沟学院 Java
快支棱起来的code...:真能拖吧今天开一下奖好不好秋梨膏
点赞 评论 收藏
分享
评论
9
23
分享

创作者周榜

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