主题
初探update流程
update 流程与mount 流程的区别。
对于beginWork :需要处理ChildDeletion 的情况 需要处理节点移动的情况(abc -> bca)
对于completeWork :需要处理HostText 内容更新的情况 需要处理HostComponent 属性变化的情况
对于commitWork :对于ChildDeletion ,需要遍历被删除的子树 对于Update ,需要更新文本内容
对于useState :实现相对于mountState 的updateState
beginWork流程
本节课仅处理单一节点,所以省去了「节点移动」的情况。我们需要处理: singleElement singleTextNode 处理流程为:
- 比较是否可以复用
current fiber - 比较
key,如果key不同,不能复用 - 比较
type,如果type不同,不能复用 - 如果
key与type都相同,则可复用 - 不能复用,则创建新的(同
mount流程),可以复用则复用旧的 注意:对于同一个fiberNode,即使反复更新,current、wip这两个fiberNode会重 复使用
completeWork流程
主要处理「标记Update」的情况,本节课我们处理HostText 内容更新的情况。
commitWork流程
对于标记ChildDeletion 的子树,由于子树中: 对于FC ,需要处理useEffect unmout 执行、解绑ref 对于HostComponent ,需要解绑ref 对于子树的根HostComponent ,需要移除DOM 所以需要实现「遍历ChildDeletion子树」的流程
对于useState
需要实现:
针对update 时的dispatcher实现对标mountWorkInProgresHook 的updateWorkInProgresHook 实现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>;
}