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

react 中 useRef Hook 作用

`useRef`是一个非常实用的钩子函数

一、访问和操作 DOM 元素

1. 获取 DOM 元素引用

1.1 基本原理

通过 `useRef` 我们可以直接操作 DOM 元素

1.2 代码示例

import React, { useRef, useEffect } from "react";const InputFocusComponent = () => {const inputRef = useRef(null);useEffect(() => {// 组件挂载后,使输入框获得焦点if (inputRef.current) {inputRef.current.focus();}}, []);return (<div><input type="text" ref={inputRef} /></div>);};export default InputFocusComponent;

2. 跨渲染周期保持引用

2.1 渲染周期中的稳定性

例如:在一个定时器的场景中,需要在组件挂载时启动定时器,并在组件卸载时清除定时器,`useRef`可以帮助我们保持对定时器 ID 的引用。

2.2 代码示例

import React, { useRef, useEffect, useState } from "react";const TimerComponent = () => {const timerRef = useRef(null);const [count, setCount] = useState(0);useEffect(() => {// 组件挂载时启动定时器timerRef.current = setInterval(() => {setCount((prevCount) => prevCount + 1);}, 1000);return () => {// 组件卸载时清除定时器if (timerRef.current) {clearInterval(timerRef.current);}};}, []);return (<div><p>Seconds passed: {count}</p></div>);};export default TimerComponent;

二、保存可变值

1. 避免重新渲染触发的问题

1.2 与 state 的区别

例如:在一个数据获取的场景中,获取数据时不需要触发组件渲染。

1.3 代码示例

import React, { useRef, useState, useEffect } from "react";const DataFetchingComponent = () => {const isFetchingRef = useRef(false);const [data, setData] = useState(null);useEffect(() => {if (!isFetchingRef.current) {isFetchingRef.current = true;fetch("https://example.com/api/data").then((response) => response.json()).then((jsonData) => {setData(jsonData);isFetchingRef.current = false;});}}, []);return (<div>{data ? (<pre>{JSON.stringify(data)}</pre>) : (<p>{isFetchingRef.current ? "Fetching data..." : "No data available"}</p>)}</div>);};export default DataFetchingComponent;

相关文章:

react 中 useRef Hook 作用

useRef是一个非常实用的钩子函数 一、访问和操作 DOM 元素 1. 获取 DOM 元素引用 1.1 基本原理 通过 useRef 我们可以直接操作 DOM 元素 1.2 代码示例 import React, { useRef, useEffect } from "react";const InputFocusComponent () > {const inputRef …...

Scala-键盘输入(StdIn)-用法详解

Scala 在 Scala 中&#xff0c;进行 键盘输入 主要通过 scala.io.StdIn 包来实现。 StdIn 提供了几个方法&#xff0c;用于从用户的键盘输入中读取不同类型的数据&#xff0c;如字符串、整数、浮点数等。 常用的输入方法有 readLine()、readInt()、readDouble()、readShort(…...

力扣(LeetCode)283. 移动零(Java)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f439;今日诗词:雾失楼台&#xff0c;月迷津渡&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&#x1f64f; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主…...

ESP32C3单片机使用笔记---烧录MicroPython

使用MicroPython在ESP32C3单片机上编程&#xff0c;首先需要将MicroPython运行环境烧录到ESP32C3的Flash中去&#xff0c;步骤如下&#xff1a; 1.下载esptool烧录工具&#xff0c;下载地址&#xff1a; https://github.com/espressif/esptool 直接使用git clone git clone…...

Matter1.4重磅来袭,智能家居进入“互联”新纪元

近日&#xff0c;连接标准联盟&#xff08;CSA&#xff09;正式宣布推出最新的Matter1.4标准版本&#xff0c;并更新了一系列“史诗级”的增强功能&#xff0c;旨在提升现有智能家居之间的互操作性与兼容性&#xff0c;为智能家居用户带来更流畅的使用体验。 华普微&#xff0c…...

tdengine学习笔记

官方文档&#xff1a;用 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据 整体架构 TDENGINE是分布式&#xff0c;高可靠&#xff0c;支持水平扩展的架构设计 TDengine分布式架构的逻辑结构图如下 一个完整的 TDengine 系统是运行在一到多个物理节点上的&#xff0c;包含…...

机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望

文章目录 1 机器学习最初的样子1.1 知识工程诞生(专家系统)1.2 知识工程高潮期1.3 专家系统的瓶颈(知识获取)1.4 机器学习研究的初衷2 科学研究对机器学习的期望2.1 面向科学研究的机器学习轮廓2.2 机器学习及其应用研讨会2.3 智能信息处理系列研讨会2.4 机器学习对科学研究的重…...

Linux 进程信号的产生

目录 0.前言 1. 通过终端按键产生信号 1.1 CtrlC&#xff1a;发送 SIGINT 信号 1.2 Ctrl\&#xff1a;发送 SIGQUIT 信号 1.3 CtrlZ&#xff1a;发送 SIGTSTP 信号 2.调用系统命令向进程发信号 3.使用函数产生信号 3.1 kill 函数 3.2 raise 函数 3.3 abort 函数 4.由软件条件产…...

CentOS8 在MySQL8.0 实现半同步复制

#原理 MySQL默认是异步的,不要求必须全部同步到从节点才返回成功结果; 同步复制: 用户发请求到代理, 代理收到请求后写/更新数据库写入到二进制日志bin_log, 然后必须等数据发到所有的从节点, 从节点全部收到数据后, 主节点才返回给客户端的成功结果。 弊端&#xff1a; 客…...

数据分析——Python绘制实时的动态折线图

最近在做视觉应用开发&#xff0c;有个需求需要实时获取当前识别到的位姿点位是否有突变&#xff0c;从而确认是否是视觉算法的问题&#xff0c;发现Python的Matplotlib进行绘制比较方便。 目录 1.数据绘制2.绘制实时的动态折线图3.保存实时数据到CSV文件中 import matplotlib.…...

【Redis】Redis的一些应用场景及使用策略

应用的场景 Redis 是一个高性能的内存数据库&#xff0c;广泛用于各种应用场景&#xff0c;以下是一些常见的应用场景&#xff1a; 缓存&#xff1a;Redis 的高读写性能使其非常适合作为缓存层&#xff0c;存储频繁访问的数据以减少数据库负载和加快响应时间。例如&#xff0c…...

CentOS 8 安装 chronyd 服务

操作场景 目前原生 CentOS 8 不支持安装 ntp 服务&#xff0c;因此会发生时间不准的问题&#xff0c;需使用 chronyd 来调整时间服务。CentOS 8以及 TencentOS 3.1及以上版本的实例都使用 chronyd 服务实现时钟同步。本文介绍了如何在 CentOS 8 操作系统的腾讯云服务器上安装并…...

HarmonyOS ArkUI(基于ArkTS) 常用组件

一 Button 按钮 Button是按钮组件&#xff0c;通常用于响应用户的点击操作,可以加子组件 Button(我是button)Button(){Text(我是button)}type 按钮类型 Button有三种可选类型&#xff0c;分别为胶囊类型&#xff08;Capsule&#xff09;、圆形按钮&#xff08;Circle&#xf…...

不用来回切换,一个界面管理多个微信

你是不是也有多个微信号需要管理&#xff1f; 是不是也觉得频繁切换账号很麻烦&#xff1f; 是不是也想提升多账号管理的效率&#xff1f; 在工作中&#xff0c;好的辅助工具&#xff0c;能让我们的效率加倍增长&#xff01; 今天&#xff0c; 就给大家分享一个多微管理工具…...

MySQL系统优化

文章目录 MySQL系统优化第一章&#xff1a;引言第二章&#xff1a;MySQL服务架构优化1. 读写分离2. 水平分区与垂直分区3. 缓存策略 第三章&#xff1a;MySQL配置优化1. 内存分配优化Buffer Pool 的优化查询缓存与表缓存Key Buffer 2. 连接优化最大连接数会话超时连接池 3. 日志…...

若依笔记(八):芋道的Docker容器化部署

目录 增加环境变量 DockerFile与镜像制作 nginx配置 vue3前端工程 首先搞个ECS阿里主机,1核4g足够,最大程度保证是docker运行来减少主机资源占用,同时因为是公有云,端口策略安全很重要,每个对外服务的端口要通过安全组放开; mysql的docker使用8版本,启动时候给my.cn…...

前端隐藏元素的方式有哪些?HTML 和 CSS 中隐藏元素的多种方法

当面试官突然问你&#xff1a;“前端隐藏元素的方式有哪些&#xff1f;”你还是只知道 display: none 吗&#xff1f; 其实&#xff0c;在前端开发的世界里&#xff0c;隐藏元素的方法非常多。每种方法都有自己的小技巧和使用场景&#xff0c;了解它们不仅能让你应对自如&…...

sqli—labs靶场 5-8关 (每日4关练习)持续更新!!!

Less-5 上来先进行查看是否有注入点&#xff0c;判断闭合方式&#xff0c;查询数据列数&#xff0c;用union联合注入查看回显位&#xff0c;发现到这一步的时候&#xff0c;和前四道题不太一样了&#xff0c;竟然没有回显位&#xff1f;&#xff1f;&#xff1f; 我们看一下源…...

【Java】异常处理实例解析

文章目录 Java异常处理实例解析Example01_2023yang&#xff1a;未处理的异常Example02_2023yang&#xff1a;捕获并处理异常Example03_2023yang&#xff1a;finally块的使用Example04_2023yang&#xff1a;自定义异常Example05_2023yang&#xff1a;忽略异常信息Example06_2023…...

flutter调试

上面的调试The following FormatException was thrown while handling a gesture: Invalid double -Infinity874When the exception was thrown, this was the stack: #0 double.parse (dart:core-patch/double_patch.dart:113:28) #1 _CalculatorScreenState._butt…...

从日志到环境变量:根治 Android Studio AVD 启动报错“The emulator process has terminated”

1. 从错误弹窗到日志分析&#xff1a;定位问题的第一步 当你兴冲冲地打开Android Studio准备启动AVD&#xff08;Android Virtual Device&#xff09;时&#xff0c;突然弹出一个冰冷的提示框&#xff1a;"The emulator process has terminated"&#xff0c;这感觉就…...

用PCA给高维数据‘瘦身’:从鸢尾花数据集到人脸图像,实战对比降维效果与可视化技巧

用PCA给高维数据‘瘦身’&#xff1a;从鸢尾花数据集到人脸图像&#xff0c;实战对比降维效果与可视化技巧 当面对成百上千维的数据时&#xff0c;我们常会陷入"维度灾难"的困境——计算资源吃紧、模型训练缓慢&#xff0c;更糟的是噪声干扰导致分析结果失真。主成分…...

DriveBench:面向真实驾驶场景的长序列多智能体交互基准测试框架

1. 项目概述&#xff1a;从“世界基准”到“驾驶基准”的演进如果你在自动驾驶或者计算机视觉领域摸爬滚打过几年&#xff0c;一定对“基准测试”&#xff08;Benchmark&#xff09;这个词又爱又恨。爱的是&#xff0c;它提供了一个相对公平的擂台&#xff0c;让不同算法、不同…...

别再为嵌入式设备大内存发愁了!手把手教你用CMA(连续内存分配器)搞定Linux视频编解码缓冲区

嵌入式多媒体开发中的连续内存优化实战&#xff1a;CMA技术深度解析 在嵌入式多媒体开发领域&#xff0c;视频编解码、图像处理等任务对内存管理提出了严苛要求。当你在树莓派上部署视频监控系统&#xff0c;或在工业摄像头中实现实时H.264编码时&#xff0c;是否经常遇到这样的…...

Ruby LLM框架:为Ruby开发者打造的大语言模型应用开发工具包

1. 项目概述&#xff1a;一个为Ruby语言量身打造的LLM应用框架如果你是一名Ruby开发者&#xff0c;最近被各种大语言模型&#xff08;LLM&#xff09;的应用搞得心痒痒&#xff0c;但看着满世界的Python库和框架感到无从下手&#xff0c;那么crmne/ruby_llm这个项目可能就是你在…...

飞书自动化脚本开发指南:从API集成到智能审批机器人实战

1. 项目概述&#xff1a;飞书自动化&#xff0c;从“手动”到“自动”的效能革命 如果你每天的工作&#xff0c;有超过30%的时间是在飞书里重复点击、复制粘贴、手动发送消息和整理表格&#xff0c;那么“cicbyte/feishu-atuo”这个项目&#xff0c;很可能就是你一直在寻找的“…...

从零打造专业GitHub个人资料页:Markdown与动态集成实战指南

1. 项目概述与核心价值 在技术圈子里混了十几年&#xff0c;我越来越觉得&#xff0c;一个开发者的“数字门面”和代码能力同等重要。这个门面&#xff0c;很多时候就是你的GitHub主页。早些年&#xff0c;大家的GitHub个人页面就是个简单的仓库列表&#xff0c;加上一些贡献图…...

ITK-SNAP医学图像分割:破解三维解剖结构提取的工程难题

ITK-SNAP医学图像分割&#xff1a;破解三维解剖结构提取的工程难题 【免费下载链接】itksnap ITK-SNAP medical image segmentation tool 项目地址: https://gitcode.com/gh_mirrors/it/itksnap 当我们面对复杂的脑部MRI数据、肿瘤CT扫描或心血管影像时&#xff0c;最大…...

Ubuntu中ping命令安装与网络诊断全攻略

1. 项目概述&#xff1a;一个看似简单却暗藏玄机的问题“如何在Ubuntu中安装ping”&#xff0c;这个标题乍一看&#xff0c;可能会让很多老手会心一笑&#xff0c;甚至觉得有些“小白”。但恰恰是这个看似基础到不能再基础的问题&#xff0c;却是我在多年运维和开发工作中&…...

量子计算解决最大独立集问题的qReduMIS算法解析

1. 量子计算与最大独立集问题概述最大独立集问题&#xff08;Maximum Independent Set, MIS&#xff09;是图论中的一个经典NP难问题&#xff0c;其目标是找到给定无向图中最大的顶点子集&#xff0c;使得该子集中任意两个顶点之间没有边相连。这个问题在社交网络分析、无线网络…...