React中常用的钩子函数:
一. 基础钩子
(1)useState
用于在函数组件中添加局部状态。useState可以传递一个参数,做为状态的初始值
,返回一个数组,数组的第一个元素是返回的状态变量,第二个是修改状态变量的函数
。
const [state, setState] = useState(initalState); // 初始化,state可以任意命名setState(newState); // 修改state的值
(2)useEffect
处理副作用(如数据获取、订阅、手动 DOM 操作等)。若一个函数组件中定义了多个useEffect,那么他们实际执行顺序是按照在代码中定义的先后顺序来执行的。 useEffect可以传入2个参数:
-
第1个参数是定义的执行函数,组件挂载和更新就会执行。
-
第2个参数是依赖关系(可选参数),如果不传则每次渲染都会去执行,传值的话在依赖项发生改变时函数中的代码才会执行,如果传空数组则会在组件第一次挂载才会执行。
-
return 出去的代码会在组件卸载时才会执行。
useEffect(() => {// 此处编写 组件挂载之后和组件重新渲染之后执行的代码...return () => {// 此处编写 组件即将被卸载前执行的代码...}
}, [dep1, dep2 ...]); // 依赖数组
(3)useContext
读取 React 的上下文(Context)值。useContext 可以避免多层 props 传递就能共享状态。具体用法看下面步骤:
先封装一个js,里面可以设置初始值,这个初始值,可以在任何地方使用:
import React from 'react';
const UserContext = React.createContext( { name: '张三' }); //参数是默认值,可填可不填
export default UserContext;
在代码中引用封装好的js文件
import React, { useContext } from 'react'
import UserContext from './context';function Demo() {
// 如果React.createContext没有指定默认值,可以在对应子组件上套上UserContext.Provider来指定值return (<UserContext.Provider value={{ name: '张三' }}><Child /></UserContext.Provider>)
}function Child() {const user = useContext(UserContext);return (<div><p>{`name: ${user.name}`}</p></div>)
}export default Demo;
二. 性能优化钩子
(1)useMemo
缓存计算结果,避免重复计算(类似 Vue 的 computed
)。useMemo 可以传入2个参数,第1个参数为函数,用来进行一些计算,第2个参数是依赖关系(可选参数),返回值为第一个函数 return 出去的值,只有在依赖项发生变化时才会重新执行计算函数进行计算,如果不传依赖项,每次组件渲染都会重新进行计算。
-
useMemo
在组件顶层调用 -
useMemo
不能在事件处理函数、循环或条件语句中调用
const memoizedValue = useMemo(() => {// 计算逻辑...return res;
}, [a, b]);
(2)useCallback
缓存函数,避免子组件不必要的重渲染。
function Parent() {// 不使用 useCallback - 每次渲染都会导致 Child 重新渲染const handleClick = () => { /*...*/ };// 使用 useCallback - 避免 Child 不必要的重新渲染const handleClick = useCallback(() => {/*...*/}, []); // 空依赖表示函数永不变化return <Child onClick={handleClick} />;
}
(3)useTransition
(React 18+)
标记非紧急更新,优化渲染优先级(如搜索框输入时的延迟渲染)。
const [isPending, startTransition] = useTransition();
(4)useDeferredValue
(React 18+)
延迟更新某些值,避免界面卡顿(如大型列表渲染)。
const deferredValue = useDeferredValue(value);
3. 引用与 DOM 操作
(1)useRef
可以获取 dom 和 react 组件实例
。
import { useRef } from 'react'function Demo() {const inputRef = useRef();const handleFocus = () => {inputRef.current.value = 'focus';inputRef.current.focus();}return (<div><input ref={inputRef} /></div>)
}export default Demo;
(2)useImperativeHandle
自定义暴露给父组件的 ref 实例(通常配合 forwardRef
使用)。父组件通过ref.current.getValue()获取子组件中的value值。
const RichTextEditor = forwardRef((props, ref) => {const [value, setValue] = useState('');useImperativeHandle(ref, () => ({getValue: () => value,}));return (...);
})export default RichTextEditor;
4. 其他钩子
(1)useReducer
复杂状态逻辑管理(类似 Redux 的 reducer)。
// 代码示例
import React, { useReducer } from 'react'// 1.需要有一个 reducer 函数,第一个参数为之前的状态,第二个参数为行为信息
function reducer(state, action) {switch (action) {case 'add':return state + 1;case 'minus':return state - 1;default:return 0;}
}function Demo() {// 2.引入useReducer,第一个参数时上面定义的reducer,第二个参数时初始值// 3.返回为一个数组,第一项为状态值,第二项为一个 dispatch 函数,用来修改状态值const [count, dispatch] = useReducer(reducer, 0);return (<div><button onClick={() => { dispatch('add') }} >add</button><button onClick={() => { dispatch('minus') }} >minus</button><button onClick={() => { dispatch('unknown') }} >unknown</button><p>{`count: ${count}`}</p></div>);
}export default Demo;
(2)useLayoutEffect
类似 useEffect
,但会在 DOM 更新后同步执行(适合测量 DOM 布局)。useLayoutEffect 使用方法、所传参数和 useEffect 完全相同。大多数情况下将 useEffect 替换成 useLayoutEffect 完全看不出区别。
唯一区别就是:使用 useEffect 时,页面挂载会出现闪烁。而使用 useLayoutEffect 时页面没有闪烁,是因为 useEffect 是在页面渲染完成后再去更新数据的,所以会出现短暂的闪烁,而 useLayoutEffect 是在页面还没有渲染时就将数据给更新了,所以没有出现闪烁。
注意:大部分情况用useEffect就足够了,useLayoutEffect 会阻塞渲染,所以需要小心的使用。
(3)useDebugValue
在 React 开发者工具中为自定义钩子添加标签。
useDebugValue(value, formatFn);
(4)useId
(React 18+)
生成唯一 ID,用于无障碍访问(a11y)或表单关联。
const id = useId();
三.使用场景总结
钩子 | 用途 |
---|---|
useState | 管理组件内部状态 |
useEffect | 处理副作用(API 调用、订阅等) |
useContext | 跨组件共享状态 |
useMemo /useCallback | 优化性能,避免重复计算/渲染 |
useRef | 操作 DOM 或保存可变值 |
useReducer | 复杂状态逻辑 |
相关文章:
React中常用的钩子函数:
一. 基础钩子 (1)useState 用于在函数组件中添加局部状态。useState可以传递一个参数,做为状态的初始值,返回一个数组,数组的第一个元素是返回的状态变量,第二个是修改状态变量的函数。 const [state, setState] useState(ini…...

springboot IOC
springboot IOC IoC Inversion of Control Inversion 反转 依赖注入 DI (dependency injection ) dependency 依赖 injection 注入 Qualifier 预选赛 一文带你快速理解JavaWeb中分层解耦的思想及其实现,理解 IOC和 DI https://zhuanlan.…...
java面试每日一背 day2
1.什么是缓存击穿?怎么解决? 缓存击穿是指在高并发场景下,某个热点key突然过期失效,此时大量请求同时访问这个已经过期的key,导致所有请求都直接打到数据库上,造成数据库瞬时压力过大甚至崩溃的情况。 解…...

Ajax01-基础
一、AJAX 1.AJAX概念 使浏览器的XMLHttpRequest对象与服务器通信 浏览器网页中,使用 AJAX技术(XHR对象)发起获取省份列表数据的请求,服务器代码响应准备好的省份列表数据给前端,前端拿到数据数组以后,展…...
(37)服务器增加ipv6配置方法
(1)172.25.38.93服务器,IPv6地址如下: IPv6地址:2405:6F00:E033:B800:0000:0000:0003:0A5D IPv6掩码:/120 IPv6网关地址:2405:6F00:E033:B800:0000:0000:0003:0AFF 配置: # 静态 IPv6 地址和前缀(根据实际情况填写) IPV6ADDR=2405:6F00:E033:B800:0000:0000:0003:0…...

生成树协议(STP)配置详解:避免网络环路的最佳实践
生成树协议(STP)配置详解:避免网络环路的最佳实践 生成树协议(STP)配置详解:避免网络环路的最佳实践一、STP基本原理二、STP 配置示例(华为交换机)1. 启用生成树协议2. 配置根桥3. 查…...

面向 C 语言项目的系统化重构实战指南
摘要: 在实际开发中,C 语言项目往往随着功能演进逐渐变得混乱:目录不清、宏滥用、冗余代码、耦合高、测试少……面对这样的“技术债积累”,盲目大刀阔斧只会带来更多混乱。本文结合 C 语言的特点,从项目评估、目录规划、宏与内联、接口封装、冗余剔除、测试与 CI、迭代重构…...
网络层——蚂蚁和信鸽的关系VS路由原理和相关配置
前言(🐜✉️🕊️) 今天内容的主角是蚂蚁(动态路由)和信鸽(静态路由),为什么这么说呢,来看一则小故事吧。 森林里,森林邮局要送一份重要信件&am…...

Python Pandas库简介及常见用法
Python Pandas库简介及常见用法 一、 Pandas简介1. 简介2. 主要特点(一)强大的数据结构(二)灵活的数据操作(三)时间序列分析支持(四)与其他库的兼容性 3.应用场景(一&…...

第十六届蓝桥杯复盘
文章目录 1.数位倍数2.IPv63.变换数组4.最大数字5.小说6.01串7.甘蔗8.原料采购 省赛过去一段时间了,现在复盘下,省赛报完名后一直没准备所以没打算参赛,直到比赛前两天才决定参加,赛前两天匆匆忙忙下载安装了比赛要用的编译器ecli…...

【已解决】HBuilder X编辑器在外接显示器或者4K显示器怎么界面变的好小问题
触发方式:主要涉及DPI缩放问题,可能在电脑息屏有概率触发 修复方式: 1.先关掉软件直接更改屏幕缩放,然后打开软件,再关掉软件恢复原来的缩放,再打开软件就好了 2.(不推荐)右键HBuilder在属性里…...

直线型绝对值位移传感器:精准测量的科技利刃
在科技飞速发展的今天,精确测量成为了众多领域不可或缺的关键环节。无论是工业自动化生产线上的精细操作,还是航空航天领域中对零部件位移的严苛把控,亦或是科研实验中对微小位移变化的精准捕捉,都离不开一款高性能的测量设备——…...
解决服务器重装之后vscode Remote-SSH无法连接的问题
在你的windows命令窗口输入: ssh-keygen -R 服务器IPssh-keygen 不是内部或外部命令 .找到Git(安装目录)/usr/bin目录下的ssh-keygen.exe(如果找不到,可以在计算机全局搜索) 2.属性–>高级系统设置–>环境变量–>系统变量,找到Path变量&#…...
AI 招聘系统科普:如何辨别真智能与伪自动化
一、传统招聘模式的效率困境 在数字化转型浪潮中,传统招聘模式的效率瓶颈日益凸显。以中大型企业为例,HR 约 60% 的工作时间消耗在重复操作上: 职位发布:需在多个渠道手动登录、填写字段,单次耗时超 20 分钟…...

Ansible模块——管理100台Linux的最佳实践
使用 Ansible 管理 100 台 Linux 服务器时,推荐遵循以下 最佳实践,以提升可维护性、可扩展性和安全性。以下内容结合实战经验进行总结,适用于中大型环境(如 100 台服务器): 一、基础架构设计 1. 分组与分层…...

从0开始学习大模型--Day09--langchain初步使用实战
众所周知,一味地学习知识,所学的东西和概念都是空中楼阁,大部分情况下,实战都是很有必要的,今天就通过微调langchain来更深刻地理解它。 中间如何进入到langchain界面请参考结尾视频链接。 首先,进入界面…...

C++中的菱形继承问题
假设有一个问题,类似于鸭子这样的动物有很多种,如企鹅和鱿鱼,它们也可能会有一些共同的特性。例如,我们可以有一个叫做 AquaticBird (涉禽,水鸟的一类)的类,它又继承自 Animal 和 Sw…...
订单越来越到导致接口列表查询数据缓慢解决思路
文章目录 **一、前期诊断:定位性能瓶颈****1. 数据现状分析****2. 业务场景梳理** **二、基础优化:快速提升性能****1. 索引精准优化****2. 表结构优化(垂直分表)****3. 读写分离与缓存策略** **三、架构升级:应对千万…...
word格式相关问题
页眉 1 去除页眉横线: 双击打开页眉,然后点击正文样式,横线就没有了。 2 让两部分内容的页眉不一样: 使用“分节符”区分两部分内容,分节符可以在“布局-分隔符”找到。然后双击打开页眉,取消“链接到前一…...

网络-MOXA设备基本操作
修改本机IP和网络设备同网段,输入设备IP地址进入登录界面,交换机没有密码,路由器密码为moxa 修改设备IP地址 交换机 路由器 环网 启用Turbo Ring协议:在设备的网络管理界面中,找到环网配置选项,启用Turb…...

飞桨paddle import fluid报错【已解决】
跟着飞桨的安装指南安装了paddle之后 pip install paddlepaddle有一个验证: import paddle.fluid as fluid fluid.install check.run check()报错情况如下,但是我在pip list中,确实看到了paddle安装上了 我import paddle别的包,…...

测试工程师要如何开展单元测试
单元测试是软件开发过程中至关重要的环节,它通过验证代码的最小可测试单元(如函数、方法或类)是否按预期工作,帮助开发团队在早期发现和修复缺陷,提升代码质量和可维护性。以下是测试工程师开展单元测试的详细步骤和方法: 一、理…...

IPv4 地址嵌入 IPv6 的前缀转换方式详解
1. 概述 在 IPv4 和 IPv6 网络共存的过渡期,NAT64(Network Address Translation 64)是一种关键技术,用于实现 IPv6-only 网络与 IPv4-only 网络的互操作。NAT64 前缀转换通过将 IPv4 地址嵌入到 IPv6 地址中,允许 IPv…...

野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(三)用yolov5-face算法实现人脸检测
环境直接使用第一篇中安装好的环境即可 先clone yolov5-face项目 git clone https://github.com/deepcam-cn/yolov5-face.git 并下载预训练权重文件yolov5n-face.pt 网盘链接: https://pan.baidu.com/s/1xsYns6cyB84aPDgXB7sNDQ 提取码: lw9j (野火官方提供&am…...
IS-IS 中间系统到中间系统
前言: 中间系统到中间系统IS-IS(Intermediate System to Intermediate System)属于内部网关协议IGP(Interior Gateway Protocol),用于自治系统内部 IS-IS也是一种链路状态协议,使用最短路径优先…...

【图像生成大模型】HunyuanVideo:大规模视频生成模型的系统性框架
HunyuanVideo:大规模视频生成模型的系统性框架 引言HunyuanVideo 项目概述核心技术1. 统一的图像和视频生成架构2. 多模态大语言模型(MLLM)文本编码器3. 3D VAE4. 提示重写(Prompt Rewrite) 项目运行方式与执行步骤1. …...
GitHub 趋势日报 (2025年05月19日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1public-apis/public-apis免费API的集体清单⭐ 1821⭐ 344364Python2virattt/a…...

如何使用Java生成pdf报告
文章目录 一、环境准备与Maven依赖说明二、核心代码解析1. 基础文档创建2. 中文字体处理3. 复杂表格创建4. 图片插入 三、完整代码示例四、最终效果 这篇主要说一下如何使用Java生成pdf,包括标题,文字,图片,表格的插入和调整等相关…...
HarmonyOS鸿蒙应用规格开发指南
在鸿蒙生态系统中,应用规格是确保应用符合系统要求的基础。本文将深入探讨鸿蒙应用的规格开发实践,帮助开发者打造符合规范的应用。 应用包结构规范 1. 基本配置要求 包结构规范 符合规范的应用包结构正确的HAP配置文件完整的应用信息 示例配置&…...
【Harmony】【鸿蒙】List列表View如何刷新内部的自定义View的某一个控件
创建自定义View Component export struct TestView{State leftIcon?:Resource $r(app.media.leftIcon)State leftText?:Resource | string $r(app.string.leftText)State rightText?:Resource | string $r(app.string.rightText)State rightIcon?:Resource $r(app.med…...