react中hooks使用限制

news2024/10/7 12:29:09
  1. 只能在最顶层使用Hook
    不要在循环、条件中调用hook,确保总是在React函数最顶层使用它们

  2. 只能React函数中调用Hook
    不要在普通的js函数中调用
    在React的函数组件中调用Hook
    在自定义hook中调用其他hook

原因:
我们每次的状态值或者依赖项存在哪里,是存在Fiber节点上的,然后才能比较前后两次,但是普通的函数是没有Fiber节点的。所以无法使用。

hooks是作为一个单链表存储在fiber.memoizedState上的,因为这些hook没有名字,所以为了区分它们,我们必须保证这个链表节点顺序的稳定性。

import {useState, useReducer, useEffect} from "react";

function FunctionComponent() {
  const [count, setCount] = useState(0);
  const [count2, dispatch] = useReducer((x) => x + 1, 0);

  useEffect(() => {
    console.log("count"); //sy-log
  }, [count]);

  return (
    <div className="function border">
      <button onClick={() => setCount(count + 1)}>{count}</button>
      <button onClick={() => dispatch()}>{count2}</button>
    </div>
  );
}

const jsx = <FunctionComponent />;

export default jsx;

我们可以在react源码中打印fiber看看hooks是怎么存储的?
在这里插入图片描述
next又指向下一个hook

可以简单看看构建链表如何构建的?
第0个hook挂载到memoizedState上,后面的都挂载到next上。
在这里插入图片描述

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

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

相关文章

Unity触发器的使用

1.首先建立两个静态精灵&#xff08;并给其中一个物体添加"jj"标签&#xff09; 2.添加触发器 3.给其中一个物体添加刚体组件&#xff08;如果这里是静态的碰撞的时候将不会触发效果&#xff0c;如果另一个物体有刚体可以将它移除&#xff0c;或者将它的刚体属性设置…

Jest:JavaScript的单元测试利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

挑战杯 机器视觉目标检测 - opencv 深度学习

文章目录 0 前言2 目标检测概念3 目标分类、定位、检测示例4 传统目标检测5 两类目标检测算法5.1 相关研究5.1.1 选择性搜索5.1.2 OverFeat 5.2 基于区域提名的方法5.2.1 R-CNN5.2.2 SPP-net5.2.3 Fast R-CNN 5.3 端到端的方法YOLOSSD 6 人体检测结果7 最后 0 前言 &#x1f5…

YOLOV9训练自己的数据集

1.代码下载地址GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 2.准备自己的数据集 这里数据集我以SAR数据集为例 具体的下载链接如下所示&#xff1a; 链接&#xff1a;https:/…

软件测试 自动化测试selenium 基础篇

文章目录 1. 什么是自动化测试&#xff1f;1.1 自动化分类 2. 什么是 Selenium &#xff1f;3. 为什么使用 Selenium &#xff1f;4. Selenium 工作原理5. Selenium 环境搭建 1. 什么是自动化测试&#xff1f; 将人工要做的测试工作进行转换&#xff0c;让代码去执行测试工作 …

netlogo 羊-草生态系统模型的系统动力学搭建

to setupclear-allsystem-dynamics-setupendto gosystem-dynamics-gosystem-dynamics-do-plot enda 羊的净出生率 a 0.001sheep_birth a * sheep * grass羊 10 sheep 10b 羊的死亡率 0.01 b 0.01death 羊的死亡流 羊x 羊的死亡率 death b * sheep草 200 grass 200R 草的净…

2024最新PHP彩虹网盘与外链分享程序,支持所有格式文件的上传

彩虹外链网盘是一款基于PHP的在线存储和分享平台&#xff0c;它允许用户上传各种类型的文件&#xff0c;并提供了生成文件链接、图片链接、音乐和视频链接的功能。同时&#xff0c;它还会自动生成相应的UBB代码和HTML代码&#xff0c;支持文本、图片、音乐和视频的在线预览。这…

基于深度学习LSTM+NLP情感分析电影数据爬虫可视化分析推荐系统(深度学习LSTM+机器学习双推荐算法+scrapy爬虫+NLP情感分析+数据分析可视化)

文章目录 基于深度学习LSTMNLP情感分析电影数据爬虫可视化分析推荐系统&#xff08;深度学习LSTM机器学习双推荐算法scrapy爬虫NLP情感分析数据分析可视化&#xff09;项目概述深度学习长短时记忆网络&#xff08;Long Short-Term Memory&#xff0c;LSTM&#xff09;机器学习协…

