现在我们已经可以处理函数组件了,现在让我们新增状态state
因为我们是在函数组件中使用的useState,当函数执行时才会调用
1 | //之前我们处理函数组件是在该函数中处理的 |
我们还需要在调用函数组件之前初始化一些变量,以便于我们在useState时使用
1 | //新增 |
当函数组件调用useState时,我们检查是否有旧的钩子。我们使用hook的index来检查fiber的alternate
如果有旧的hook,我们拷贝旧fiber的状态到新fiber,如果没有旧hook,我们就初始化状态
然后我们给fiber增加new Hook,将Hook索引加1,然后返回状态
1 | function useState(initial) { |
useState也应该返回一个更新状态的函数,所以我们定义setState函数来接收action
我们把这个action推到我们增加hook的队列中
然后我们做一些类似于我们在render函数中所做的事情,将一个新的正在进行的工作根设置为下一个工作单元,这样工作循环就可以开始一个新的渲染阶段。
1 | function useState(initial) { |
现在我们还没有运行该action
我们在下一次渲染组件时这样做,我们从旧的钩子队列中获取所有的动作,然后将它们一一应用到新的钩子状态,所以当我们返回状态时,它会被更新。
1 | function useState(initial) { |
至此,我们的react已经写完了