当前位置: 首页 > article >正文

React Hooks: useRef,useCallback,useMemo用法详解

 

1. useRef(保存引用值)

useRef 通常用于保存“不会参与 UI 渲染,但生命周期要长”的对象引用,比如获取 DOM、保存定时器 ID、WebSocket等。

新建useRef.js组件,写入代码:

import React, { useRef, useState } from 'react'export default function UseRef() {const name = useRef<HTMLInputElement>(null)let [list, setList] = useState(['000', '111', '222'])let btnHandle = () => {if (name.current) {setList([...list, name.current.value])name.current.value = ''}}let delHandle = (index: number) => {let temList = [...list]temList.splice(index, 1)setList(temList)}return (<div><input ref={name} /><button onClick={btnHandle}>click</button><ul>{list.map((value, index) => {return (<li key={index}>{value}<button onClick={() => delHandle(index)}>删除</button></li>)})}</ul></div>)
}

上面的name会保存引用值,可以带入到点击事件,效果: 

不仅如此,useRef还能在函数组件中保持状态:

import React, { useState, useRef } from 'react'export default function UseRef() {const [count, setCount] = useState(0)let myCount = useRef(0)const addHandle = () => {setCount(count + 1)myCount.current++}return (<div><button onClick={addHandle}>click</button>{count} - {myCount.current}</div>)
}

上面的myCount当值变化时,能够实时保存。

2. useCallback(记忆函数)

防止因为组件重新渲染,导致方法被重新创建,起到缓存作用,只有第二个参数变化了,才重新声明一次。

新建 UseCallback.js方法组件,写入代码:

import React, { useCallback, useEffect } from 'react'export default function UseCallback() {const [userId, setUserId] = useState(1)const [user, setUser] = useState<any>(null)const [counter, setCounter] = useState(0)const fetchUser = useCallback(() => {console.log(`Fetching user with ID ${userId}...`)fetch(`https://jsonplaceholder.typicode.com/users/${userId}`).then(res => res.json()).then(data => setUser(data))}, [userId])useEffect(() => {fetchUser()}, [fetchUser])return (<div><h2>用户信息</h2>{user ? (<div><p>名字: {user.name}</p><p>邮箱: {user.email}</p></div>) : (<p>加载中...</p>)}<button onClick={() => setUserId(id => id + 1)}>切换用户</button><button onClick={() => setCounter(c => c + 1)}>其他按钮(不影响 fetch)</button><p>Counter: {counter}</p></div>)
}export default UseCallback

上面仅当 userId 变化时,fetchUser 函数才会变化,userId 不变就不重新生成函数。效果: 

如果不使用 useCallback,每次渲染时函数都会创建,这在传给子组件或放到 useEffect / onClick 等地方时,会带来性能浪费、重复渲染、无法复用的问题。

3. useMemo(记忆组件)

useMemo 是 值级缓存,用于缓存变量、数组、对象、计算结果,不同于 useCallback 是 函数级缓存。

import React, { useState, useMemo } from 'react'const UserList = () => {const [query, setQuery] = useState('')const [users] = useState(['Alice', 'Bob', 'Charlie', 'David', 'Eva', 'Frank', 'George'])const filteredUsers = useMemo(() => {console.log('Filtering...')return users.filter(user => user.toLowerCase().includes(query.toLowerCase()))}, [query, users])return (<div><inputplaceholder="搜索用户"value={query}onChange={(e) => setQuery(e.target.value)}/><ul>{filteredUsers.map((user, index) => (<li key={index}>{user}</li>))}</ul></div>)
}export default UserList

结果:

 上面只有当 query 或 users 变化时,才重新过滤;如果不使用 useMemo,每次组件渲染时,users.filter(...) 都会执行一次,即使输入没有变。

相关文章:

React Hooks: useRef,useCallback,useMemo用法详解

1. useRef&#xff08;保存引用值&#xff09; useRef 通常用于保存“不会参与 UI 渲染&#xff0c;但生命周期要长”的对象引用&#xff0c;比如获取 DOM、保存定时器 ID、WebSocket等。 新建useRef.js组件&#xff0c;写入代码&#xff1a; import React, { useRef, useSt…...

