useEffect依赖项中的全局范围变量?
像‘window。location。pathname’这样的外部范围值不是有效的依赖项,因为改变它们不会重新渲染组件。用例
假设我们必须在每个页面上执行一个操作,并且每当路由更改时我们都必须执行此操作。
由于我们必须在每个页面组件上执行操作,所以让我们将逻辑抽象为一个钩子。文件
index。js文件包含具有两个页面的路由器配置主页和其他页面。
主页和其他页面仅呈现文本并调用公共useLocation挂钩。
在useLocation钩子中,我们将根据window。location。pathname执行一些操作,这是一个全局范围的变量。FILENAMEindex。jsimportReactfromreact;import{render}fromreactdom;import{BrowserRouterasRouter,Route,Link}fromreactrouterdom;importOtherfrom。componentsOther;importHomefrom。componentsHome;BasicRoutertorenderHomePageandOtherPageconstBasicExample()(RouterulliLinktoHomeLinkliliLinktootherOtherLinkliulhrRouteexactpathcomponent{Home}Routepathothercomponent{Other}Router);render(BasicExample,document。getElementById(root));FILENAMEuseLocation。jsThisisthehookthatwewillberunningoneachpageimport{useEffect}fromreact;constuseLocation(pathname){useEffect((){Ifthepathnameissameascurrentpagepath,performsomeoperationForthisexample,theoperationistoalerttheuseronlyifpathnamepassedandwindow。location。pathnameareequalif(pathnamewindow。location。pathname){alert(OnPage,pathname{pathname},window。location。pathname{window。location。pathname});}},〔pathname,window。location。pathname〕);};exportdefaultuseLocation;HomePageimportReactfromreact;importuseLocationfrom。。useLocation;constHome(){useLocation();returnh2Homeh2;};exportdefaultHome;OtherPageimportReactfromreact;importuseLocationfrom。。useLocation;constOther(){useLocation(other);returnh2Otherh2;};exportdefaultOther;相互作用
在交互中,我们可以看到,一旦我们登陆主页,我们就会看到路径的警告,然后导航到其他页面,我们会看到路径other的警告。
一切似乎都很好,那么问题是什么?问题
让我们修改代码以在效果运行完成后执行清理操作。
在修改后的代码中,我们会将警报作为清理操作的一部分。FILENAMEuseLocation。jsThisisthehookthatwewillberunningoneachpageimport{useEffect}fromreact;constuseLocation(pathname){useEffect((){Ifthepathnameissameascurrentpagepath,performsomeoperationForthisexample,theoperationistoalerttheuseronlyifpathnamepassedandwindow。location。pathnameareequalif(pathnamewindow。location。pathname){MODIFIEDCODEHEREremovedalertfromthisconditiondoSomeOperation()}MODIFIEDCODEHERECLEANUPOPERATIONAddedthesamealertherereturn(){alert(OnPage,pathname{pathname},window。location。pathname{window。location。pathname});}},〔pathname,window。location。pathname〕);};exportdefaultuseLocation;
现在让我们看看交互
当我们导航到其他页面时,主页效果已经完成运行并运行清理操作。
虽然我们希望路径和路径名相同,但在警报中我们有路径名‘’和window。location。pathname‘other’。
发生这种情况是因为window。location。pathname在清理操作开始时发生了变化。
当我们从其他页面导航回主页时,也会发生同样的事情。解决方案
让我们修改代码以在依赖项中不使用window。location。pathname,而是使用钩子中定义的局部变量。FILENAMEuseLocation。jsThisisthehookthatwewillberunningoneachpageimport{useEffect}fromreact;constuseLocation(pathname){MODIFIEDCODEHEREAssignedpathwindow。location。pathnameUsethisvariableacrossthehookconstpathwindow。location。pathname;useEffect((){Ifthepathnameissameascurrentpagepath,performsomeoperationForthisexample,theoperationistoalerttheuseronlyifpathnamepassedandpathareequalif(pathnamepath){doSomeOperation()}return(){alert(OnPage,pathname{pathname},window。location。pathname{path}Usepathinsteadofwindow。location。pathname);}},〔pathname,path〕);};exportdefaultuseLocation;
现在让我们看看交互
应用修复后,我们可以看到我们获得了正确且一致的值。
这是可行的,因为路径是每个hook实例的局部变量。虽然它在初始化时被分配给window。location。pathname,但只有在重新渲染时才会重新分配。
你遇到过这样的问题吗!请在评论中让我知道!
人靠衣装马靠鞍,这是一篇快速提升(注水)战斗力的教学战斗力是幻世九歌游戏中非常重要的。战斗力虽然不能代表全部,但是也是总体实力的一个体现,还能解锁更多的副本。接下来,教你如何提高咱们的战斗力。1。任务做任务是提高经验……
瓦尔巴斯跳发让中国女排尴尬天津引入古巴籍土耳其接应二传瓦尔巴斯,虽然只打了五场球,让我这50多年古稀之老球迷看得羡慕,嫉妒,脸红,脸烧,羞愧。瓦尔巴斯太强大了,强大的近乎无懈可击,强大的完全可以邈……
脑机接口之父尼科莱利斯为何离开学界,加入中国初创企业澎湃新闻记者邵文脑机接口之父米格尔尼科莱利斯(MiguelNicolelis)宣布加入中国非侵入式脑机接口公司BrainCo(强脑科技)任首席科学顾问。米格尔尼科莱利斯(……
每体内维斯不会加盟巴萨,他正与曼联谈判且利物浦切尔西想签他直播吧3月26日讯据《每日体育报》报道,内维斯不会加盟巴萨,他可能签约曼联。报道称,巴萨确实从去年夏天以来就一直在关注鲁本内维斯,当时恰逢布斯克茨可能离队,但是哈维更希望……
生意人的明天在哪里改革开放四十年了,社会,市场也由原先的计划经济转变成市场经济。据统计,现在中国注册过的市场主体(企业十个体户)超过一个多亿,占市场总量的三分之二。然而,在这如此庞大的阵营……
早安日历每日一签10。102022年10月10日,农历九月十五,星期一,寒露第三天。每年10。10是辛亥革命纪念日。辛亥革命纪念日是中华民国的诞生日,纪念中国爆发的资产阶级民主革命。辛……
30分10篮板,辽宁2将完成救赎,张镇麟147连续暴扣杨鸣兑30分10篮板,辽宁2将完成救赎,张镇麟147连续暴扣,杨鸣兑现承诺郭艾伦没有进入到辽宁男篮VS上海男篮的大名单,这其实并不让人意外。毕竟这只是一场常规赛,完全没有必要让……
预防慢性病的方法预防慢性病的方法包括健康的饮食方式,生活规律,适当运动,定期体检。1、健康的饮食方式:在预防慢性病的时候要注意健康均衡饮食,限制过多脂肪、刺激性和盐的摄入,多摄入蔬菜水果……
吸烟的人如何养肺?多吃这3类食物,润肺养肺冬季到,天气也越发干燥,人们也相继出现鼻干、嗓子干、上火等情况,特别是对于那些喜欢抽烟的人来说,这种上火的情况就非常明显。近期,可以发现前来门诊拿爽口茶的人是越来越多了,其中大……
世界排名第一的永久免费开源ERPOdooCRM客户关系管理应本文节选自Odoo亚太金牌服务机构【开源智造】所编写的《ERP真的免费不花钱Odoo应用指南》如需获取完整的知识内容,请至开源智造官网免费获取。感谢网友一键三连:点赞、转发、收……
把付出当作人生最大的幸福把付出当作人生最大的幸福,那只有一个理由爱这是一种境界,不是人人可以达到,却也不是高不可攀。在每个人身上,或多或少都有这种光辉闪现。最普遍的付出当推父母对子女……
当代散文经年之后的思索文博华人到中年的我,工作之余,喜欢自己一个人呆坐书房,让自己安然端坐于岁月的一隅,守一份经年之后的领悟,倾听生命悠远的歌唱,在金色的阳光里,张开记忆的翅膀,逆着时光的隧道……