前端React必会的8道面试题(绝对的干货)

173 阅读3分钟

1. React的组件常见的声明方式?

函数组件

简单来说就是函数,返回的内容是组件内的函数

function Welcome(props) { 
    return <h1>Hello, {props.name}</h1>; 
}

类组件

render的返回值得到需要的渲染内容

class Welcome extends React.Component { 
    render() { 
        return <h1>Hello, {this.props.name}</h1>; 
    } 
}

2. 常见的hook有哪些

官方的hook

  • useEffect
    • 模拟一些生命周期、处理一些状态的副作用、请求接口
  • useState
    • 更新UI,返回值为 状态数据和修改状态的方法
  • useMemo
    • 返回一个可缓存的值,一般用作优化手段
  • useCallback
    • 返回一个可缓存的函数
  • useRef
    • 保存一个可变值
    • 获取DOM节点
  • useReducer
    • 让我们的状态变更可控 num 不会变成其他类型
    • reducer 会明确的具体 acution 是什么
  • useCeonxt
    • 构建一个全局的上下文
    • 本质上是一个生成消费模式(常见的第三方比如reduce、router都有关)

3. 常见的生命周期有哪些?

初始化阶段

  • constructor
  • getDerivedStateFromProps
    • 静态函数,当做一个纯函数
    • 传入 props 和 State
  • componentWillMount
    • 如果我们的组件有了 getDerivedStateFromProps,则不会执行
    • 当一些接口需要预请求时用到
  • render
  • componentDidMount

更新阶段

  • componentWillReceiveProps
    • props 发生变化时,这里会自行
    • 如果我们组件有了getDerivedStateFromProps,则不会执行
  • getDerivedStateFromProps
  • shouldComponentUpdate
    • 相当于一个拦截器,返回是一个 bool 决定是不是要更新
  • componentWillUpdate
  • render
  • getSnapShotBeforeUpdate(prevProps, preState)

销毁阶段

  • componentWillUnmount
    • 闭包、定时器、事件管理,做一些销毁的动作

4. hook 的使用,有哪些注意事项?

  • 只能在外层使用 hook
    • 不能在循环、条件和其他函数中使用,需要确保在最外层
  • 只能在 react 相关的函数调用
    • 不能在普通 JS 函数中调用

5. 为什么会有 hooks?

  • 组件之间复用状态逻辑困难
  • 复杂组件难以理解
    • 类组件会有很多复杂的生命周期的问题

6. 什么是状态提升,父子组件如何通信?

  • 状态提示是把当前状态声明写到父组件中,达到父子组件通信、兄弟组件通信

7. 什么是 Fiber?

  • Fiber 是 react 16 引入的一个数据结构。为了替换之前的 stack reconciler, 解决渲染过程不能被中断的问题。
  • 主要做了以下优化:
    • 将递归改为练链表结构,之前版本用的递归更新方式不被中断,可能会导致页面卡顿。每个 fiber 节点保存了父子、兄弟节点的引用,可以在更新的过程中中断、恢复任务。
    • 支持任务优先级,每个更新任务分批了优先级,优先级高的可以中断优先级低的,比如输入框的响应可以优先处理,提高用户的交互体验。
    • 支持异步渲染,允许将渲染任务分批为多个小块,在浏览器空闲时执行,可以避免主线程阻塞。
    • 新增双缓冲机制,每个 DOM 节点对应两个 fiber 节点:一个是当前正在显示的 fiber(current),一个是正在构建新的 fiber (workInProgress)。更新完成后通过交换引用的方式完成 DOM 更新。

8. 什么是 Hoc ,及常见的方式?

本质上是一个函数,接受一个组件作为参数,返回一个新的增强之后的组件。

  • 逻辑复用(例如权限控制、请求封装)
  • 状态提示(共享某些状态)
  • 条件渲染
  • 组件注入props