React Hook之钩子调用规则(不在循环、条件判断或者嵌套函数中调用)

文章目录

    • React Hook之钩子调用规则(不在循环、条件判断或者嵌套函数中调用)
      • 错误使用案例
      • 案例具体解决方法

React Hook之钩子调用规则(不在循环、条件判断或者嵌套函数中调用)

hooks使用规则

  • 只能在函数最外层调用 Hook。不要在循环、条件判断或者子函数中调用。
  • 只能在 React 的函数组件中调用 Hook。不要在其他 JavaScript 函数中调用。(还有一个地方可以调用 Hook —— 就是自定义的 Hook 中)

错误使用案例

代码:

  const useCustomItemRender = (originNode: React.ReactNode, file: CustomUploadFile) => {const [editing, setEditing] = useState(false);const [newName, setNewName] = useState(file.name);const handleEdit = () => {setEditing(true);};const handleSave = () => {setEditing(false);handleEditDescription(file.uid, newName);};const render = editing ? (<div><Inputvalue={newName}onChange={(e) => setNewName(e.target.value)}onPressEnter={handleSave}onBlur={handleSave}autoFocus/></div>) : (<div onClick={handleEdit}>{file.name}</div>);return render;};const customItemRender: ItemRender<CustomUploadFile> = (originNode, file) => {const render = useCustomItemRender(originNode, file);return render;};

报错:
React Hook “useCustomItemRender” is called in function “customItemRender: ItemRender” that is neither a React function component nor a custom React Hook function. React component names must start with an uppercase letter. React Hook names must start with the word “use”.

报错解释:
这个错误表明你在React函数组件中使用了名为useCustomItemRender的自定义钩子(Hook),而这个钩子的使用发生在一个内嵌函数customItemRender中。React的钩子(Hooks)只能在函数组件的主体或者其他钩子中调用,而不能在嵌套函数或者控制流逻辑中调用。这个规则被称为“钩子调用规则”。

解决方法:
确保useCustomItemRender只在组件的主体中调用一次。如果customItemRender是一个独立的函数,你应该将useCustomItemRender的调用移到customItemRender函数外部,确保它不会在customItemRender内部被调用。如果customItemRender是一个React组件,那么应该将useCustomItemRender的调用保持在该组件的主体中。

