大家都能看得懂的源码ahooks是怎么处理DOM的?
DOM类Hooks使用规范
这一章节,大部分参考官方文档的DOM类Hooks使用规范。
第一点,ahooks大部分DOM类Hooks都会接收target参数,表示要处理的元素。
target支持三种类型React。MutableRefObject(通过useRef保存的DOM)、HTMLElement、()HTMLElement(一般运用于SSR场景)。
第二点,DOM类Hooks的target是支持动态变化的。如下所示:exportdefault(){const〔boolean,{toggle}〕useBoolean();constrefuseRef(null);constref2useRef(null);constisHoveringuseHover(boolean?ref:ref2);return({isHovering?hover:leaveHover}{isHovering?hover:leaveHover});};
那ahooks是怎么处理这两点的呢?getTargetElement
获取到对应的DOM元素,这一点主要兼容以上第一点的入参规范。假如是函数,则取执行完后的结果。假如拥有current属性,则取current属性的值,兼容React。MutableRefObject类型。最后就是普通的DOM元素。exportfunctiongetTargetElementTextendsTargetType(target:BasicTargetT,defaultElement?:T){省略部分代码。。。lettargetElement:TargetValueT;if(isFunction(target)){支持函数获取targetElementtarget();假如ref,则返回current}elseif(currentintarget){targetElementtarget。current;支持DOM}else{targetElementtarget;}returntargetElement;}useEffectWithTarget
这个方法,主要是为了支持第二点,支持target动态变化。
其中packageshookssrcutilsuseEffectWithTarget。ts是使用useEffect。import{useEffect}fromreact;importcreateEffectWithTargetfrom。createEffectWithTarget;constuseEffectWithTargetcreateEffectWithTarget(useEffect);exportdefaultuseEffectWithTarget;
另外其中packageshookssrcutilsuseLayoutEffectWithTarget。ts是使用useLayoutEffect。import{useLayoutEffect}fromreact;importcreateEffectWithTargetfrom。createEffectWithTarget;constuseEffectWithTargetcreateEffectWithTarget(useLayoutEffect);exportdefaultuseEffectWithTarget;
两者都是调用的createEffectWithTarget,只是入参不同。
直接重点看这个createEffectWithTarget函数:createEffectWithTarget返回的函数useEffectWithTarget接受三个参数,前两个跟useEffect一样,第三个就是target。useEffectType就是useEffect或者useLayoutEffect。注意这里调用的时候,没传第二个参数,也就是每次都会执行。hasInitRef判断是否已经初始化。lastElementRef记录的是最后一次target元素的列表。lastDepsRef记录的是最后一次的依赖。unLoadRef是执行完effect函数(对应的就是useEffect中的effect函数)的返回值,在组件卸载的时候执行。第一次执行的时候,执行相应的逻辑,并记录下最后一次执行的相应的target元素以及依赖。后面每次执行的时候,都判断目标元素或者依赖是否发生变化,发生变化,则执行对应的effect函数。并更新最后一次执行的依赖。组件卸载的时候,执行unLoadRef。current?。()函数,并重置hasInitRef为false。constcreateEffectWithTarget(useEffectType:typeofuseEffecttypeofuseLayoutEffect){parameffectparamdepsparamtargettargetshouldcompareref。currentvsref。current,domvsdom,()domvs()domconstuseEffectWithTarget(effect:EffectCallback,deps:DependencyList,target:BasicTargetBasicTarget〔〕,){consthasInitRefuseRef(false);constlastElementRefuseRef(Elementnull)〔〕(〔〕);constlastDepsRefuseRefDependencyList(〔〕);constunLoadRefuseRef();useEffect或者useLayoutEffectuseEffectType((){处理DOM目标元素consttargetsArray。isArray(target)?target:〔target〕;constelstargets。map((item)getTargetElement(item));initrun首次初始化的时候执行if(!hasInitRef。current){hasInitRef。currenttrue;lastElementRef。currentels;lastDepsRef。currentdeps;执行回调中的effect函数unLoadRef。currenteffect();return;}非首次执行的逻辑if(目标元素或者依赖发生变化els。length!lastElementRef。current。length!depsAreSame(els,lastElementRef。current)!depsAreSame(deps,lastDepsRef。current)){执行上次返回的结果unLoadRef。current?。();更新lastElementRef。currentels;lastDepsRef。currentdeps;unLoadRef。currenteffect();}});useUnmount((){卸载unLoadRef。current?。();forreactrefreshhasInitRef。currentfalse;});};returnuseEffectWithTarget;};思考与总结
一个优秀的工具库应该有自己的一套输入输出规范,一来能够支持更多的场景,二来可以更好的在内部进行封装处理,三来使用者能够更加快速熟悉和使用相应的功能,能做到举一反三。
文章来自https:www。cnblogs。comgopalp16629642。html
万丈云霞之上,蹦出一轮红太阳请耐心于天明,黑暗终将逝去一个孤儿,在父母相继离世后,受够了人世间鬼魅魍魉和捉弄欺骗。他一心求死。求死之前,他有一个心愿未了。那就是,他听说故乡20里之外的山上,住着一位智者,智慧无穷,能解人间百愁。之前,
晚起的人说实话我特别羡慕那些起床比较早的人,因为这样的人通常会有时间观念,不会耽误事情,而我就属于那种赖床型,定了七八个闹钟,叮叮的响,可就是死活不起,要知道不是我不想起,而是根本就起不来
搓搓小手,一个人过冬阅读本文前,点击上方卡片一键关注Episode02372永远怀念不戴口罩的日子不能参与和见面的日子里祝我们保持绿码熠熠生辉裹紧大衣,搓搓小手,一个人过冬吧人生无非抬头观星低头观心现
活着,就需要戴着面具图片来源于网络齐然站在暖黄色的路灯下像是在等人,地上的影子被拉得的很长,像要被无情地剥离。嘿,齐然,走了。一个穿着流里流气的年轻人冲路灯下的女孩喊道。几辆摩托车离去后,这条街道又恢
这个世界没有如果,我要选择性遗忘承诺,不是应该该兑现吗?你忘了你说的话了吗?我没忘,是你忘了。我喜欢黑色,不是黑丝。它是静默的名词,也是叛逆的选择。我不喜欢复杂,如果可以简单粗暴,那肯定是我的首选。可这个世界的尔
我很幸运,因史铁生流泪两次我在岛屿读书第一次流泪是在初中学习秋天的怀念。那是一个早自习,老师叫我们自己预习秋天的怀念,当我读到母亲说咱娘两儿在一块,好好儿活,好好儿活我的眼眶红了。当读到母亲昏迷前的最后一句
刚刚想说的话,下一秒就忘了?原来是这个原因刚才还记得的事,正想要说的话,几分钟前还想着要做的任务下一秒,你发现自己大脑里突然一片空白。我刚才是想说什么来着?想做什么来着?怎么就是想不起来了呢?图库版权图片,不授权转载原来是
价值曾堪比金银珠宝,这件奢侈品你家厨房就有我在南欧旅行的时候,常吃用胡椒调味的菜,在那里胡椒几乎是和盐一样常备的调料。意大利和西班牙这些南欧国家发生的文艺复兴地理大发现与开拓胡椒丁香这类香料的贸易新路线有极大关系,在博物馆
从养生大师林海峰的养生方式反思这5种养生方法不要也罢说起长寿,这几乎是每个人都在追求的目标,估计应该没有人不想自己能够长命百岁,可是想要达到这个目标却似乎很难,世界上真正活到100岁以上的老人也屈指可数。于是越来越多的人们开始防老注
麻布仔大冒险来一场拯救工艺世界的奇幻旅途作为小小大星球3的衍生作,麻布仔大冒险的面世距离前者已经有整整六年之久,而麻布仔大冒险登陆PC平台,则又是两年之后的事情了。PC版麻布仔大冒险的热度似乎没有预想中那么高或许是因为小
简单的产品摄影技巧怎么拍好珠宝照片?对于想为小饰品或手工珠宝拍照的人,但是没有时间或设备进行造型和美丽的照明。这里有一些方法可以让你的产品脱颖而出,只需使用自然光和一些日常用品。珠宝摄影基础拍摄小饰品时,保留最小的细