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

React@16.x(29)useRef

目录

  • 1,介绍
  • 2,和 React.createRef() 的区别
  • 3,计时器的问题

目前来说,因为函数组件每次触发更新时,都会重新运行。无法像类组件一样让一些内容保持不变。
所以才出现了各种 HOOK 函数:useStateuseCallbackuseMemo 等来辅助实现和类组件相似的功能。

useRef 也是这样的目的。

1,介绍

在之前的文章中介绍了 ref,用于获取组件或真实DOM元素的引用。

useRef 作用相同,不过可以在函数组件中使用。同时它会返回对象的固定引用。

换句话说,当函数组件重新运行时,useRef() 前后2次返回的对象引用地址相同。
一个节点(React元素)对应一个唯一的对象。

React.createRef() 使用举例:

import React, { useState } from "react";export default function App() {const refInput = React.createRef();return (<><input ref={refInput}></input><buttononClick={() => {console.log(refInput.current.value);}}>获取 inputRef</button></>);
}

换成 useRef仅需要替换一行代码:

const refInput = React.createRef();
// 替换为
const refInput = useRef();

2,和 React.createRef() 的区别

上面的代码中,看起来只是一行代码的区别,但本质上处理逻辑不同。

  • React.createRef(),如果 ref 的值发生变动(函数组件重新渲染),则将旧值设为 null
  • useRef(),函数组件重新渲染多次时,所有返回的对象的引用地址相同。

验证下:
简单修改下,将每次更新后的新 ref 放到 window 对象中对比下:

import React, { useRef, useState } from "react";window.arr = [];
export default function App() {const refInput = React.createRef();window.arr.push(refInput);const [n, setN] = useState(); // 只是为了重新渲染组件。return (<><inputref={refInput}type="text"value={n}onChange={(e) => {setN(e.target.value);}}/></>);
}

多次改变 input.value 时,检查 window.arr

在这里插入图片描述

替换为 const refInput = useRef();

在这里插入图片描述

3,计时器的问题

在之前介绍 useEffect 时,提到了下面的写法是有问题的。

因为 useEffect 只会执行一次,所以在计时器中通过闭包获取的状态变量 n 永远都是10,

export default function App() {const [n, setN] = useState(10);useEffect(() => {const timer = setInterval(() => {setN(n - 1);}, 1000);return () => {clearInterval(timer);};}, []);return <div>{n}</div>;
}

该问题,通过将依赖项 n 传入即可。但会引起另一个问题:
每次函数重新运行,都会再次执行 useEffect,开启计时器又销毁计时器,开销很大。

export default function App() {const [n, setN] = useState(10);useEffect(() => {const timer = setInterval(() => {setN(n - 1);}, 1000);return () => {clearInterval(timer);};}, [n]);return <div>{n}</div>;
}

所以,可通过 useRef 来将函数重新运行后的新值传递给计时器,同时 useEffect 也只会运行一次,开启一次计时器!

注意,useRef() 返回的虽然是同一个对象,但 setN 修改的是它的 current 属性。所以计时器每次获取的都是新值。

export default function App() {const [n, setN] = useState(10);const refN = useRef(n);useEffect(() => {const timer = setInterval(() => {setN(--refN.current);}, 1000);return () => {clearInterval(timer);};}, []);return <div>{n}</div>;
}

以上。

相关文章:

React@16.x(29)useRef

目录 1&#xff0c;介绍2&#xff0c;和 React.createRef() 的区别3&#xff0c;计时器的问题 目前来说&#xff0c;因为函数组件每次触发更新时&#xff0c;都会重新运行。无法像类组件一样让一些内容保持不变。 所以才出现了各种 HOOK 函数&#xff1a;useState&#xff0c;u…...

无人机的力量——在民用方面的应用

无人机在民用方面的应用广泛且多样化&#xff0c;以下是对其应用的详细介绍&#xff1a; 影视航拍&#xff1a; 无人机航拍影像具有高清晰、大比例尺、小面积、高视角的优点&#xff0c;特别适合获取带状地区航拍影像&#xff08;如公路、铁路、河流、水库、海岸线等&#xff…...

探索档案未来,尽在ARCHE-2024

2024年第三届上海国际智慧档案展览会暨高峰论坛&#xff08;ARCHE-2024&#xff09;将于2024年6月19日至21日在上海跨国采购会展中心隆重举行。深圳市铨顺宏科技有限公司应邀参展&#xff0c;将以全新形象盛装亮相&#xff0c;展示其在档案管理领域的最新技术和解决方案。 ARC…...

Maven 核心插件 maven-clean-plugin 使用详解

在软件开发中&#xff0c;构建和管理项目的复杂性随着代码量和依赖的增加而不断提升。Maven作为一个强大的构建工具&#xff0c;简化了这一过程&#xff0c;并通过其插件机制提供了丰富的功能。其中&#xff0c;maven-clean-plugin 是Maven的核心插件之一&#xff0c;它在项目的…...

金融数据中心布线运维管理解决方案

金融行业的核心业务&#xff0c;如交易、支付、结算等&#xff0c;对网络的依赖程度极高。布线作为网络基础设施的重要组成部分&#xff0c;其稳定性和可靠性直接关系到业务的连续运行。因此&#xff0c;良好的布线管理能够确保网络系统的稳定运行&#xff0c;减少因网络故障导…...

C++初学者指南第一步---2. Hello world

C初学者指南第一步—2. Hello world 目录 C初学者指南第一步---2. Hello world1.源文件 “Hello.cpp”2.编译hello.cpp3.术语4.编译器标志5.不要使用 “using namespace std;” &#xff01; 1.源文件 “Hello.cpp” #include <iostream> // our first program int main…...