STM32F103复用JTAG/SWD引脚为GPIO

普中-精灵1开发板&#xff0c;主芯片为STM32F103C8T6&#xff0c;4个独立按键K1~K4依次接PA15~PA12&#xff0c;按下为低电平&#xff0c;8个LED灯D1~D8&#xff0c;依次接PA0~PA7。查询手册得知&#xff1a;PA15主功能为JTDI&#xff0c;PA14为JTCK/SWCLK&#xff0c;PA13为JT…...

[wifi SAE]wpa3-personal

SAE &#xff1a;Simultaneous Authentication of Equals&#xff08;同等同时认证&#xff09; wpa2和wpa3之间最大的区别是认证过程的区别 WPA2不安全性 1.sta和ap预置psk(AP密码) 2.四次握手生成ptk用于后续数据加密的密钥 ptk计算基于psk、双方随机数&#xff1b; 双方都产…...

电路方案分析(二十)TPS63xxx系列DC/DC电源EMI PCB设计方案

tips&#xff1a;资料来自网络&#xff0c;仅供学习使用。[TOC](TPS63xxx系列DC/DC电源EMI PCB设计方案) 1.概述 通过TPS63xxx系列DC/DC电源模块来分析降低直流/直流降压/升压转换器辐射 EMI 的来源以及相关PCB设计。 下面都以最常用的TPS63070为例说明&#xff1a; 典型应用…...

DeepSeek 在金融领域的应用解决方案

DeepSeek 在金融领域的应用解决方案 一、背景 随着人工智能技术的快速发展&#xff0c;DeepSeek 作为一款国产大模型&#xff0c;凭借其强大的语义理解、逻辑推理和多模态处理能力&#xff0c;在金融行业迅速崭露头角。金融行业作为经济的核心&#xff0c;面临着激烈的市场竞…...

Java 大厂面试题 -- JVM 深度剖析:解锁大厂 Offe 的核心密钥

最近佳作推荐&#xff1a; Java大厂面试高频考点&#xff5c;分布式系统JVM优化实战全解析&#xff08;附真题&#xff09;&#xff08;New&#xff09; Java大厂面试题 – JVM 优化进阶之路&#xff1a;从原理到实战的深度剖析&#xff08;2&#xff09;&#xff08;New&#…...

【AI提示词】API开发专家

提示说明 API开发专家专注于设计和实现高效、稳定、安全的应用程序接口&#xff08;API&#xff09;。他们通过深入理解业务需求和用户场景&#xff0c;为用户提供定制化的API解决方案。 提示词 # 角色 API开发专家## 注意 1. 专家设计应考虑API开发过程中的技术细节和用户需…...

目标追踪Hyperspectral Adapter for Object Tracking based on Hyperspectral Video

论文作者&#xff1a;Long Gao,Yunhe Zhang,Langkun Chen,Yan Jiang,Weiying Xie,Yunsong Li 作者单位&#xff1a;Xidian University;the University of Sheffield 论文链接&#xff1a;http://arxiv.org/abs/2503.22199v1 内容简介&#xff1a; 1&#xff09;方向&#x…...

深度剖析SSD多段L2P表查找加速技术

在固态硬盘(SSD)控制器中,逻辑块地址(LBA)需要通过映射表(L2P Table)映射到NAND闪存的物理地址(PA)。随着SSD容量的增长,L2P表的大小也随之增加,这给查找操作带来了性能挑战。 在SSD控制器中,LBA需借助L2P表映射为NAND物理地址。映射表最小规模为 (O(n * \lg (n)))…...

【MQTT-协议原理】

MQTT-协议原理 ■ MQTT-协议原理■ MQTT-服务器 称为"消息代理"&#xff08;Broker&#xff09;■ MQTT协议中的订阅、主题、会话■ 一、订阅&#xff08;Subscription&#xff09;■ 二、会话&#xff08;Session&#xff09;■ 三、主题名&#xff08;Topic Name&a…...

PCIe 5.0光学SSD原型问世!

