前端八股文-react篇

React 基础概念

1. React 的生命周期方法有哪些?

React 类组件的生命周期分为三个阶段:

挂载阶段

  • constructor():初始化 state 和绑定方法
  • static getDerivedStateFromProps():在 render 前调用
  • render():渲染组件
  • componentDidMount():组件挂载后调用,适合发起网络请求

更新阶段

  • static getDerivedStateFromProps():props 变化时调用
  • shouldComponentUpdate():决定组件是否重新渲染
  • render():渲染组件
  • getSnapshotBeforeUpdate():在 DOM 更新前捕获信息
  • componentDidUpdate():组件更新后调用

卸载阶段

  • componentWillUnmount():组件卸载前清理定时器、取消订阅等

2. React 的函数组件和类组件有什么区别?

特性 函数组件 类组件
语法 普通函数 ES6 class 继承 React.Component
状态管理 使用 Hooks (useState) 使用 this.state
生命周期 使用 useEffect 等 Hooks 有完整的生命周期方法
this 关键字 需要绑定 this
性能 更轻量 相对较重
代码量 更简洁 相对冗长

3. 什么是虚拟 DOM?React 如何工作?

虚拟 DOM

  • 是真实 DOM 的轻量级 JavaScript 表示
  • 用 JavaScript 对象描述 DOM 树结构
  • 通过 diff 算法比较新旧虚拟 DOM 的差异

工作流程

  1. 当状态改变时,重新渲染组件生成新的虚拟 DOM
  2. 比较新旧虚拟 DOM(diff 算法)
  3. 计算出最小变更集
  4. 批量更新真实 DOM

4. React 的 key 有什么作用?

  • 唯一标识:帮助 React 识别哪些元素被改变、添加或删除
  • 优化性能:减少不必要的 DOM 操作
  • 正确使用
    • 应该在数组内的元素上设置 key
    • key 应该在兄弟节点间唯一
    • 不推荐使用 index 作为 key(除非列表静态不变)

React Hooks

5. 常用的 React Hooks 有哪些?

  1. useState:管理组件状态

    const [state, setState] = useState(initialState);
    
  2. useEffect:处理副作用

    useEffect(() => {
         
         
      // 副作用代码
      return () => {
         
          /* 清理函数 */ };
    }, [dependencies]);
    
  3. useContext:访问 Context

    const value = useContext(MyContext);
    
  4. useReducer:复杂状态逻辑

    const [state, dispatch] = useReducer(reducer, initialState);
    
  5. useCallback:记忆函数

### 关于 React 的常见前端面试题及答案 #### 什么是 ReactReact 是一个用于构建用户界面的 JavaScript 库,主要用于开发单页应用程序中的视图层。它允许开发者通过声明式的编码方式来创建大型应用,并且能够高效地更新和渲染组件[^1]。 #### Hooks 解决了哪些问题? Hooks 让在不编写 Class 组件的情况下也能使用更多 React 功能成为可能。从概念上讲,React 组件更像函数;而 Hooks 拥抱了这种特性,同时保持了 React 的核心理念不变。Hooks 提供了一种解决状态管理和生命周期方法等问题的方式,不需要引入复杂的技术栈如函数式或响应式编程[^2]。 #### 状态管理解决了什么问题? 状态管理工具帮助处理随着项目规模增长所带来的数据流控制难题。专注于 View 层的应用程序可能会遇到难以追踪的状态变化以及跨多个组件共享逻辑的情况。借助专门的状态管理模式或者库(比如 Redux),可以使整个系统的可预测性和维护性得到提升。 #### 如何优化 React 性能? 性能调优可以从以下几个方面入手: - **减少不必要的重新渲染**:利用 `React.memo` 或者自定义 hook 来阻止子组件无意义的重绘。 - **合理运用 shouldComponentUpdate/React.PureComponent** :对于类组件来说,可以通过覆写此生命周期钩子实现浅比较 props 和 state ,从而决定是否需要触发更新过程。 - **懒加载(Lazy Loading)** : 使用动态导入(`import()`)配合 Suspense 实现按需加载模块,降低初始页面体积并加快首屏显示速度。 - **代码分割(Code Splitting)**: 将大文件拆分成较小的部分,在实际请求时才去获取对应的 chunk 文件,提高资源利用率的同时也减少了打包后的总大小。 ```javascript // 示例:使用 React.lazy 进行动态加载 const LazyComponent = React.lazy(() => import('./LazyComponent')); function MyComponent() { return ( <Suspense fallback={<div>Loading...</div>}> <LazyComponent /> </Suspense> ); } ``` #### Context API 主要用途是什么? Context API 被设计用来简化 prop-drilling (即层层传递属性) 的痛苦经历。当某些配置项或者全局变量需要被深层嵌套结构下的许多不同位置访问时,就可以考虑采用这种方式来进行传播。不过需要注意的是,过度依赖 context 可能会使得组件之间的耦合度增加,因此应当谨慎评估其适用场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值