底层源码解析:React中状态发生改变到渲染的过程

2 阅读3分钟

从底层源码来看,React中状态发生改变到渲染的过程是一个复杂而精细的体系,涉及多个关键技术和概念。以下是对这一过程的详细解释:

一、状态改变触发更新

  1. 状态更新:

• 在React中,组件的状态(state)是存储在组件实例上的对象。当状态发生改变时,会触发组件的重新渲染。

• 状态的更新通常是通过调用setState方法实现的。setState方法接受一个新的状态对象作为参数,并将其合并到当前的状态中。

  1. 触发更新流程:

• 当调用setState时,React会标记组件为“脏”状态,表示该组件需要重新渲染。

• React的调度器(Scheduler)会接收到这个更新任务,并根据优先级对其进行排序和调度。

二、React的渲染流程

React的渲染流程分为两个阶段:render阶段和commit阶段。

  1. render阶段:

• 在这个阶段,React会构建一个新的Fiber树(也称为虚拟DOM树)。Fiber树是React 16引入的一种新的协调算法和架构,用于改进React应用的性能和响应性。

• Fiber树是一个链表结构,每个节点都包含了组件的类型、属性、状态等信息。React会通过递归的方式构建这个新的Fiber树,并与旧的Fiber树进行比较(diff算法),以确定需要更新的真实DOM部分。

• 这个过程可能会因为浏览器的空闲状态或其他高优先级任务的插入而被中断和恢复,从而实现并发更新。

  1. commit阶段:

• 在这个阶段,React会根据render阶段计算出来的结果,将更新应用到真实的DOM上。

• 这个过程是同步执行的,不可以被打断。React会遍历新的Fiber树,并根据节点的变化对真实的DOM进行创建、更新或删除操作。

• 同时,在这个阶段,React还会执行一些副作用操作(如useEffect等),这些操作通常是在组件渲染完成后需要执行的。

三、详细过程解读

  1. 状态更新触发:

• 调用setState方法,触发组件的状态更新。

• 调度器接收到更新任务,并根据优先级进行排序和调度。

  1. render阶段:

• 协调器(Reconciler)开始工作,根据组件的状态和属性构建新的Fiber树。

• 通过深度优先遍历的方式比较新旧Fiber树,找出需要更新的节点,并打上不同的flags。

• 这个过程可能会因为浏览器的空闲状态或其他原因被中断和恢复。

  1. commit阶段:

• 根据render阶段计算出来的结果,渲染器(Renderer)开始将更新应用到真实的DOM上。

• 遍历新的Fiber树,对真实的DOM进行创建、更新或删除操作。

• 执行副作用操作(如useEffect等)。

  1. 屏幕渲染:

• 真实的DOM更新完成后,屏幕上的内容也会随之改变。

综上所述,React中状态发生改变到渲染的过程是一个涉及状态更新、Fiber树构建、diff算法比较、真实DOM更新等多个步骤的复杂过程。这个过程通过React的调度器、协调器和渲染器等组件的协同工作来实现,确保了React应用的性能和响应性。