下一件要做的事就是支持函数组件
函数组件在两个方面有所不同:
- 函数组件的fiber没有DOM节点
- 并且孩子们是从直接运行该函数得出的,而不是从props中
我们需要检查fiber类型是否是一个函数,并调用不同的更新函数
在updateFunctionComponent
我们运行函数来获取孩子(是个函数)<App />
返回的类型是function App
,所以我们可以运行fiber.type
来返回结果,一旦返回结果了,就和之前一样处理
我们这边还需要改变的是commitWork
函数
现在我们有了没有DOM节点的fiber,我们需要改变两件事。
1、首先为了找到一个DOM节点的父节点,我们需要沿着fiber树向上移动,直到找到一个带有DOM节点的fiber
2、当删除一个节点时,我们还需要沿着fiber树向下移动,直到找到一个具有DOM节点的子节点
先判断当前节点类型是否是函数
之前我们在performUnitOfWork
中是直接判断当前节点是否存在dom节点,没有dom的话,我们会创建它,现在新增函数组件,所以我们需要先判断当前节点是否是一个函数
1 | function performUnitOfWork(fiber) { |
现在我们还需要处理一下commitWork
函数
1 | function commitWork(fiber) { |