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

React ref 和 JS 对象的区别

✅ React 中的 ref 是什么?

在 React 中,ref(Reference) 是用来:

在不通过 state 的情况下,引用 DOM 或保存某个可变值 的机制。


🆚 React ref 和普通 JS 对象的区别

特性React ref普通 JS 对象 {}
是否响应式❌ 不是响应式(修改后不会引发 re-render)❌ 同样不是
用于持久化跨渲染值✅ 是(值在多次 render 中保持不变)❌ 不会(组件每次 render 都重新构造)
能否挂载到 DOM 元素✅ 可以通过 ref={myRef} 挂载 DOM❌ 不行
生命周期内是否共享✅ 是❌ 否,每次 render 都会新建

📌 示例:普通 JS 对象的问题

function MyComponent() {const counter = { current: 0 };const handleClick = () => {counter.current++;console.log(counter.current);};return <button onClick={handleClick}>Click</button>;
}

问题: 每次 render,counter 都是新对象,值不会保留。


✅ 使用 useRef 正确方式

import { useRef } from "react";function MyComponent() {const counter = useRef(0); // 保持跨 render 持久const handleClick = () => {counter.current++;console.log(counter.current);};return <button onClick={handleClick}>Click</button>;
}
  • useRef() 返回一个 { current: ... } 对象。
  • 这个对象在整个组件生命周期内不会变化(就像是“盒子”)。
  • 改变 ref.current 不会触发组件重新渲染。

✅ 用途总结

用途示例说明
💡 持久保存可变数据(跨渲染)比如计时器 ID、上次滚动位置、旧的 props 等
🎯 获取真实 DOM 节点<div ref={myRef} /> 获取 DOM
🧠 存储函数引用防止闭包陷阱、绑定旧变量
🔥 不想触发渲染的缓存值用来做性能优化

✅ 示例:获取 DOM 节点

function InputFocus() {const inputRef = useRef(null);const handleClick = () => {inputRef.current.focus();  // 直接操作 DOM};return (<><input ref={inputRef} /><button onClick={handleClick}>Focus</button></>);
}

❗注意事项

  • 修改 ref.current 不会触发组件更新(不像 useState)。
  • 不要试图监听 ref.current 的变化,ref 不是响应式系统。
  • 不适合替代 state 做 UI 展示用途。

✅ 总结一句话

🔧 useRef 是一个不会因为组件重新渲染而重置的可变容器,适合保存 DOM 引用或临时变量。


http://www.lqws.cn/news/515197.html

相关文章:

  • Linux系统之Tomcat服务
  • django csrf的局限性
  • 亚远景-ASPICE与ISO 26262:汽车安全与软件质量的协同
  • 云原生灰度方案对比:服务网格灰度(Istio ) 与 K8s Ingress 灰度(Nginx Ingress )
  • 【Pandas】pandas DataFrame asfreq
  • stm32week17+18+19+20
  • IP-GUARD外设以及网络禁用策略制定
  • ubuntu22.04可以执行sudo命令,但不在sudo组
  • 学习日记-spring-day37-6.25
  • NETCONF 典型工作流程
  • Spark 之 UT
  • 新能源汽车电池类型差异分析
  • 网络安全漏洞扫描是什么?如何识别目标进行扫描?
  • LangGraph--基础学习(Subgraphs 子图)
  • easy-caffeine一个简洁灵活易用基于caffeine的本地缓存框架
  • dovi交叉编译方法(编译libdovi.so)
  • PyTorch 入门之官方文档学习笔记(二)训练分类器
  • 利用Pytorch玩一玩文生图的HDGAN
  • 长尾关键词SEO优化高效策略
  • 微信小程序安卓手机输入框文字飘出输入框
  • 【服务器】服务器选型设计
  • Hadoop之HDFS
  • 【iOS】iOS崩溃总结
  • 一篇文章了解XML
  • 了解笔记本电脑制造:从品牌到代工厂的全产业链
  • Node.js-fs模块
  • linux内核中的链表实现
  • sentinel与seata组件在微服务中的基本作用
  • 微信点餐小程序—美食物
  • ICML 2025 | 低秩Swish网络:理论突破实现高效逼近,小模型性能媲美大网络