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复杂状态逻辑

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

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

相关文章

如何在 Windows 11 或 10 上通过 PowerShell 安装 Docker Desktop

了解如何使用 PowerShell 或命令提示符在 Windows 11 或 10 上安装 Docker CLI 和 Docker Desktop GUI,以创建容器运行虚拟机。无需手动访问网站下载安装程序,所有操作都将在命令终端完成。 Docker 是一个强大的容器化平台,允许开发人员将应用程序及其依赖项打包为轻量级容…

Python实例题:人机对战初体验Python基于Pygame实现四子棋游戏

目录 Python实例题 题目 代码实现 实现原理 游戏逻辑&#xff1a; AI 算法&#xff1a; 界面渲染&#xff1a; 关键代码解析 游戏棋盘渲染 AI 决策算法 胜利条件检查 使用说明 安装依赖&#xff1a; 运行游戏&#xff1a; 游戏操作&#xff1a; 扩展建议 增强…

一文详解 HLS

1 HLS的简介 1.1 HLS的背景 从 RTMP&#xff08;Real-Time Messaging Protocol&#xff0c;实时消息传输协议&#xff09; 到 HLS&#xff08;HTTP Live Streaming&#xff0c;HTTP直播流&#xff09; 的技术演进&#xff0c;本质上是直播协议从 专有协议 向 通用 Web 协议 的…

go 访问 sftp 服务 github.com/pkg/sftp 的使用踩坑,连接未关闭(含 sftp 服务测试环境搭建)

前言 最近在使用 sftp 服务时&#xff0c;被告知发起了海量的连接&#xff0c;直接把服务器搞崩&#xff0c;ip 被封了。 这是啥情况&#xff1f; golang 写的代码&#xff0c;我就正常的访问 sftp 服务&#xff0c;连接使用过后也都关闭了&#xff0c;咋会出现连接一直连着…

Android 直接通过 app_process 启动的应用如何使用 Context

文章目录 一、问题背景二、代码实现三、代码详解 一、问题背景 在 Android 中&#xff0c;可以使用 Android Studio 编写 Java 应用程序&#xff0c;通过编译打包成 apk 文件&#xff0c;然后将文件推送至 /data/local/tmp 等可执行的目录或安装打包出来的应用&#xff0c;随后…

【数据结构与算法】LeetCode 每日三题

如果你已经对数据结构与算法略知一二&#xff0c;现在正在复习数据结构与算法的一些重点知识 ------------------------------------------------------------------------------------------------------------------------- 点赞收藏&#x1f308;&#xff0c;每天更新总结文…

深度“求索”:DeepSeek+Dify构建个人知识库

目录 前言 环境部署 安装Docker 安装Dify 配置Dify 部署知识库 创建应用 前言 在当今数字化信息爆炸的时代&#xff0c;数据隐私和个性化知识管理成为企业和个人关注的焦点。Dify&#xff0c;作为一款备受瞩目的开源 AI 应用开发平台&#xff0c;为用户提供了完整的私有…

【Redis8】最新安装版与手动运行版

目录 一、直接运行 1. 下载 Redis百度网盘 2. 解压后直接运行 redis-server.exe​编辑 二、安装版运行 双击 install_redis_service.bat 输入安装路径&#xff08;请提前创建好安装路径&#xff09;后直接回车​编辑 下一步直接回车即可&#xff0c;因为是使用配置模板…

@Column 注解属性详解

提示&#xff1a;文章旨在说明 Column 注解属性如何在日常开发中使用&#xff0c;数据库类型为 MySql&#xff0c;其他类型数据库可能存在偏差&#xff0c;需要注意。 文章目录 一、name 方法二、unique 方法三、nullable 方法四、insertable 方法五、updatable 方法六、column…

使用Gemini, LangChain, Gradio打造一个书籍推荐系统 (第二部分)

建立向量嵌入数据库 from langchain_community.document_loaders import TextLoader from langchain_text_splitters import CharacterTextSplitter from langchain.docstore.document import Document from langchain_chroma.vectorstores import Chromaimport vertexai from…