// 不正确的使用方式
function MyComponent() {function customItemRender() {const [value, setValue] = useCustomItemRender(); // 错误,在内嵌函数中调用钩子// ...}// ...
}// 正确的使用方式
function MyComponent() {const [value, setValue] = useCustomItemRender(); // 正确,在组件主体中调用钩子function customItemRender() {// 使用value和setValue// ...}// ...
}

如果useCustomItemRender是一个自定义的钩子,它应该遵循React的钩子调用规则,即不在循环、条件判断或者嵌套函数中调用。如果需要在多个地方复用状态逻辑,可以考虑使用自定义组件或高阶组件。

总结:在内嵌函数 customItemRender 中调用了自定义的钩子 useCustomItemRender,而 React 钩子(Hooks)只能在函数组件的主体或其他钩子中调用,不能在嵌套函数中调用。

案例具体解决方法

为了解决这个问题,我们需要将 customItemRender 函数转换为一个自定义的 React 组件,以便在组件主体中调用钩子。

  const CustomItemRender: React.FC<{ originNode: React.ReactNode, file: CustomUploadFile }> = ({ originNode, file }) => {const render = useCustomItemRender(originNode, file);return render;};const customItemRender: ItemRender<CustomUploadFile> = (originNode, file) => {const render = <CustomItemRender originNode={originNode} file={file} />;return render;};

这段代码定义了一个名为 CustomItemRender 的组件,并将其用作 customItemRender 函数的返回值。

通过将 customItemRender 函数转换为一个自定义的 React 组件 CustomItemRender,我们可以在组件主体中调用钩子。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

八、测试分析报告(软件工程)

1&#xff0e;引言 1.1编写目的 1.2项目背景 1.3定义 1.4参考资料 2&#xff0e;测试计划执行情况 2.1测试项目 2.2测试机构和人员 2.3测试结果 3&#xff0e;软件需求测试结论 4&#xff0e;评价 4.1软件能力 4.2缺陷和限制 4.3建议 4.4测试结论 …

字面跳动前端面试题:React Hook为什么不能放在if/循环/嵌套函数里面?

答&#xff1a;首先&#xff0c;React Hooks 是为了简化组件逻辑和提高代码可读性而设计的。将 Hook 放在 if/循环/嵌套函数中会破坏它们的封装性和可预测性&#xff0c;使得代码更难维护和理解。同时&#xff0c;这样做也增加了代码的复杂度&#xff0c;可能会导致性能下降和潜…

路由器、路由器的构成、交换结构

目录 1 路由器 1.1 路由器的结构 “转发”和“路由选择”的区别 1.1.1 输入端口对线路上收到的分组的处理 1.1.2 输出端口将交换结构传送来的分组发送到线路 2.2 交换结构 2.2.1 通过存储器 2.2.2 通过总线 2.2.3 通过纵横交换结构 (crossbar switch fabric) 1 路由器…

算法练习-环形链表(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;链表 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨在…

用Jmeter进行接口测试

web接口测试工具&#xff1a; 手工测试的话可以用postman &#xff0c;自动化测试多是用到 Jmeter&#xff08;开源&#xff09;、soupUI&#xff08;开源&商业版&#xff09;。 下面将对前一篇Postman做接口测试中的接口用Jmeter来实现。 一、Jmeter 的使用步骤 打开Jme…

SpringCloud Gateway(4.1.0) 返回503:原因分析与解决方案

文章目录 一、环境版本二、原因分析三、解决方案 一、环境版本 Versionspring-cloud-dependencies2023.0.0spring-cloud-starter-gateway4.1.0Nacosv2.3.0 二、原因分析 在 Spring Cloud Gateway 的早期版本中&#xff0c;Ribbon 被用作默认的负载均衡器。随着Spring Cloud的…

美敦力呼吸机PB560硬件分析

1 硬件主要芯片 CPU板的MCU和电源板的MCU通过SPI-0通信。 1.1 CPU板 1&#xff09;ST10F276&#xff0c;16bit MCU 2&#xff09;K6R4016C1D-UI10&#xff0c;Samsung 256K x 16 SRAM&#xff0c;Event Memory 3&#xff09;K9F1G08UOA-PCB0&#xff0c;Samsung 128M x 8 NAND …

修复wordpress安全漏洞

1. 问题描述&#xff1a; 用wordpress建了一个网站&#xff0c;但是学校反映说存在安全漏洞&#xff0c;通过接口https://xxx.xxx.edu.cn/?rest_route/wp/v2/users/可以访问到一些内容&#xff0c;希望可以关闭这个接口。 2. 解决办法 一共两步 &#xff08;1&#xff09;在fu…

系统架构20 - 统一建模语言UML(上)

统一建模语言 组成要素事物关系 在目前的软件开发方法中&#xff0c;面向对象的方法占据着主导地位。面向对象方法的主导地位也决定着软件开发过程模型化技术的发展&#xff0c;面向对象的建模技术方法也就成为主导的方法。 公认的面向对象建模语言出现于20世纪70年代中期。从1…

vulhub中Adminer ElasticSearch 和 ClickHouse 错误页面SSRF漏洞复现(CVE-2021-21311)

Adminer是一个PHP编写的开源数据库管理工具&#xff0c;支持MySQL、MariaDB、PostgreSQL、SQLite、MS SQL、Oracle、Elasticsearch、MongoDB等数据库。 在其4.0.0到4.7.9版本之间&#xff0c;连接 ElasticSearch 和 ClickHouse 数据库时存在一处服务端请求伪造漏洞&#xff08…

Nginx如何对运行老业务的服务器平滑升级版本

Nginx如何对运行老业务的服务器平滑升级版本 Nginx是一个开源的、高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。在本文中&#xff0c;我们将讨论如何在不影响现有业务的情况下&#xff0c;对运行老业务的服务器进行Nginx版本的平滑升级。 1. …

学习ArtTs -- 初见ArkTs

作者&#xff1a;Uncle_Tom 原文链接&#xff1a;学习ArtTs -- 初见ArkTs-云社区-华为云 1. 前言 需要静态分析去检查一个语言&#xff0c;必须对这个语言有深刻的认识&#xff0c;才能有效的对这个语言进行有效的检查。 我常说:“作为一个程序分析员需要比一般的程序员考虑…

反演LAI(二)基于查找表的反演

反演LAI(二)基于查找表的反演 相关波段选取 首先我们使用gf-1数据有四个波段,使用其他高光谱会有几十个波段,但并不是所有波段都需要选用,lai对于不同波段的响应不同。根据上一节的敏感性分析结果,可以发现,400-500,600-700的两个波段对于LAI敏感性更大,因此选取这两…

【人工智能时代】AI赋能编程 | 自动化工具助力高效办公

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言泡泡AI工具卡片思维导图Markdown编辑器 其他工具文件免费处理工具结语 合集…

【C/C++ 11】贪吃蛇游戏

一、题目 贪吃蛇游戏机制是通过控制蛇上下左右移动并吃到食物得分。 蛇头碰到墙壁或者碰到蛇身就游戏结束。 食物随机生成&#xff0c;蛇吃到食物之后蛇身变长&#xff0c;蛇速加快。 二、算法 1. 初始化游戏地图并打印&#xff0c;地图的边缘是墙&#xff0c;地图的每个坐…

Python tkinter (14) —— 按键事件

本文主要介绍Python tkinter 几种按键事件及其示例。 目录 按键事件 响应所有按键事件 窗体绑定事件 响应特殊按键事件 指定按键事件 组合按键事件 总结 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— But…

Kafka相关内容复习

为什么要用消息队列 解耦 允许你独立的扩展或修改两边的处理过程&#xff0c;只要确保它们遵守同样的接口约束。 可恢复性 系统的一部分组件失效时&#xff0c;不会影响到整个系统。消息队列降低了进程间的耦合度&#xff0c;所以即使一个处理消息的进程挂掉&#xff0c;加入队…

【Spring连载】使用Spring Data访问Redis(八)----发布/订阅消息

【Spring连载】使用Spring Data访问Redis&#xff08;八&#xff09;----发布/订阅消息Pub/Sub Messaging 一、发布消息Publishing (Sending Messages)二、订阅消息Subscribing (Receiving Messages)2.1 消息监听容器Message Listener Containers2.2 消息监听适配器The Message…

Transformer 自然语言处理(三)

原文&#xff1a;Natural Language Processing with Transformers 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第八章&#xff1a;使 transformers 在生产中更高效 在之前的章节中&#xff0c;您已经看到了 transformers 如何被微调以在各种任务上产生出色的结果。…

AI 数字人从制作到变现

最近AI很火&#xff0c;无意中发现一个宝藏专栏《AI数字人从制作到变现》&#xff0c;原价599&#xff0c;现在推广阶段&#xff0c;只需要10元&#xff0c;专栏持续更新中&#xff0c;会有更多的知识后续分享。如有兴趣可以用微信扫描左侧海报二维码&#xff0c;下面我将介绍专…