为什么 hooks 不能放在循环或者条件判断语句里?

news/2024/7/15 17:21:43 标签: javascript, 前端, react.js

React 官网介绍了 Hook 的这样一个限制:
不要在循环,条件或嵌套函数中调用 Hook, 确保总是在你的 React 函数的最顶层以及任何 return 之前调用他们。遵守这条规则,你就能确保 Hook 在每一次渲染中都按照同样的顺序被调用。这让 React 能够在多次的 useState 和 useEffect 调用之间保持 hook 状态的正确。(如果你对此感到好奇,我们在下面会有更深入的解释。)

这个限制在开发中也确实会时常影响到我们的开发体验,比如函数组件中出现 if 语句提前 return 了,后面又出现 Hook 调用的话,React 官方推的 eslint 规则也会给出警告。

javascript">​
function App(){
  if (xxx) {
    return null;
  }
 
  // ❌ React Hook "useState" is called conditionally. 
  // React Hooks must be called in the exact same order in every component render.
  useState();
  
  return 'Hello'
}
 
​

这是因为 hooks 为了在函数组件中引入状态,维护了一个有序表。

这样每次执行才能保证状态能对应上。

比如第一次执行函数组件时,我们拿到状态 count(通过 setState,初始值为 0 )和 isDone(通过 setState,初始值为 false),它们其实被保存到一个有序表中,它们的值会记录下来: [0, true] 。

第二次执行函数组件,setState 会 按顺序 从这个表中拿出 0 和 true,赋值给 count 和 isDone。

如果你把 hook 写到判断条件下,导致某个 setState 不执行了,这里我们假设 count 的 setState 因为判断条件没有执行,会发生什么?结果是 isDone 拿到了 0,发生了错位。

函数本身不能保存状态,我们需要额外维护一个有序的表,在执行 setState 之类的 hook 时,将它们保存到这个表里。

这要求每次函数组件的 hook 执行的位置相同,数量正确,否则会导致错位,不能拿到预期的状态值。


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

相关文章

C++连续性问题

连胜王 #include<bits/stdc.h> using namespace std; long long n; int main() {int a[110];cin>>n;for(int i0;i<n;i){cin>>a[i];}int sum0;int ma0;int d0;int md0;for(int i0;i<n;i){if(a[i]!d){if(sum>ma){masum;mdd;}sum1;da[i];}if(a[i]d){s…

基于SpringBoot的养老院信息管理系统

基于SpringBoot的养老院信息管理系统&#xff0c;java项目&#xff0c;springboot项目&#xff0c;idea都能打开运行。 推荐环境配置&#xff1a;idea jdk1.8 maven mysql5.5/mysql5.7 主要技术: SpringBoot&#xff0c;MySql&#xff0c;ajax&#xff0c;MyBatis 本系统的主要…

什么是Steam红锁?及红锁的原因

Steam红锁分为两种&#xff0c;一种是商业红&#xff0c;一种是欺诈红。 造成红锁的原因有哪些&#xff1f; 1.非正常玩家&#xff0c;大量囤货&#xff0c;就是你交易饰品的交易量太大了&#xff0c;而且频繁地买进同一个饰品&#xff0c;官方就会判定你是商业行为&#xff0…

三相电机输入线电流与输出功率之间的理论曲线

1.首先取一组电机参数&#xff08;某变频器自己测得的参数&#xff09;&#xff1a; 定子电阻&#xff1a;11.421欧转子电阻&#xff1a;7.553欧漏感抗&#xff1a;42.90 毫亨互感抗&#xff1a;553.9毫亨空载电流&#xff1a;1.17安。 2. 利用T型等效电路公式绘图 import num…

JavaScript对象数组根据某个属性值筛选分类

&#x1f935; 作者&#xff1a;coderYYY &#x1f9d1; 个人简介&#xff1a;前端程序媛&#xff0c;目前主攻web前端&#xff0c;后端辅助&#xff0c;其他技术知识也会偶尔分享&#x1f340;欢迎和我一起交流&#xff01;&#x1f680;&#xff08;评论和私信一般会回&#…

javaEE -12(12000字CSS入门级教程)

css即层叠样式表 (Cascading Style Sheets). CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. CSS基本语法规范&#xff1a; 选择器 {一条/N条声明} 选择器决定针对谁修改 (找谁)声明决定修改啥. (干啥)声明的属性是…

MySQL查询今日、昨日、最近七天的数据

查询今日数据 sql语句&#xff1a; SELECT * FROM short_oper_log WHERE to_days(login_time) to_days(now());运行结果&#xff1a; 查询昨日数据 sql语句&#xff1a; SELECT * FROM short_oper_log WHERE DATEDIFF(login_time,NOW()) -1;运行结果&#xff1a; 额外…

halcon roberts、 prewitt_amp、 sobel_amp、 edges_image、 laplace_of_gauss 对比

原图 灰度&#xff1a; roberts 算子&#xff1a; prewitt算子 sobel 算子 canny算子 拉普拉斯 代码&#xff1a; read_image (Image, C:/Users/alber/Desktop/opencv_images/canny.png) rgb1_to_gray (Image, GrayImage)* 测试 roberts 算子 roberts (GrayImage, ImageRoberts…