- 将jsx语法模拟成对象结构,包含type,props等属性
- 通过type创建真实dom节点,通过props为节点添加属性
- 字符串或文本也单独声明一个文本节点
- 挂载到dom
- jsx语法会被编译成React.createElement(type, props, ...children)的形式
- 编写createElement函数,文本类型单独处理成对象结构
- /** @jsx Didact.createElement */告诉babel如何编译
- 编写render函数,render接收element,container两个参数
- 判断节点类型,分别处理
- 遍历追加节点属性
- 递归调用render
- 挂载到dom树
- render中的递归存在问题,导致不可中断,因此需要把递归变成可中断的方式,
- demo使用requestIdleCallback,执行后会产生一个deadline
- deadline不足后,中断当前unitwork,开始下一个unitwork
- render时初始化第一个nextUnitOfWork
- 每一个performUnitOfWork中,创建新的fiber,根据是不是子节点,决定是child节点,还是兄弟节点
- 深度优先遍历,有child返回child,没child,有sibling,返回sibling
- 没有sibling,返回parent
- performUnitOfWork存在问题,如果任务中断了,页面没有完全更新
- 把里面dom操作抽离
- 记录fiber的根
- concurrent阶段判断根有没有完整,完整了后执行commit操作
- fiber中要保存老节点,进行新老fiber的对比
- 如果类型相同,就更新节点
- 如果节点不同,且存在新节点,就增加
- 如果有老节点,且类型不相同,就删除
- 更新节点时,还需要注意属性的替换,如果是事件类型,还要添加事件
- 如果是函数类型的组件,需要区分开来
- 函数组建的处理需要通过fiber.type拿到组件类型
- 需要设置全局index变量
- 记录当前的fiber,每个fiber都准备一个hooks数组保存起来
- 把hook对象push到hooks中
- index++,然后返回hook中的state
- 在hook中再使用queue数组保存每一次的action,然后执行actions数组,再返回当前的action