近日&#xff0c;Kioxia Corporation&#xff08;铠侠&#xff09;、AIO Core Co., Ltd. 和 Kyocera Corporation&#xff08;京瓷&#xff09;联合宣布成功开发了一款支持 PCIe 5.0 接口的光学 SSD 原型。该技术旨在通过光接口替换传统的电接口&#xff0c;从而显著增加计算设…...

Raymarching Textures In Depth

本节课最主要的就是学会hlsl中使用纹理采样 float4 color Texture2DSample(Texobj, TexobjSampler, uv); return color; 课程中的代码&#xff08;没有这张图我就没做&#xff09; 课程代码产生深度的原因是uv偏移&#xff0c;黑色区域会不断向左偏移&#xff0c;直到找到白色…...

maven编译jar踩坑[sqlite.db]

背景&#xff1a; 最近在项目中搞多数据源切换的job,在src/resource下有初始化的sqlite默认文件供后续拷贝使用&#xff0c;在测试阶段没有什么问题&#xff0c;但是一部署到服务器上运行就有问题。 报错现象&#xff1a; 找不到这个sqlite.db文件或者文件格式有问题&#x…...

文献总结:ECCV2022-BEVFormer

BEVFormer 一、文章基本信息二、文章背景三、BEVFormer架构(1) BEV 查询(2) 空间交叉注意力机制(3) 时间自注意力机制(4) BEV应用(5) 实施细节 四、实验五、总结 一、文章基本信息 标题BEVFormer: Learning Bird’s-Eye-view Representation from Multi-camera images via spa…...

Openlayers:海量图形渲染之WebGL渲染

最近由于在工作中涉及到了海量图形渲染的问题&#xff0c;因此我开始研究相关的解决方案。我在网络上寻找相关的解决方案时发现许多的文章都提到利用Openlayers中的WebGLPointsLayer类&#xff0c;可以实现渲染海量的点&#xff0c;之后我又了解到利用WebGLVectorLayer类可以渲…...

RCE漏洞学习

1&#xff0c;What is RCE&#xff1f; 在CTF&#xff08;Capture The Flag&#xff09;竞赛中&#xff0c;RCE漏洞指的是远程代码执行漏洞&#xff08;Remote Code Execution&#xff09;。这类漏洞允许攻击者通过某种方式在目标系统上执行任意代码&#xff0c;从而完全控制目…...

如何将网页保存为pdf

要将网页保存为PDF&#xff0c;可以按照以下几种方法操作&#xff1a; 1. 使用浏览器的打印功能 大多数现代浏览器&#xff08;如Chrome、Firefox、Edge等&#xff09;都支持将网页保存为PDF文件。步骤如下&#xff1a; 在 Google Chrome 中&#xff1a; 打开你想保存为PDF…...

什么是继承?js中有哪儿些继承?

1、什么是继承&#xff1f; 继承是面向对象软件技术中的一个概念。 2、js中有哪儿些继承&#xff1f; js中的继承有ES6的类class的继承、原型链继承、构造函数继承、组合继承、寄生组合继承。 2.1 ES6中类的继承 class Parent {constructor() {this.age 18;} }class Chil…...

如何使用 Grafana 连接 Easyearch

Grafana 介绍 Grafana 是一款开源的跨平台数据可视化与监控分析工具&#xff0c;专为时序数据&#xff08;如服务器性能指标、应用程序日志、业务数据等&#xff09;设计。它通过直观的仪表盘&#xff08;Dashboards&#xff09;帮助用户实时监控系统状态、分析趋势&#xff0…...

mindsdb AI 开源的查询引擎 - 用于构建 AI 的平台,该平台可以学习和回答大规模联合数据的问题。

一、软件介绍 文末提供源码和程序下载学习 MindsDB 是一种解决方案&#xff0c;使人类、AI、代理和应用程序能够以自然语言和 SQL 查询数据&#xff0c;并在不同的数据源和类型中获得高度准确的答案。此开源程序是一个联合查询引擎&#xff0c;可以整理您的数据蔓延混乱&#…...

802.11a ofdm 过程了解