【Go-4】函数

函数 函数是编程中的基本构建块&#xff0c;用于封装可重用的代码逻辑。Go语言中的函数功能强大&#xff0c;支持多种特性&#xff0c;如多返回值、可变参数、匿名函数、闭包以及将函数作为值和类型传递。理解和掌握函数的使用对于编写高效、可维护的Go程序至关重要。本章将详…

【已解决】HBuilder X编辑器在外接显示器或者4K显示器怎么界面变的好小问题

触发方式&#xff1a;主要涉及DPI缩放问题&#xff0c;可能在电脑息屏有概率触发 修复方式&#xff1a; 1.先关掉软件直接更改屏幕缩放&#xff0c;然后打开软件&#xff0c;再关掉软件恢复原来的缩放&#xff0c;再打开软件就好了 2.(不推荐&#xff09;右键HBuilder在属性里…

spark调度系统核心组件SparkContext、DAGSchedul、TaskScheduler、Taskset介绍

目录 1. SparkContext2.DAGScheduler3. TaskScheduler4. 协作关系5 TaskSet的定义6. 组件关系说明Spark调度系统的核心组件主要有SparkContext、DAGScheduler和TaskScheduler SparkContext介绍 1. SparkContext 1、资源申请: SparkContext是Spark应用程序与集群管理器(如St…

VSCode+EIDE通过KeilC51编译,使VSCode+EIDE“支持”C和ASM混编

在使用Keil C51时&#xff0c;要让Keil C51支持混编则需要在混编的.c文件上右键选择Options for File *(ALTF7)&#xff0c;打开选项界面后&#xff0c;在 Properties 页 勾上 Generate Assembler SRC File 和 Assemble SRC File &#xff0c;如下图所示&#xff1a; 这样设置后…

SQLynx:一款跨平台的企业级数据库管理工具

SQLynx 是一款支持跨平台&#xff08;Windows、Linux、macOS、Web&#xff09;的企业级数据库管理和 SQL 工具&#xff0c;可以提供高效、安全且适配国产化技术栈的数据库管理解决方案。 数据源 SQLynx 支持连接各种关系型数据库、非关系型数据库以及大数据平台&#xff0c;包…

实战项目8(实训)

目录 项目01 【sw1】配置 【sw2】配置 任务结果截图 项目02 【sw1】配置 【sw2】配置 任务结果截图 项目03 【sw1】配置 任务结果截图 项目04 【sw1】配置 【r1】配置 任务结果截图 项目05 【r1】配置 【r2】配置 【r3】配置 任务结果截图 项目06 【r1】…

TCP为什么是三次握手,而不是二次?

为什么需要三次握手&#xff1f; 想象一下&#xff0c;你要给远方的朋友寄一份重要文件。你会怎么做&#xff1f; 普通人的做法&#xff1a; 直接扔进邮箱&#xff0c;祈祷别丢了 聪明人的做法&#xff1a; 先打电话确认地址&#xff0c;再发快递&#xff0c;最后确认收到 T…

dubbo使用nacos作为注册中心配置

<dubbo:registry protocol"nacos" address"${dubbo.registry.address.nacos}" /> <dubbo:metadata-report address"${dubbo.metadata-report.address}"/> 如果有多个地址&#xff0c;这块如何配置呢&#xff1f; nacos://ip:端口?…

教师角色的转变:从知识传授者到学习引导者

教师角色的转变&#xff1a;从知识传授者到学习引导者 随着人工智能&#xff08;AI&#xff09;和信息技术的迅速发展&#xff0c;教育正在经历深刻的变革。其中&#xff0c;教师角色的转变尤为关键。传统上&#xff0c;教师主要承担“知识传授者”的职责&#xff0c;即向学生…

PostgreSQL 用户权限与安全管理

1 系统默认角色 postgres# select rolname from pg_roles; rolname ----------------------------- postgres pg_database_owner pg_read_all_data pg_write_all_data pg_monitor pg_read_all_settings pg_read_all_stats pg_stat_scan_tables …