React 19 中的useRef得到了进一步加强。

文章目录

  • 前言
    • [一 useRef 的核心原理](#一 useRef 的核心原理)
      • [1.1 为什么需要 useRef?](#1.1 为什么需要 useRef?)
      • [1.2 基本语法](#1.2 基本语法)
    • [二、React 19 中 useRef 的常见用法](#二、React 19 中 useRef 的常见用法)
      • [2.1 访问 DOM 元素](#2.1 访问 DOM 元素)
      • [2.2 保存跨渲染的数据](#2.2 保存跨渲染的数据)
    • [三、React 19 中的改进](#三、React 19 中的改进)
    • 注意
  • 总结

前言

在 React 的世界里,useRef 是一个既简单又强大的 Hook,它常常被用于访问 DOM 元素、保存不可变数据或管理组件的生命周期行为。随着 React 19 的发布,useRef 的使用场景和最佳实践也得到了进一步强化。本文将结合 React 19 的特性,深入探讨 useRef 的核心用法、常见误区以及实战技巧。


一 useRef 的核心原理

useRef 是 React 提供的一个内置 Hook,用于创建一个可变的 ref 对象。其返回值是一个包含 current 属性的对象,该属性在整个组件的生命周期中保持不变。

1.1 为什么需要 useRef?

  • 访问 DOM 元素 :在函数组件中,useRef 是获取 DOM 节点的标准方式。
  • 保存跨渲染的数据useRefcurrent 属性不会因组件的重新渲染而改变,适合存储不需要触发重渲染的数据。
  • 管理副作用 :结合 useEffectuseRef 可以用于控制副作用的执行时机。

1.2 基本语法

c 复制代码
	import { useRef } from 'react';
	function MyComponent() {
	  const myRef = useRef(initialValue);
	  // 使用 myRef.current 访问或修改值
	  return <div ref={myRef}>Hello, World!</div>;
	}

二、React 19 中 useRef 的常见用法

2.1 访问 DOM 元素

这是 useRef 最经典的用法。通过将 ref 属性绑定到 DOM 元素上,可以直接操作该元素。

示例:聚焦输入框

c 复制代码
	import { useRef } from 'react';
	function FocusInput() {
	  const inputRef = useRef(null);
	  const handleFocus = () => {
	    inputRef.current?.focus();
	  };
	  return (
	    <div>
	      <input ref={inputRef} type="text" placeholder="Type something..." />
	      <button onClick={handleFocus}>Focus Input</button>
	    </div>
	  );
	}

2.2 保存跨渲染的数据

useRefcurrent 属性不会因组件的重新渲染而改变,因此可以用来存储一些不需要触发重渲染的数据,比如计时器 ID 或事件监听器。

示例:记录按钮点击次数

c 复制代码
	import { useRef } from 'react';
	function ClickCounter() {
	  const clickCountRef = useRef(0);
	  const handleClick = () => {
	    clickCountRef.current += 1;
	    console.log(`Button clicked ${clickCountRef.current} times`);
	  };
	  return <button onClick={handleClick}>Click Me</button>;
	}

三、React 19 中的改进

之前我们在18版本的时候你要传递ref给外部,需要借助forwardRef,现在到了react 19不需要了,你直接以属性的方式进行传递。

ref 作为一个属性

从 React 19 开始,你现在可以在函数组件中将 ref 作为 prop 进行访问:

c 复制代码
function MyInput({placeholder, ref}) {
  return <input placeholder={placeholder} ref={ref} />
}


//...

<MyInput ref={ref} />

新的函数组件将不再需要 forwardRef,我们将发布一个 codemod 来自动更新你的组件以使用新的 ref prop。在未来的版本中,我们将弃用并移除 forwardRef

案例演示(触发子组件焦点事件)

c 复制代码
import { useRef } from "react";
const Child = ({ ref }: { ref: React.Ref<HTMLInputElement> }) => {
  return (
    <div>
      <input type="text" ref={ref} />
    </div>
  );
};
const App = () => {
  const childRef = useRef<HTMLInputElement>(null);
  const handler = () => {
    childRef.current?.focus();
  };
  return (
    <div>
      <button onClick={() => handler()}>点击</button>
      <Child ref={childRef} />
    </div>
  );
};

export default App;

注意

  • 在类组件中,ref 不作为 props 传递,因为它们引用的是组件实例。这意味着,如果你在类组件中需要访问 ref,你需要使用 React.forwardRef 或者 React.createRef
  • useRef的值不能作为useEffect等其他hooks的依赖项,因为它并不是一个响应式状态
  • 组件在重新渲染的时候,useRef的值不会被重新初始化。

总结

useRef 是 React 中一个简单却强大的 Hook,它在 React 19 中依然保持着其核心价值。通过掌握 useRef 的基本用法、高级技巧以及最佳实践,你可以更高效地开发 React 应用,避免常见的性能问题和代码混乱。

相关推荐
正义的大古5 小时前
OpenLayers地图交互 -- 章节十八:拖拽旋转和缩放交互详解
javascript·vue.js·openlayers
行者..................5 小时前
手动编译 OpenCV 4.1.0 源码,生成 ARM64 动态库 (.so),然后在 Petalinux 中打包使用。
前端·webpack·node.js
聪明的笨猪猪6 小时前
Java SE “JDK1.8新特性”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
小爱同学_6 小时前
一次面试让我重新认识了 Cursor
前端·面试·程序员
golang学习记6 小时前
AI 乱写代码?不是模型不行,而是你的 VS Code 缺了 Context!MCP 才是破局关键
前端
星光不问赶路人6 小时前
Vite 中的 import.meta.glob vs 动态导入:该用哪个?
前端·vite
疯狂踩坑人6 小时前
【万字长文】让面试没有难撕的JS基础题
javascript·面试
z_y_j2299704387 小时前
服务器中使用Docker部署前端项目
服务器·前端·docker·容器
极客小俊7 小时前
【浅谈javascript禁术】 eval函数暗藏玄机?
javascript
迪丽热爱7 小时前
解决【npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本。】问题
前端·npm·node.js