react组件中useRef声明的变量和let声明的变量区别

ops/2025/3/29 22:35:11/

在 React 组件中,useReflet 声明的变量之间存在一些关键区别,它们在生命周期、作用域以及数据持久性方面的行为不同。

1. 数据持久性

  • useRef

    • useRef 创建的引用在组件的整个生命周期内保持持久,不会在组件重新渲染时丢失或重置
    • ref.current 的值可以在组件多次渲染间保留和更新,而不会触发重新渲染。
  • let

    • 使用 let 声明的变量在每次组件重新渲染时都会被重新初始化。也就是说,let 变量的值不会在不同渲染之间保留。

2. 触发重新渲染

  • useRef

    • 更新 ref.current 不会触发组件的重新渲染
    • 通常用于保存 DOM 节点的引用或存储一些无需参与重新渲染流程的数据。
  • let

    • 修改 let 变量的值同样不会直接触发重新渲染,但由于它在每次渲染中都会被重新声明,通常无法在渲染间存储有用的状态。

3. 使用场景

  • useRef 常见使用场景:

    • 访问 DOM 元素: 通过 useRef 来获取和操作 DOM,例如表单输入的焦点管理。
      function TextInput() {const inputRef = useRef(null);const focusInput = () => {inputRef.current.focus();};return (<div><input ref={inputRef} type="text" /><button onClick={focusInput}>聚焦输入框</button></div>);
      }
      
    • 保存可变数据(类似实例变量): 例如保存计时器 ID、前一次渲染的某个值等,而不需要触发组件重新渲染。
      function Timer() {const timerId = useRef(null);const startTimer = () => {timerId.current = setInterval(() => {console.log('计时中...');}, 1000);};const stopTimer = () => {clearInterval(timerId.current);};return (<div><button onClick={startTimer}>开始计时</button><button onClick={stopTimer}>停止计时</button></div>);
      }
      
  • let 常见使用场景:

    • 存储函数内部的局部变量: 适用于一些只在当前渲染期间有效的逻辑计算。
      function Counter() {let count = 0; // 每次重新渲染都会重新初始化为 0const increment = () => {count += 1;console.log(count); // 这个值会变,但不会在渲染中保留};return <button onClick={increment}>增加</button>;
      }
      
    • 这种情况中,如果希望持久保存计数值,就需要使用 useState,而不是单纯用 let

4. useState 的对比(扩展)

useReflet 的行为类似,但在组件中用 useState 来声明状态变量时,变量的变化会触发重新渲染:

function Counter() {const [count, setCount] = useState(0);const increment = () => {setCount(count + 1); // 触发组件重新渲染};return <button onClick={increment}>当前计数:{count}</button>;
}

相比之下,如果只是用 useRef,即使改变 ref.current,UI 也不会更新,因为 useRef 的变化不会触发渲染。


总结表

特性useReflet
数据持久性跨渲染周期保持数据每次渲染会重新初始化
触发组件重新渲染不会触发不会触发
典型用途保存 DOM 引用或非状态性变量临时存储当前渲染中的局部值
常见使用场景DOM 操作、保存计时器等可变数据函数内的计算逻辑、循环等

简而言之:

  • useRef 更适合在渲染间保持数据,尤其是需要跨渲染周期存储非 UI 状态的值。
  • let 仅在当前渲染期间有效,每次重新渲染都会重置值。

http://www.ppmy.cn/ops/170026.html

相关文章

【Python机器学习】4.1. 过拟合(overfitting)与欠拟合(underfitting)

喜欢的话别忘了点赞、收藏加关注哦&#xff08;关注即可查看全文&#xff09;&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 4.1.1. 什么是过拟合、欠拟合 举个例子&#xff1a; 我们获得了某个地区在某段时间下的温度数…

B站左神算法课学习笔记(P7):图

目录 一、图的存储方式&#xff08;千奇百怪&#xff09; 1&#xff09;邻接表 2&#xff09;邻接矩阵 3&#xff09;其他 4&#xff09;推荐存储方式&#xff08;代码&#xff09; 二、图的遍历 &#xff08;1&#xff09;宽度优先遍历 &#xff08;2&#xff09;深度…

Go 语言当中的反射机制

目录 Go 语言当中的反射机制反射一. 三大法则第一法则第二法则第三法则 二. 类型和值三. 更新变量四. 实现协议五. 方法调用 Go 语言当中的反射机制 由于我最近总结了 GeeRPC 项目&#xff0c;在 GeeRPC 的服务注册环节需要通过反射将服务和其所具备的方法注册到服务端&#x…

第一天学爬虫

阅读提示&#xff1a;我今天才开始尝试爬虫&#xff0c;写的不好请见谅。 一、准备工具 requests库&#xff1a;发送HTTP请求并获取网页内容。BeautifulSoup库&#xff1a;解析HTML页面并提取数据。pandas库&#xff1a;保存抓取到的数据到CSV文件中。 二、爬取步骤 发送请求…

Gradle Project import Eclipse

Gradle Project import Eclipse

26考研——图_图的基本概念(6)

408答疑 文章目录 一、图的基本概念图的定义非空性非线性结构 顶点和边的表示顶点边 有向图 & 无向图有向图有向图 G 1 G_1 G1​ 的表示 无向图无向图 G 2 G_2 G2​ 的表示 简单图 & 多重图简单图多重图 顶点的度、入度和出度顶点的度有向图的度 路径、路径长度和回路…

跨域问题的解决方案

一、跨域问题的本质 1.1 同源策略的三要素 浏览器的同源策略&#xff08;Same-Origin Policy&#xff09;要求请求的 协议、域名、端口 完全一致&#xff0c;否则视为跨域&#xff1a; 协议不同&#xff1a;http 与 https域名不同&#xff1a;a.com 与 b.com端口不同&#x…

HarmonyOS 之 @Require 装饰器自学指南

在 HarmonyOS 应用开发工作中&#xff0c;我频繁碰到组件初始化传参校验的难题。在复杂的组件嵌套里&#xff0c;要是无法确保必要参数在构造时准确传入&#xff0c;就极易引发运行时错误&#xff0c;而且排查起来费时费力。一次偶然的机会&#xff0c;我接触到了 Require 装饰…