Skip to content

初探update流程

update 流程与mount 流程的区别。

对于beginWork :

需要处理ChildDeletion 的情况 需要处理节点移动的情况(abc -> bca)

对于completeWork :

需要处理HostText 内容更新的情况 需要处理HostComponent 属性变化的情况

对于commitWork :

对于ChildDeletion ,需要遍历被删除的子树 对于Update ,需要更新文本内容

对于useState :

实现相对于mountStateupdateState

beginWork流程

本节课仅处理单一节点,所以省去了「节点移动」的情况。我们需要处理: singleElement singleTextNode 处理流程为:

  1. 比较是否可以复用current fiber
  2. 比较key ,如果key 不同,不能复用
  3. 比较type ,如果type 不同,不能复用
  4. 如果keytype 都相同,则可复用
  5. 不能复用,则创建新的(同mount 流程),可以复用则复用旧的 注意:对于同一个fiberNode ,即使反复更新,currentwip 这两个fiberNode 会重 复使用

completeWork流程

主要处理「标记Update」的情况,本节课我们处理HostText 内容更新的情况。

commitWork流程

对于标记ChildDeletion 的子树,由于子树中: 对于FC ,需要处理useEffect unmout 执行、解绑ref 对于HostComponent ,需要解绑ref 对于子树的根HostComponent ,需要移除DOM 所以需要实现「遍历ChildDeletion子树」的流程

对于useState

需要实现:

针对update 时的dispatcher

实现对标mountWorkInProgresHookupdateWorkInProgresHook 实现updateState 中「计算新state的逻辑」 其中updateWorkInProgresHook 的实现需要考虑的问题: hook数据从哪来? 交互阶段触发的更新

jsx
<div onClick={() => update(1)}></div>

render 阶段触发的更新(TODO)

function App() {

const [num, update] = useState(0);

//触发更新

jsx
update(100);

return <div>{num}</div>;
}

用心学习,用代码说话 💻