当前位置: 首页 > wzjs >正文

网站开发与管理心得体会婚纱摄影照片

网站开发与管理心得体会,婚纱摄影照片,免费推广软件哪个好,做网站seo优化总结这是React Hooks的首要规则,这是因为React Hooks 是以单向循环链表的形式存储,即是有序的。循环是为了从最后一个节点移到一个节点的时候,只需通过next一步就可以拿到第一个节点,而不需要一层层回溯。React Hooks的执行&#xff0…

这是React Hooks的首要规则,这是因为React Hooks 是以单向循环链表的形式存储,即是有序的。循环是为了从最后一个节点移到一个节点的时候,只需通过next一步就可以拿到第一个节点,而不需要一层层回溯。React Hooks的执行,分为 mount 和 update 阶段,在mount阶段的时候,通过mountWorkInProgressHook() 创建各个hooks (如useState, useMemo, useEffect, useCallback等),并且将当前hook添加到表尾。在update阶段,在获取或者更新hooks值的时候,会先获取当前hook的状态,hook.memoizedState,并且是按照顺序或读写更新hook,若在条件或者循环语句使用hooks,那么在更新阶段,若增加或者减少了某个hook,hooks的数量发生变化,而React是按照顺序,通过next读取下一个hook,则导致后面的hooks和挂载(mount)阶段对应不上,发生读写错值的情况,从而引发bug。

我们可以看看useState在mount阶段的源码:

function mountState<S>(initialState: (() => S) | S,
): [S, Dispatch<BasicStateAction<S>>] {const hook = mountWorkInProgressHook();if (typeof initialState === 'function') {// $FlowFixMe: Flow doesn't like mixed typesinitialState = initialState();}hook.memoizedState = hook.baseState = initialState;const queue: UpdateQueue<S, BasicStateAction<S>> = {pending: null,lanes: NoLanes,dispatch: null,lastRenderedReducer: basicStateReducer,lastRenderedState: (initialState: any),};hook.queue = queue;const dispatch: Dispatch<BasicStateAction<S>,> = (queue.dispatch = (dispatchSetState.bind(null,currentlyRenderingFiber,queue,): any));return [hook.memoizedState, dispatch];
}

useCallback在mount阶段的源码:

function mountCallback<T>(callback: T, deps: Array<mixed> | void | null): T {const hook = mountWorkInProgressHook();const nextDeps = deps === undefined ? null : deps;hook.memoizedState = [callback, nextDeps];return callback;
}

然后mountWorkInProgressHook的源码如下:

function mountWorkInProgressHook(): Hook {const hook: Hook = {memoizedState: null,baseState: null,baseQueue: null,queue: null,next: null,};if (workInProgressHook === null) {// This is the first hook in the listcurrentlyRenderingFiber.memoizedState = workInProgressHook = hook;} else {// Append to the end of the listworkInProgressHook = workInProgressHook.next = hook;}return workInProgressHook;
}

其他hooks的源码也是类似,以mountWorkInProgressHook创建当前hooks, 并且把hook的数据存到hook.memoizedState上,而在update阶段,则是依次读取hooks链表的memoizedState属性来获取状态 (数据)。

React 为什么要以单向循环链表的形式存储hooks呢?直接以key-value的对象形式存储就可以在循环或者条件语句中使用hooks了,岂不更好?
这是因为react scheduler的调度策略如此,以链表的形式存储是为了可以实现并发、可打断、可恢复、可继续执行下一个fiber任务。


文章转载自:

http://Oyp49sOR.kfyjh.cn
http://7mL8xjPl.kfyjh.cn
http://jj4cLHKk.kfyjh.cn
http://hOxsLeip.kfyjh.cn
http://tjoEr8Hz.kfyjh.cn
http://ukMNcfvF.kfyjh.cn
http://dUhg86Di.kfyjh.cn
http://hHcxRmyN.kfyjh.cn
http://XqBob9Gy.kfyjh.cn
http://iUjxeZH0.kfyjh.cn
http://DvMrCCHi.kfyjh.cn
http://1G2uZGA7.kfyjh.cn
http://K7ae893g.kfyjh.cn
http://WFhvsts6.kfyjh.cn
http://sUdj3do2.kfyjh.cn
http://27vLKKNa.kfyjh.cn
http://teGzBtS2.kfyjh.cn
http://aD95PFIi.kfyjh.cn
http://sUozE8DI.kfyjh.cn
http://0KSxDr7n.kfyjh.cn
http://oYn2qyec.kfyjh.cn
http://zaijnNGB.kfyjh.cn
http://uQ0NOVNC.kfyjh.cn
http://kdI9Ui1a.kfyjh.cn
http://HemExuAd.kfyjh.cn
http://rw5w6ucL.kfyjh.cn
http://n1F78O30.kfyjh.cn
http://Cs9iBZ9X.kfyjh.cn
http://yJKjymyc.kfyjh.cn
http://ZijIgJrN.kfyjh.cn
http://www.dtcms.com/wzjs/711119.html

相关文章:

  • 2022中国互联网公司排名徐州网站优化价格
  • 合肥哪里做网站wordpress 一键
  • 建站公司服务费包括哪些wordpress 修改主题名
  • 招代理的网站建设公司上市公司中 哪家网站做的好
  • 网站技术建设维护技术论文海南省建设厅网站
  • 重庆网站建设设计公司信息asp.net 手机网站模板
  • wordpress模板html5郑州网站seo诊断
  • 做免费资料分享网站会不会涉及版权wordpress运营服务费用
  • 网站开发的理解php 网站cookie
  • 网站备注销全国企业管理信息系统网站
  • 祥云平台网站建设怎么收费好玩的手机网页游戏
  • 学习网站模板下载私人网站如何做竞价
  • 网络公司开发网站网络广告推广公司
  • 企业网站建设哪家优惠网站建设推荐频道
  • 郴州网站seo上海歌舞娱乐场所停业
  • 青岛房地产网站建设全方位营销型网站
  • 做网站导航栏目怎么做wordpress如何使用dplayer
  • 安康做企业网站的温州网站网络公司
  • 珠海市企业网站制作平台深圳手机网站设计公司
  • 电子商务网站建设技术有哪些方面企业融资论文
  • 上海网站建设咨询怎么做电影网站吗
  • 个人网站收款接口软件开发一般多少钱
  • iis7 多个网站 80端口上海前端
  • 仿起点小说网站开发揭阳网站制作平台
  • 哈尔滨制作网站价格成都淮州新城建设投资有限公司网站
  • 广州 环保 凡人网站建设排名点击软件
  • 网站结构怎么分析网站的建设流程具体有哪些
  • 绍兴做网站公司哪家好注册公司流程及手续
  • 网站上传小马后怎么做spring做网站
  • 免费网站建设方案免费模板网站建设