9.hooks 源码 (想知道 Function Component 是怎样保存状态的嘛)
人人都能读懂的 react 源码解析(大厂高薪必备)
9.hooks 源码(想知道 Function Component 是怎样保存状态的嘛)
视频课程 &调试 demos
 视频课程的目的是为了快速掌握 react 源码运行的过程和 react 中的 scheduler、reconciler、renderer、fiber 等,并且详细 debug 源码和分析,过程更清晰。
 视频课程:进入课程
 demos:demo
课程结构:
hook 调用入口
 在 hook 源码中 hook 存在于 Dispatcher 中,Dispatcher 就是一个对象,不同 hook 调用的函数不一样,全局变量 ReactCurrentDispatcher.current 会根据是 mount 还是 update 赋值为 HooksDispatcherOnMount 或 HooksDispatcherOnUpdate
hook 数据结构
 在 FunctionComponent 中,多个 hook 会形成 hook 链表,保存在 Fiber 的 memoizedState 的上,而需要更新的 Update 保存在 hook.queue.pending 中
下面来看下 memoizedState 对应的值
useState:例如
const [state, updateState] = useState(initialState),memoizedState等于state 的值useReducer:例如
const [state, dispatch] = useReducer(reducer, {});,memoizedState等于state 的值useEffect:在 mountEffect 时会调用 pushEffect 创建 effect 链表,
memoizedState就等于 effect 链表,effect 链表也会挂载到 fiber.updateQueue 上,每个 effect 上存在 useEffect 的第一个参数回调和第二个参数依赖数组,例如,useEffect(callback, [dep]),effect 就是{create:callback, dep:dep,…}useRef:例如
useRef(0),memoizedState就等于{current: 0}useMemo:例如
useMemo(callback, [dep]),memoizedState等于[callback(), dep]useCallback:例如
useCallback(callback, [dep]),memoizedState等于[callback, dep]。useCallback保存callback函数,useMemo保存callback的执行结果
useState&useReducer
之所以把 useState 和 useReducer 放在一起,是因为在源码中 useState 就是有默认 reducer 参数的 useReducer。
useState&useReducer 声明
mount 阶段
update 阶段
执行阶段
useEffect
声明
mount 阶段
update 阶段
执行阶段
useRef
 sring 类型的 ref 已经不在推荐使用,ForwardRef 只是把 ref 通过传参传下去,createRef 也是{current: any 这种结构,所以我们只讨论 function 或者{current: any}的 useRef
声明阶段
mount 阶段
update 阶段
useMemo&useCallback
声明阶段
mount 阶段
update 阶段











    
评论