ofdm_demo.py import numpy as np from scipy import interpolate import commpy as cpy import ofdm_debug as ofdm_debug class OFDMSystem:def __init__(self, K64, CPNone, P8, pilotValue33j, Modulation_typeQAM16, channel_typerandom, SNRdb25,debugFalse):# 设置OFDM…...

BOTA六维力矩传感器如何打通机器人AI力控操作的三层架构?感知-决策-执行全链路揭秘

想象一下&#xff0c;你对着一个机器人说&#xff1a;“请帮我泡杯茶。”然后&#xff0c;它就真的开始行动了&#xff1a;找茶壶、烧水、取茶叶、泡茶……这一切看似简单&#xff0c;但背后却隐藏着复杂的AI技术。今天&#xff0c;我们就来揭秘BOTA六维力矩传感器在机器人操控…...

HDF5文件格式:数据类型与读写功能详解

HDF5文件格式&#xff1a;数据类型与读写功能详解 HDF5简介 HDF5&#xff08;Hierarchical Data Format version 5&#xff09;是一种用于存储和管理大量科学数据的文件格式和库。它由美国国家高级计算应用中心&#xff08;NCSA&#xff09;开发&#xff0c;具有以下特点&…...

macOS Chrome - 打开开发者工具,设置 Local storage

文章目录 macOS Chrome - 打开开发者工具设置 Local storage macOS Chrome - 打开开发者工具 方式2&#xff1a;右键点击网页&#xff0c;选择 检查 设置 Local storage 选择要设置的 url&#xff0c;显示右侧面板 双击面板&#xff0c;输入要添加的内容 2025-04-08&#xff…...

使用Vscode排除一些子文件搜索

打开用户/工作区设置 全局生效&#xff1a;打开命令面板&#xff08;CtrlShiftP 或 CmdShiftP&#xff09;&#xff0c;搜索并选择 Preferences: Open User Settings (JSON)。 仅当前项目生效&#xff1a;在项目根目录下创建 .vscode/settings.json 文件&#xff08;如果不存在…...

kubernetes 入门篇之架构介绍

经过前段时间的学习和实践&#xff0c;对k8s的架构有了一个大致的理解。 1. k8s 分层架构 架构层级核心组件控制平面层etcd、API Server、Scheduler、Controller Manager工作节点层Kubelet、Kube-proxy、CRI&#xff08;容器运行时接口&#xff09;、CNI&#xff08;网络插件&…...

如何绕过WAF实现SQL注入攻击?​

引言​​ 在渗透测试中&#xff0c;SQL注入&#xff08;SQLi&#xff09;始终是Web安全的核心漏洞之一。然而&#xff0c;随着企业广泛部署Web应用防火墙&#xff08;WAF&#xff09;&#xff0c;传统的注入攻击往往会被拦截。本文将分享一种​​绕过WAF检测的SQL注入技巧​​…...

如何使用通义灵码完成PHP单元测试 - AI辅助开发教程

一、引言 在软件开发过程中&#xff0c;测试是至关重要的一环。然而&#xff0c;在传统开发中&#xff0c;测试常常被忽略或草草处理&#xff0c;很多时候并非开发人员故意为之&#xff0c;而是缺乏相应的测试思路和方法&#xff0c;不知道如何设计测试用例。随着 AI 技术的飞…...

pig 权限管理开源项目学习

pig 源码 https://github.com/pig-mesh/pig 文档在其中&#xff0c;前端在文档中&#xff0c;官方视频教学也在文档中有。 第一次搭建&#xff0c;建议直接去看单体视频&#xff0c;照着做即可&#xff0c;需 mysql&#xff0c;redis 基础。 文章目录 项目结构Maven 多模块项…...

设计模式:依赖倒转原则 - 依赖抽象,解耦具体实现

一、为什么用依赖倒转原则&#xff1f; 在软件开发中&#xff0c;类与类之间的依赖关系是架构设计中的关键。如果依赖过于紧密&#xff0c;系统的扩展性和维护性将受到限制。为了应对这一挑战&#xff0c;依赖倒转原则&#xff08;Dependency Inversion Principle&#xff0c;…...