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. 常见的生命周期有哪些?
初始化阶段
constructorgetDerivedStateFromProps- 静态函数,当做一个纯函数
- 传入 props 和 State
componentWillMount- 如果我们的组件有了
getDerivedStateFromProps,则不会执行 - 当一些接口需要预请求时用到
- 如果我们的组件有了
rendercomponentDidMount
更新阶段
componentWillReceiveProps- props 发生变化时,这里会自行
- 如果我们组件有了
getDerivedStateFromProps,则不会执行
getDerivedStateFromPropsshouldComponentUpdate- 相当于一个拦截器,返回是一个 bool 决定是不是要更新
componentWillUpdaterendergetSnapShotBeforeUpdate(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