interview

美团前端面试

当前状态: 一面可能要完了

现在就怕不考八股文的, 太抽象了

题目

两栏布局如何实现

可以使用flex布局中的flex-grow属性完成自适应

会自动占据剩下的空间, 举个例子

.container {
display: flex;
width: 600px;
}

.box {
border: 1px solid black;
padding: 10px;
}

.box1 {
flex-grow: 1; /* 扩展比例为1 */
}

.box2 {
flex-grow: 2; /* 扩展比例为2 */
}

.box3 {
flex-grow: 3; /* 扩展比例为3 */
}

剩下的三个盒子会根据1.2.3的比例划分剩下的空间

react中组件传递的方式

父子组件之间传递就可以直接使用props

子组件向父组件传递数据, 可以在父元素中设置一个state, 然后将state的修改函数作为props的内容传递下去. 子组件中通过调用这个函数传递参数, 就可以实现向父组件传递数据的要求

全局状态可以使用redux或者跟组件提供provide,context进行托管.

如果微任务时间过于长

  • 可以把微小任务拆分成更小的, 放在不同的任务队列中执行.

  • 或者开多线程或者合理的优化算法

  • 使用setTimeout暂时延迟这个任务

  • 减少任务逻辑

关于useEffect

举个例子

useEffect(() => {
// 启动一个定时器
    const timer = setTimeout(() => {
    console.log('Timeout executed!');
    }, 3000);

    // 返回一个清理函数来清除定时器
    return () => {
      clearTimeout(timer);
      console.log('Timeout cleared!');
    };
}, []); // 空数组作为依赖项,表示只在组件挂载和卸载时执行

如果依赖项本身是一个数组,并且你想要监听数组内容的变化,必须确保在状态变化时,React 能够检测到数组的引用变化。JavaScript 中,数组和对象是按引用传递的,因此 React 只会检查数组或对象的引用是否改变。如果只是修改了数组内容(如 .push() 或 .pop() 操作),引用不变,React 将不会触发 useEffect。

还有那些hooks?

  • useState
  • useEffect
  • useContent(直接获取组件树中的公众数据)
  • useReducer

redux的原理

redux是由社区维护的状态管理库, 使用reducer函数来处理动作逻辑,并对状态实现更新

大致使用流程如下

(1)设置初始状态
(2)设置reducer函数
(3)根据reducer函数创建出store
(4)如果想要更新, 就要使用useDispatch钩子, 参数为初始状态和action对象
(5)如果想要获取数据, 就要使用useSelector钩子,参数state就是状态对象 例如useSelector(state=>state.count)

关于组件复用

笔试题目

实现一个深拷贝

function deepEqual(obj1, obj2) {
  // 如果两个对象指向同一引用, 或者根本就是同一个基本数据,直接返回 true
  if (obj1 === obj2) {
    return true;
  }
  
  // 如果其中一个不是对象或者为 null,则返回 false
  if (typeof obj1 !== 'object' || typeof obj2 !== 'object' || obj1 === null || obj2 === null) {
    return false;
  }
  
  // 获取两个对象的键(转化为数组的形式)
  const keys1 = Object.keys(obj1);
  const keys2 = Object.keys(obj2);
  
  // 如果键的数量不一致,则对象不相等
  if (keys1.length !== keys2.length) {
    return false;
  }
  
  // 递归比较每个键的值
  for (let key of keys1) {
    if (!keys2.includes(key) || !deepEqual(obj1[key], obj2[key])) {
      return false;
    }
  }
  
  return true;
}

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 xranudvilas@gmail.com

💰

×

Help us with donation