【Frida】04_Frida中使用TypeScript脚本(采坑)

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境演示目标 1️⃣ 操作步骤安装node 20.10.0在 VSCode 中打开项目目录初始化一个 NodeJS 项目安装 TypeScript初始化 TypeScript 项目安装依赖配置 TypeScript编写代码编译设置编译脚本运行&#xff0c;查看结果 2️⃣ 采坑frida-compi…

R语言深度学习-6-模型优化与调试

本教程参考《RDeepLearningEssential》 这是本专栏的最后一篇文章&#xff0c;一路走来&#xff0c;大家应该都可以独立的建立一个自己的神经网络进行特征学习和预测了吧&#xff01; 6.1 缺失值处理 在我们使用大量数据进行建模的时候&#xff0c;缺失值对模型表现的影响非常…

【鸿蒙HarmonyOS开发笔记】自定义组件详解

自定义组件 除去系统预置的组件外&#xff0c;ArkTS 还支持自定义组件。使用自定义组件&#xff0c;可使代码的结构更加清晰&#xff0c;并且能提高代码的复用性。 我们开发的每个页面其实都可以视为自定义组件内置组件的结合 语法说明 自定义组件的语法如下图所示 各部分…

Github: Github actions 自动化工作原理与多workflow创建和部署

Github actions 1 &#xff09;概述 Github Actions 是Github官方推出的 CI/CD 解决方案 https://docs.githu.com/en/actions 优点 自动发布流程可减少发布过程中手动操作成本&#xff0c;大幅提升ci/cd效率&#xff0c;快速实现项目发布上线 缺点 存在较高的技术门槛需要利用…

Linux_基础指令(一)

目录 1、ls指令 1.1 ls -l 1.2 ls -a 1.3 ls -i 2、pwd指令 3、cd指令 3.1 路径的概念 3.1.1 绝对路径 3.1.2 相对路径 3.2 cd ~ 3.3 cd - 4、touch指令 5、mkdir指令 6、删除系列的指指令 6.1 rmdir 6.2 rm 7、man指令 8、cp指令 9、move指令 结…

算法——贪心

「贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优」 贪心无套路 1. 分发饼干 贪心策略&#xff1a; &#xff08;1&#xff09;局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个&#xff0c;全局最优就是喂饱尽可能多的小孩 &#xff08…

AndroidStudio 由dolphin升级到giraffe,出现“gradle project sync failed“

1 现象描述 将AS由之前的dolphin版本升级到giraffe之后&#xff0c;接着打开以前的Android project&#xff0c;出现了"Gradle project sync failed…"的异常提示&#xff0c;在build面板中并没有出现project sync过程中报错的日志。 异常提示如下图所示&#xff1a…

mysql驱动的下载和JDBC的使用(在idea上)

1.mysql驱动的下载 在这里我们需要进入中央仓库中去下载mysql驱动的下载。 https://mvnrepository.com/ 上面就是中央仓库的网址。 如图&#xff1a; 上面就是中央仓库的网址首页。 1.在上面搜索框内输入mysql 如图&#xff1a; 这里呢&#xff0c;上面的mysql 是8.0以上版…

安装使用sqlite

在SQLite 下载页面中下载Windows的预编译的二进制文件 下载sqlite-tools-win32-*.zip和sqlite-dll-win32-*.zip压缩文件 解压下载的两个压缩文件&#xff0c;创建一个sqlite文件夹&#xff0c;把解压的文件放到sqlite的文件夹中&#xff0c;把创建的sqlite文件夹添加到环境变量…

Python——pgzero游戏打包exe执行时报错

Python——pgzero游戏打包exe执行时报错 记录一次使用 pgzero 开发游戏&#xff0c;使用 pyinstaller 打包时报错 目录结构&#xff1a; 1. 第一次报错 打包指令&#xff1a; pyinstaller -Fw .\code.py结果打开报错 报错如下&#xff1a; Traceback (most recent call…

【2024第一期CANN训练营】2、AscendCL概述

文章目录 【2024第一期CANN训练营】2、AscendCL概述1. AscendCL架构及基本概念1.1 什么是AscendCL&#xff1f;1.2 AscendCL的优势1.3 AscendCL应用场景1.4 基本概念 2. AscendCL接口调用流程2.1 流程概述2.2 详细步骤2.3 头文件和库文件 3. 准备开发和运行环境3.1 部署环境3.2…

基于springboot+vue的乡政府管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…