首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我打破了 React Hook 必须按顺序、不能在条件语句中调用的枷锁

这个限制在开发中也确实会时常影响到我们的开发体验,比如函数组件中出现 if 语句提前 return 了,后面又出现 Hook 调用的话,React 官方推的 eslint 规则也会给出警告。...但我的想法是,能不能借助 babel 插件的编译能力,实现编译期自动为每一次 Hook 调用都注入一个 key, 伪代码如下: traverse(node) { if (isReactHookInvoking...也许有一些我没有考虑周到的地方 总结 本文只是一篇探索性质的文章: 介绍 Hook 实现的大概原理以及限制 探索出修改源码机制绕过限制的方法 其实本意是帮助大家更好的理解 Hook。...我并不希望 React 取消掉这些限制,我觉得这也是设计的取舍。 如果任何子函数,任何条件表达式中都可以调用 Hook,代码也会变得更加难以理解和维护。...感谢大家 我是 ssh,目前就职于字节跳动的 Web Infra 团队,目前团队在北上广深杭都还缺人(尤其是北京)。

1K20

我打破了 React Hook 必须按顺序、不能在条件语句中调用的枷锁!

这个限制在开发中也确实会时常影响到我们的开发体验,比如函数组件中出现 if 语句提前 return 了,后面又出现 Hook 调用的话,React 官方推的 eslint 规则也会给出警告。...由于 React 的源码太复杂,接下来本文会以原理类似但精简很多的 Preact[1] 的源码为切入点来调试、讲解。...但我的想法是,能不能借助 babel 插件的编译能力,实现编译期自动为每一次 Hook 调用都注入一个 key, 伪代码如下: traverse(node) { if (isReactHookInvoking...也许有一些我没有考虑周到的地方,对此有任何想法的同学都欢迎加我微信 sshsunlight[4] 讨论,当然单纯的交个朋友也没问题,大佬或者萌新都欢迎。...我并不希望 React 取消掉这些限制,我觉得这也是设计的取舍。 如果任何子函数,任何条件表达式中都可以调用 Hook,代码也会变得更加难以理解和维护。

1.8K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    对不起,我的健康码不能给你

    营业员在帮我办理业务时,除了拍照我的身份证件外,还说要留存我的健康码和行程码。...这个要求就有点奇怪了,尽管我两个码都是正常,但作为从事隐私信息保护工作的我,对涉及自己隐私数据的事情,觉得还是要和他掰斥一下。 首先,我问他为什么需要留存我的两码?...因为我进营业厅的时候扫过各种健康码的,我于是给他扣了个大帽子:过度防疫(另一个类似的帽子是“层层加码”)。...因为我清楚地记得,行程码在使用时,用户只授权了用于防疫目的。至于其他目的,对不起,我没授权你用,就算你的理由多么冠冕堂皇,也不能随便给你。 至于他们留存我的健康码,更连个正当的理由都没有。...我坚定的回绝了。 根据去年实施的《个人信息保护法》规定, 第六条,处理个人信息应当具有明确、合理的目的,并且不得过度收集个人信息。 第十三条,在一般情况下,处理个人信息应当取得个人同意。

    40030

    windows中bat批处理的注释语句

    转自:wh_19910525 https://blog.csdn.net/wh_19910525/article/details/8125762 写bat批处理也一样,都要用到注释的功能,这是为了程式的可读性...在批处理中,段注释有一种比较常用的方法: goto start = 可以是多行文本,可以是命令 = 可以包含重定向符号和其他特殊字符 = 只要不包含 :start 这一行,就都是注释 :...start Jetbrains全家桶1年46,售后保障稳定 另外,还有其他各种注释形式,比如: 1、:: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符) 2、rem 注释内容(不能出现重定向符号和管道符号...) 3、echo 注释内容(不能出现重定向符号和管道符号)〉nul 4、if not exist nul 注释内容(不能出现重定向符号和管道符号) 5、:注释内容(注释文本不能与已有标签重名)...6、%注释内容%(可以用作行间注释,不能出现重定向符号和管道符号) 7、goto 标签 注释内容(可以用作说明goto的条件和执行内容) 8、:标签 注释内容(可以用作标签下方段的执行内容) 注释内容

    2.6K20

    把我坑惨的一个update语句!

    刚遇到这个问题的时候,我拿到这条语句直接在测试库里面执行了一把,发现确实有问题,但和开发描述的还是有区别 ,这里我用测试数据来模拟下: 有问题的SQL语句: ? 执行之前的记录是这样的: ?...执行之后的记录是这样的: ? 可以看到,结果并不像这位开发同学说的“好像没有效果”,实际上是有效果的: ? why? 看起来,语法是完全没有问题,翻了翻MySQL官方文档的update语法: ?...看到assignment_list的格式是以逗号分隔的col_name=value列表,一下子豁然开朗,开发同学想要的多字段更新语句应该这样写: ? 倒回去再重试验一把: ?...果然,这下得到了想要的结果! 小结 : 在一条UPDATE语句中,如果要更新多个字段,字段间不能使用“AND”,而应该用逗号分隔。...后记 :后面等有空的时候,又回过头来看了一下,为什么使用“AND”分隔的时候,会出现owner_code=0的奇怪结果?多次尝试之后发现: ? 等价于: ?

    84030

    处理mac不能使用rz和sz的问题

    我们经常使用 sz/rz 命令进行文件的上传下载,非常方便。...但是在 Mac 下面就不能直接使用了需要进行配置才能使用 昨天在给客户调试相关代码时,需要覆盖一些代码,使用 rz 进行上传时却报错了: rz waiting to receive....**B0100000023be50 使用 sz 下载也是报错: **B00000000000000 并且都会卡死终端一段时间 解决方案 解决的方案有点复杂,一点一点来看 安装 lrzsz 首先需要我们安装一下...点击 iTerm2 的设置界面 Perference -> Profiles -> Default -> Advanced -> Triggers 的 Edit 按钮 点击+号,添加如下的参数 Regular...Parameters: /usr/local/bin/iterm2-recv-zmodem.sh Instant: checked 添加完成如下图所示 至此,我们就可以愉快的使用

    1.7K40

    一个让我欲罢不能的 GitHub 开源项目!

    自 2015 年的千播大战至今,社交直播已经衍生出很多不同的玩法了。传统的简单 “你说我听”,已经再基础不过,又很难给观众带来 “刺激” 的形式了。...但问题是,实时音视频技术背后有非常多的坑,很难有一个人能从后端到前端自研出来一套直播系统。而通过调用不同的 API 来搭建是最佳的实践途径。...可以结合 FUClient 这个类的实现与 FaceUnity 的文档来集成美颜模块。...CVPixelBufferRef)pixelBuffer; - (void)destoryAllItems; @end 视频流从 AVCaptureSession 流出,流入 FaceUnity 进行前处理...官方表示还将在接下来几个月对 repo 中的代码进一步梳理、优化,提升源码的易用性、可读性。而且,未来还会增加新的场景。

    2.4K10

    我去,你写的 switch 语句也太老土了吧

    但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。...是不是觉得我在无事生非,错怪了小王!但此时我要送上《了不起的盖茨比》中的一句话: 我年纪还轻,阅历不深的时候,我父亲教导过我一句话,我至今还念念不忘。...从 JDK 12 开始(本例使用的是 JDK 13),switch 语句升级了,不仅可以像传统的 switch 语句那样作为条件的判断,还可以直接作为一个返回结果。...并且,default 语句变成了可选项,可有可无,不信?你也动手试试。 新的 switch 语句足够的智能化,除了有上述的 3 个优势,还可以对枚举类型的条件进行校验。...“不好意思,我为昨天早上的嚣张向你道歉。。。。。。”我向小王发送了一条信息。

    42820

    EasyDSS提示所配置路径不能包含中文的处理方法

    EasyDSS能实现视频流媒体的上传、转码、存储、录像、推流、拉流、直播等功能。在视频能力上,平台可支持用户自行上传视频文件,也可将上传的点播文件作为虚拟直播进行播放。...图片 有用户反馈,用户的EasyDSS服务器因中毒导致其文件丢失,重新拷贝压缩后再进行运行,发现平台提示所有配置路径不能包含中文,如下图所示,不知道如何解决。...我们发现该用户的配置路径并不包含中文: 图片 2)然后再查看版本。...图片 随着视频直播行业的蓬勃发展,视频直播点播平台EasyDSS在该领域的应用也得到快速普及。...EasyDSS灵活可拓展的视频能力,很适合OTT TV、IPTV、互联网教育、视频聊天、现场直播和VOD等应用。

    58320

    Python基础语法-函数的错误处理-raise语句

    在Python中,可以使用raise语句抛出一个异常。当程序运行时遇到一个错误或异常情况时,raise语句可以被用来中止程序的执行,并且可以向上抛出异常信息。...在编写代码时,我们可以使用raise语句来控制程序的流程,实现更为精细的错误处理。...在上面的例子中,我们定义了一个名为MyError的异常类,并在func函数中使用raise语句抛出这个异常。当程序执行到raise语句时,就会抛出MyError类型的异常,并附带上"出错了!"...当需要抛出这些内置异常时,只需要直接使用它们的名称即可,例如:def func(x): if x 不能是负数!")...在上面的例子中,如果传入的x是一个负数,那么就会抛出一个ValueError异常,并且异常的信息为"x不能是负数!"。

    69510

    Python基础语法-函数的错误处理-assert语句

    在Python中,assert语句是一种用于断言(assertion)的语句,用来检查某个条件是否成立。...= 0, "除数不能为0" return a / b在上面的例子中,我们定义了一个divide函数,用于进行两数相除的操作。在函数中,我们使用了assert语句来检查除数是否为0。...如果除数为0,就会抛出一个AssertionError异常,并且输出"除数不能为0"这个错误信息。如果除数不为0,程序就会继续执行,返回a/b的结果。...使用assert语句的好处是,在程序出现错误时能够立即停止执行,并且输出错误信息,方便我们进行调试和错误处理。...但是,在正式发布程序时,需要注意将所有的assert语句都删除或者注释掉,以避免潜在的安全问题。

    60830

    Minecraft我的世界(矩阵处理)- HDU 5538

    玩过Minecraft我的世界?这个游戏是近年来世界上最流行的游戏。Minecraft的世界是由小方块(1x1x1)构成,有很多类型的小方块,有些小方块是黏土、水、木材、空气,有些是小砖块、混泥土。...Nyanko是这个游戏的铁粉,他最喜欢做的事情就是建大房子。一天,他发现了一个平坦的陆地,这是一个超级大的平地,在这里建造房子实在是再好不过了。...Nyanko发现他忘了放置玻璃方块,这是装饰用的。Nyanko于是带着蓝图来找你让你想想办法。你的任务很简单,收集足够多的玻璃方块去建造他的房子。...为了简单起见,Nyanko的图纸可以表示成一个二维数组Cij,其中i大于1小于n,j大于1小于m,Cij表示的是i行j列的高度,玻璃方块的数量就是房子的体积。...题目copy老是出错,我就直接贴题意吧: 输入数据例数T; 接下来T例输入地图大小m*n和地图每个格子上的方块数; 要求输出每个地图的表面积(不包括底面积)。

    85130
    领券