React Hooks为什么要在顶层使用?

news/2024/7/15 19:20:56 标签: react.js, javascript

为什么必须在函数顶层使用hooks?

使用过 hooks 的小伙伴应该都会发现,hooks只能在函数式组件的顶层使用,不能在循环,条件或嵌套函数中调用 Hook。

为什么呢?

查阅了很多答案,总结如下:

hooks 是 react 16.8版本推出的,而react v16版本最大的改变就是引入了fiber架构。hooks的实现就是基于fiber的。每个组件都会生成一个 FiberNode(节点),组件内使用的 hook 会以链表的形式挂在 FiberNode 的 memoizedState 上面。各个 FiberNode 汇聚起来会变成一颗 Fiber 树,React 每次会以固定的顺序遍历这棵树,这样就把整个页面的 hook 都串联起来了。
当 react 重新渲染时,会生成一个新的 fiber 树,而这里会根据之前已经生成的 FiberNode ,拿到之前的 hook ,再复制一份到新的 FiberNode 上,生成一个新的 hooks 链表。
react按顺序来区分不同的 hook,它默认你不会修改这个顺序。如果你没有在顶层使用 hook ,打乱了每次 hook 调用的顺序,就会导致 react 无法区分出对应的 hook


http://www.niftyadmin.cn/n/5163228.html

相关文章

【DCMTK】DcmItem::putAndInsertOFStringArray失败

返回错误信息 Illegal call, perhaps wrong parameters 因为该函数只支持以下VR AE, AS, CS, DA, DS, DT, IS, LO, LT, PN, SH, ST, TM, UC, UI, UR, UT 如果输入了数值以及数组类型的数据就会失败 改用putAndInsertString即可,该函数基本上支持所有VR AE, AS, AT,…

C++使用serial串口通信 + ROS2示例IMU串口驱动

目录 一、通信协议二、串口调试工具三、serial库的使用3.1 安装serial3.2 serial的使用3.3 绑定端口 四、编写IMU ROS2串口驱动 串行接口 (Serial Interface)简称串口(通常指COM接口),是采用串行通信方式的扩展接口&am…

本地电脑如何连接使用腾讯云服务器

如何连接使用腾讯云服务器 在自己的电脑上,单击 ,在搜索中,输入 mstsc,按 Enter,打开远程桌面连接对话框。如下图所示: 在“计算机”后面,输入 服务器的公网 IP,就是上节大图左侧…

算法通关村第八关|白银|二叉树的深度和高度问题【持续更新】

1.最大深度问题(后序遍历) 只需要一直递归,维护一个最大值。每一层只要有一个子节点,这个最大值就可以增加。 public int maxDepth(TreeNode root) {if (root null) {return 0;}int leftHeight maxDepth(root.left);int right…

【16】c++11新特性 —>独占智能指针unique_ptr

初始化 std::unique_ptr是一个独占的智能指针&#xff0c;他不允许其他的智能指针共享其内部的指针&#xff0c;可以通过他的构造函数初始化一个独占智能指针对象&#xff0c;但是不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr。 unique_ptr<int> func() {re…

AGC034E Complete Compress

AGC034E Complete Compress 洛谷[AGC034E] Complete Compress 题目大意 给你一棵有 n n n个节点的树&#xff0c;并用 01 01 01串告诉你哪些节点上有棋子&#xff08;恰好一棵&#xff09;。 你可以进行若干次操作&#xff0c;每次操作可以将两颗距离至少为 2 2 2的棋子向彼…

响应式seo搜索引擎优化快排网站模板源码带后台

模板信息&#xff1a; 模板编号&#xff1a;30302 模板编码&#xff1a;UTF8 模板分类&#xff1a;IT、软件、互联网、游戏 适合行业&#xff1a;互联网类企业 BUG修正&#xff1a; 暂无 模板介绍&#xff1a; 本模板自带eyoucms内核&#xff0c;无需再下载eyou系统&#xff0c…

【CSDN 每日一练 ★☆☆】【数学】Excel表列名称

【CSDN 每日一练 ★☆☆】【数学】Excel表列名称 数学 进制转换 题目 给你一个整数columnNumber &#xff0c;返回它在 Excel 表中相对应的列名称。 例如&#xff1a; A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 示例 1&#xff1a; 输…