gitLab批量下载有权限的项目

前言 参考 https://www.jianshu.com/p/b3d4e5cee835 适用于git私服拉取个人所涉及权限的代码&#xff0c;方便有多个项目权限的人快速拉取自己所有权限的代码。 默认生成目录结构与gitlab一致 步骤一:获取权限你的代码权限文件d 从gitlab私服生成所有你有权限的代码信息 …...

解决 kali 中使用 vulhub 拉取不到镜像问题

由于默认情况下&#xff0c;访问的镜像是国外的&#xff0c;而从 2023 年开始&#xff0c;docker 的镜像网站就一直访问不了&#xff0c;所以我们可以把镜像地址改成国内的阿里云镜像地址。 1、在 cd /etc/docker/目录下创建或修改daemon.json文件 sudo touch daemon.json 2、在…...

CSS3 简介

CSS3 简介 CSS3&#xff0c;即层叠样式表的第三代&#xff0c;是网页设计和开发中不可或缺的技术之一。它为HTML元素提供了更加丰富和灵活的样式定义&#xff0c;使得网页不仅结构清晰&#xff0c;而且外观精美、交互性强。CSS3继承了CSS2的基本特性&#xff0c;并引入了许多新…...

springboot事务管理的机制是什么

SpringBoot的事务管理机制实质上是基于Spring框架的事务处理机制。其主要目的是确保一系列数据库操作要么全部成功&#xff0c;要么全部失败&#xff08;回滚&#xff09;&#xff0c;从而维护数据的完整性和一致性。 SpringBoot事务管理遵循ACID四大特性&#xff1a; 1、原子…...

Linux下tar命令解压缩

tar 命令是 Unix 和 Linux 系统中用来创建归档文件以及提取归档文件的工具。它通常用于备份文件或将多个文件和目录打包成一个单独的归档文件。默认情况下&#xff0c;tar 不会对文件进行压缩&#xff0c;但可以通过结合其他压缩工具&#xff08;如 gzip 或 bzip2&#xff09;来…...

当财政支持减弱时,国有企业如何实现降本增效?

随着市场环境的不断变化和上级市场化政策要求的不断推进&#xff0c;部分国有企业面临着双重压力&#xff0c;一方面&#xff0c;市场的快速变革要求企业不断创新、提升竞争力&#xff1b;另一方面&#xff0c;在响应上级市场化转型的号召下&#xff0c;财政支持的减弱成为了许…...

大模型「训练」与「微调」概念详解【6000字长文】

本文你将学到什么 1、大模型预训练与微调的基本流程 2、预训练、训练、后期预训练、微调的区别 3、大模型训练与微调的一些概念&#xff0c;如&#xff1a; Post-pretrain、SFT、RLHF、模型对齐、Lora、Q-Lora、大模型量化、微调指标、微调参数、大模型评测指标 预训练与微…...

JVM 垃圾回收器

一、垃圾回收器类型 如果说垃圾收集算法是内存回收的方法论&#xff0c;那么垃圾收集器就是内存回收的具体 实现。下图展示了7种作用于不同分代的收集器&#xff0c;其中用于回收新生代的收集器 包括Serial、PraNew、Parallel Scavenge&#xff0c;回收老年代的收集器包括Seri…...

Spring IOC 容器的构建流程?

Spring loc (Inversion of Control) 是一种设计模式&#xff0c;其中对象的创建和依赖关系由框架管理&#xff0c;而不是由应用程序直接管理。Spring loc容器是Spring框架的核心&#xff0c;它使用loC模式来管理应用程序中的对象 Spring loC容器的构建过程如下: 1.配置元数据…...

官方文档 搬运 MAXMIND IP定位 mysql导入 简单使用

官方文档地址&#xff1a; 官方文档 文件下载 1. 导入mysql可能报错 Error Code: 1290. The MySQL server is running with the --secure-file-priv option so it cannot execute this statement 查看配置 SHOW GLOBAL VARIABLES LIKE %secure%;secure_file_priv 原来…...

PHP入门教程1:PHP的基础概念和基本语法

本文将从基础开始&#xff0c;介绍PHP的基础概念和基本语法。 PHP简介环境搭建基本语法变量和常量数据类型操作符常见错误和调试方法 1. PHP简介 PHP&#xff0c;全称是 “PHP: Hypertext Preprocessor”&#xff0c;是一种开源的通用脚本语言&#xff0c;尤其适用于Web开发…...

头歌资源库(5)求阶乘问题

一、 问题描述 请输入一个50至100之间的整数n&#xff0c;求解n! 二、算法思想 输入一个50至100之间的整数n。声明一个变量result&#xff0c;并将其初始化为1&#xff0c;用于保存n的阶乘。使用一个循环&#xff0c;从1到n&#xff0c;循环变量为i。在循环中&#xff0c;将…...

09:整型与布尔型的转换

OpenJudge - 09:整型与布尔型的转换 描述 将一个整型变量的值赋给一个布尔型变量&#xff0c;再将这个布尔型变量的值赋给一个整型变量&#xff0c;得到的值是多少&#xff1f; 输入 一个整型范围内的整数&#xff0c;即初始时整型变量的值。 输出 一个整数&#xff0c;经过上述…...

51单片机STC89C52RC——2.1 独立按键控制LED亮灭

目录 目的 一&#xff0c;STC单片机模块 二&#xff0c;独立按键 2.1 独立按键位置 2.2 独立按键电路图 三&#xff0c;创建Keil项目 四&#xff0c;代码 五&#xff0c;代码编译、下载到51单片机 六&#xff0c;效果 目的 当独立K1按键按下时LED D1 点亮&#x…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...