React面试复习二:React原理部分和真题演练

146 阅读2分钟

0. 前言

  • 函数式编程
  • vdom和diff算法
  • JSX本质
  • 合成事件
  • setState和batchUpdate(必考)
  • 组件渲染过程

1. 函数式编程

  • 纯函数
  • 不可变值

纯函数
JavaScript函数式编程之深入理解纯函数

1. 函数的返回结果只依赖于它的参数
2. 函数执行的过程中没有可被观察到的副作用
3. 没有额外的状态依赖

2. Vdom和diff算法

  • Vue的h函数和React的createElement
  • vnode数据结构
  • patch函数

2.1 diff算法

  • 只比较统一层级 不跨级比较
  • tag不相同,则直接删掉重建,不再深度比较
  • tag和key两者都相同,则认为是相同节点,不再深度比较

vue2.x vue3.x 和React三者实现vdom细节不同 但是核心概念和实现思路是一样的 面试主要考察后者

3. JSX本质

  • JSX等同于Vue模板
  • Vue模板不是HTML
  • JSX也不是JS

通过babel网站去看jsx编译出来的东西

image.png

JSX编译出来的本质就是React.createElement返回的vnode

image.png JSX style,编译出来的结果。

image.png JSX加载组件 和加载普通JSX基本一样。

image.png JSX事件 当作属性来处理

4. React的合成事件 机制

  • React16 事件挂在在document上 17开始挂在在root容器
  • event不是原生的是syntheticEvent
  • 和Vue事件不同,和DOM事件也不同

React通过合成事件,模拟了原生事件的一些行为。
event.nativeEvent可以获得原生事件

image.png

为什么要合成事件机制?

  • 为了更好的兼容性和跨平台
  • 全部挂载到document/root容器上,减少内存消耗,避免频繁解绑。
  • 方便事件的统一管理(事务机制)

React17事件绑定到root

  • React16绑定到document
  • React17事件绑定到root组件
  • 有利于多个React版本并存,例如微前端

5. setState和batchUpdate

  • 有时异步(普通使用),有时同步
  • 有时合并(对象形式),有时不合并(函数形式)

image.png

image.png React无所谓同步和异步,主要看能不能命中isBatchingUpdates
生命周期 React事件 这些React能管理到的入口 可以命中 触发合并更新
setTimeOut,自定义事件 这些react管理不到的 无法命中isBatchingUpdates

深入React细节之batchUpdate讲解通俗,为什么需要用这个机制

6. transaction事务机制

深入理解React的batchUpdate

React执行函数之前和之后,分别会有一个initialize和一个close阶段,分别在执行函数之前和之后执行。
initialize阶段会给batchUpdate设置为true,close阶段设置为false

7. React组件渲染和更新过程

  • JSX如何渲染为页面
  • setState之后如何更新页面
  • 面试考察全流程

回顾知识点

  • 回顾Vue组件渲染和更新过程
  • 回顾JSX本质和Vdom
  • 回顾dirtyComponents