常用hook
Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。
理解:hook是react提供的函数API
官方提供的hook

基础hook
useState API
const [state, setState] = useState(initialState);
//返回state值 以及更新state的方法
在初始渲染期间,返回的状态 (state) 与传入的第一个参数 (initialState) 值相同。
setState 函数用于更新 state。它接收一个新的 state 值并将组件的一次重新渲染加入队列。案例:
//引入 hook
import { useState } from "react";
//16.8
//useState 给函数组件提供state状态值
//useState 返回数组 [state状态值,更新状态值的方法]
export default () => {//定义状态 useState参数为初始值let [num, setNum] = useState(0);console.log("渲染",num);//定义+-事件//匿名函数写法// let handler = () => {};function handler(type) {switch (type) {case "decrement"://--num--;break;case "increment"://++num++;break;}setNum(num);}return (<><button onClick={handler.bind(null, "decrement")}>-</button><div>数量:{num}</div><button onClick={handler.bind(null, "increment")}>+</button></>);
};
//state状态值num===初始状态值
//state状态值首次编译创建一次。更新state状态值不会重新定义//案例中存在num++ 后置++ --
//整个程序运行存在异常。函数组件中定义状态值
//定义状态 useState参数为初始值let [num, setNum] = useState(0);let [isShow, setShow] = useState(true);let [arr, setArray] = useState([0, 1, 2, 3, 4]);let [stu, setStu] = useState({name: "小花",age: 18,});let [city, setCity] = useState([{ name: "西安市" }, { name: "咸阳市" }]);注意使用useState定义数据state
//1.state状态值为普通变量 可以直接修改 可以让函数组件更新
//2.如果函数组件中定义的数据为对象或者数组//对象某个key修改stu.name = "小黑";setStu(stu)//数组某个索引值修改arr[0] = 11;setArray(arr);//以上两种写法不会导致函数组件更新//底层监听不到当前数据在变化,因为引用链没有断掉。建议断链:setStu({ ...stu, name: "小黑" });arr[0]=11;setArray([...arr]);react中对象检测机制:
React 使用 Object.is 比较算法 来比较 state。 所以需要断链操作。
与 class 组件中的 setState 方法不同,useState 不会自动合并更新对象
函数组件中产生覆盖。
你可以用函数式的 setState 结合展开运算符来达到合并更新对象的效果。
意思是如果需要类似setState 对象合并。 使用函数式来处理。
//函数式写法 useState// setStu({ ...stu, name: "小黑" });setStu((state) => {//业务逻辑代码return { ...stu, name: "xiaohei" };});useEffect
类似周期函数 常用hook 主要功能是用来处理副作用
useEffect(() => {console.log("挂载");});//以上的这种用法 等待jsx模板编译挂载到页面之后执行外部的函数(类似挂载完成)//当前函数组件数据更新 可以当作更新完成//下面这种写法 外部函数执行一致。 内部返回的函数为处理副作用函数。//首次编译 处理副作用函数不执行。()useEffect(() => {console.log("挂载");//返回的函数为处理副作用函数return function (){console.log("处理副作用");}});//当前函数组件数据更新 函数组件重新编译 useEffect继续执行---先执行上次的副作用处理//作用:为防止内存泄漏,清除函数会在组件卸载前执行useEffect(() => {console.log("挂载");//返回的函数为处理副作用函数return function () {console.log("处理副作用");};});例如:useEffect(() => {console.log("挂载");let time = setInterval(() => {console.log("输出");}, 1000);//返回的函数为处理副作用函数return function () {console.log("处理副作用");clearInterval(time);};});//如果在子组件中使用useEffect 处理副作用useEffect(() => {console.log("挂载完成或者更新完成");//处理副作用和卸载之前return () => {console.log("处理副作用");};});console.log("渲染");//考虑当前组件卸载 处理副作用函数可以当作卸载之前使用//useEffect 可以代替组件的挂载完成和更新完成和卸载之前 三个周期。useEffect 外部处理函数:与 componentDidMount、componentDidUpdate 不同的是,在浏览器完成布局与绘制之后,传给 useEffect 的函数会延迟调用。
演示useEffect的使用场景
类似挂载:
export default () => {//类似挂载完成周期 useEffect的函数是在挂载页面之后延迟执行useEffect(()=>{console.log("执行");});console.log("渲染");return (<><div>测试</div></>);
};
类似更新:
export default () => {let [num, setNum] = useState(0);useEffect(() => {console.log("执行");});let update = () => {num++;setNum(num);};console.log("渲染");return (<><div>测试-{num}</div><button onClick={update}>更新</button></>);
};
//修改当前组件state 组件更新 执行useEffect中函数--功能类似更新完成类似卸载之前:
官方解释是卸载之前处理副作用函数。处理当前组件副作用。
import { useEffect } from "react";export default () => {useEffect(() => {console.log("执行");return function () {console.log("处理副作用");};});console.log("渲染");return (<><div>菜单</div></>);
};
//子组件首次挂载产生一个副作用处理函数
//直接子组件卸载 执行上次产生的副作用函数(类似卸载之前)
effect 的条件执行
默认情况下,effect 会在每轮组件渲染完成后执行。这样的话,一旦 effect 的依赖发生变化,它就会被重新创建。
在函数组件中具体到某个状态发生变化useEffect才执行。
给useEffect添加条件(让useEffect存在依赖项,依赖项发生变化的时候useEffect才重新定义执行)
useEffect 参数二:[]
用法:useEffect(() => {console.log("执行");//定义计时器let timer = setInterval(() => {console.log("计时器");}, 500);return function () {console.log("处理副作用");clearInterval(timer);};}, [num]);//依赖[]useEffect(() => {console.log("执行");//定义计时器let timer = setInterval(() => {console.log("计时器");}, 500);return function () {console.log("处理副作用");clearInterval(timer);};}, []);//依赖值为空 默认首次挂载之后执行其余不执行//存在多个依赖项useEffect(() => {console.log("执行");//定义计时器let timer = setInterval(() => {console.log("计时器");}, 500);return function () {console.log("处理副作用");clearInterval(timer);};}, [num,name]);useEffect用法
调网络为例:
//引入获取验证码接口
import { useEffect } from "react";
import { getCaptcha } from "../network/user";
export default () => {useEffect(async () => {let res = await getCaptcha();console.log(res);}, []);return (<><div>登录界面</div></>);
};
//官方警告
//引入获取验证码接口
import { useEffect } from "react";
import { getCaptcha } from "../network/user";
export default () => {useEffect(() => {async function request() {let res = await getCaptcha();console.log(res);}request();}, []);return (<><div>登录界面</div></>);
};
相关文章:
常用hook
Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。理解:hook是react提供的函数API官方提供的hook基础hookuseState APIconst [state, setState] useState(initialState); //返回state值 以及更新state的方法 …...
TryHackMe-GoldenEye(boot2root)
GoldenEye 这个房间将是一个有指导的挑战,以破解詹姆斯邦德风格的盒子并获得根。 端口扫描 循例nmap Web枚举 进入80 查看terminal.js 拿去cyberchef解码 拿着这组凭据到/sev-home登录 高清星际大战 POP3枚举 使用刚刚的凭据尝试登录pop3 使用hydra尝试爆破 这…...
Elasticsearch基本安全加上安全的 HTTPS 流量
基本安全加上安全的 HTTPS 流量 在生产环境中,除非您在 HTTP 层启用 TLS,否则某些 Elasticsearch 功能(例如令牌和 API 密钥)将被禁用。这个额外的安全层确保进出集群的所有通信都是安全的。 当您在模式下运行该elasticsearch-ce…...
C语言-程序环境和预处理(2)
文章目录预处理详解1.预定义符号2.#define2.1#define定义的标识符2.2#define定义宏2.3#define替换规则注意事项:2.4#和###的作用##的作用2.5带副作用的宏参数2.6宏和函数的对比宏的优势:宏的劣势:宏和函数的一个对比命名约定3.undef4.条件编译…...
JVM 收集算法 垃圾收集器 元空间 引用
文章目录JVM 收集算法标记-清除算法标记-复制算法标记-整理算法JVM垃圾收集器Serial收集器ParNew收集器Parallel Scavenge /Parallel Old收集器CMS收集器Garbage First(G1)收集器元空间引用强引用软引用弱引用虚引用JVM 收集算法 前面我们了解了整个堆内存实际是以分代收集机制…...
clip精读
开头部分 1. 要点一 从文章题目来看-目的是:使用文本监督得到一个可以迁移的 视觉系统 2.要点二 之前是 fix-ed 的class 有诸多局限性,所以现在用大量不是精细标注的数据来学将更好,利用的语言多样性。——这个方法在 nlp其实广泛的存在&…...
vue 首次加载慢优化
目前使用的是vue2版本 1.路由懒加载(实现按需加载) component: resolve > require([/views/physicalDetail/index], resolve)2.gzip压缩插件(需要运维nginx配合) 第一步,下载compression-webpack-plugin cnpm i c…...
WuThreat身份安全云-TVD每日漏洞情报-2023-03-21
漏洞名称:CairoSVG 文件服务器端请求伪造 漏洞级别:严重 漏洞编号:CVE-2023-27586 相关涉及:CairoSVG 在 2.7.0 版本之前 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-06718 漏洞名称:WP Meta SEO WordPress 授权不当导致任意重定向 漏洞级…...
【Android -- 开发工具】Xshell 6 安装和使用教程
一、简介 Xshell 其实就是一个远程终端工具,它可以将你的个人电脑和你在远端的机器连接起来,通过向 Xshell 输入命令然后他通过网络将命令传送给远端Linux机器然后远端的Linux机器将其运行结果通过网络传回个人电脑。 二、Xshell 6 的安装 首先&#…...
国民技术RTC备份寄存器RTC_BKP
根据手册资料知道RTC_BKP的地址,代码如下 #include "main.h" #include "usart.h"void USART2_Configuration(void) {USART_InitType USART_InitStructure;GPIO_InitType GPIO_InitStructure;GPIO_InitStruct(&GPIO_InitStructure);RCC_Ena…...
resnet网络特征提取过程可视化
我们在训练图片时,是不是要看看具体提取时的每个特征图提取的样子,找了很多,终于功夫不负有心人,找到了,通过修改的代码: resnet代码: import torch import torch.nn as nn from torchvision…...
FPGA打砖块游戏设计(有上板照片)VHDL
这是一款经典打砖块游戏,我们的努力让它更精致更好玩,我们将它取名为打砖块游戏(Flyball),以下是该系统的一些基本功能: 画面简约而经典,色彩绚丽而活泼,动画流畅 玩家顺序挑战3个不同难度的级别,趣味十足 计分功能,卡通字母数字 4条生命值,由生命条显示…...
【Unity入门】3D物体
【Unity入门】3D物体 大家好,我是Lampard~~ 欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (一)物体移动旋转缩放 (1)物体移动 在上一篇文章【Unity入门】场景视图操作我们学会了在场景中创建3…...
网络现代化势在必行,VMware 发布软件定义网络 SD-WAN 全新方案
出品 | CSDN云计算 作为计算存储网络基础设施三大件之一,网络一直是 IT 核心技术,并不断向前发展。 数字化转型浪潮下,各行业都在探索创新应用,而数字化创新,也是对 5G 和云边端等网络基础设施提出更高需求,…...
java学习笔记——抽象类
2.1 概述 由来 父类中的方法,被他的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有主体的方法称为抽象方法。java语法规定,包含抽象…...
Redis删除策略
删除策略就是针对已过期数据的处理策略。 针对过期数据要进行删除的时候都有哪些删除策略呢? 1.定时删除2.惰性删除3.定期删除1、立即删除 当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作。 优点:节…...
【新星计划2023】SQL SERVER (01) -- 基础知识
【新星计划2023】SQL SERVER -- 基础知识1. Introduction1.1 Official Website1.2 Conn Tool2. 基础命令2.1 建库建表2.2 Alter2.3 Drop2.3 Big Data -- Postgres3.Awakening1. Introduction 1.1 Official Website 官方文档(小技巧) Officail Website: …...
nginx配置详解
一.nginx常用命令1.Windows(1).查看nginx的版本号nginx -v(2).启动nginxstart nginx(3).快速停止或关闭nginxnginx -s stop(4).正常停止或关闭nginxnginx -s quit(5).配置文件nginx.conf修改重装载命令nginx -s reload2.Linux(1).进入 nginx 目录中cd /usr/local/nginx/sbin(2)…...
关于Java中堆和栈的学习
文章目录1.概述1.1 堆1.2 栈2.堆内存2.1 什么是堆内存?2.2堆内存的特点是什么?2.3new对象在堆中如何分配?3.栈内存3.1什么是栈内存?3.2栈内存的特点3.3栈内存的内存分配机制3.4数据共享4.栈与堆的区别4.1差异4.2相同5. 面试题: java堆和栈的区别**申请方式****申请后系统的…...
ORBSLAM3 --- 闭环及地图融合线程
目录 1.闭环及地图合并线程的目的和意义 2.闭环及地图合并流程 3.ORBSLAM3中的闭环与地图融合线程解...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
