使用 React Refs 和 useRef Hook

React 使用声明式方法。你更新状态(state),React 就会更新 UI。这对于大多数任务都有效。

但有时你需要跳出虚拟 DOM(Virtual DOM)。你可能需要直接操作真实的 HTML 元素。这就是 Refs 和 useRef hook 发挥作用的地方。

什么是 Ref?

Ref 是一个指针。它将 React 直接连接到原生 DOM 节点。

为什么要使用 useRef 而不是 useState

State 的更新会触发重新渲染(re-render)。这意味着 React 会在屏幕上重新绘制组件。 Ref 的更新不会触发重新渲染。这使得它们非常适合那些会发生变化、但不需要立即显示在 UI 中的值。

常见使用场景:

• 自动聚焦输入框。 • 控制视频或音频元素(播放/暂停)。 • 测量元素的宽度或高度。 • 存储定时器(interval 或 timeout)的 ID。

如何使用 useRef

  1. 从 React 中导入 useRef
  2. 初始化它:const myRef = useRef(null)
  3. 将其绑定到元素:<input ref={myRef} />
  4. 通过 myRef.current 访问其值。

示例 1:自动聚焦输入框

当用户进入页面时,你希望光标直接位于文本框中。你可以使用 useEffect 在组件挂载后调用 myRef.current.focus()

示例 2:秒表

如果你将 setInterval 的 ID 存储在 state 中,每次定时器跳动时组件都会重新渲染。这会导致性能变慢。如果你将 ID 存储在 ref 中,组件就能保持高效。该值在多次渲染之间保持稳定,且不会给浏览器带来额外的负担。

State vs Ref:

State:触发重新渲染。用于 UI 数据。更新是异步的。 • Ref:不触发重新渲染。用于 DOM 访问和内存存储。更新是同步的。

高级进阶技巧:

避免过度使用。仅在声明式逻辑无法实现时才使用 refs。 • 清理内存。务必在清理函数(cleanup function)中清除定时器或事件监听器。 • 不要在渲染期间写入 refs。仅在 useEffect 或事件处理函数中更新 ref.current。这可以防止副作用。 • 使用 forwardRef。如果你想将 ref 传递给自定义的子组件,必须使用 React.forwardRef 对该子组件进行包装。

来源:https://dev.to/banti_kevat_8e2d123bb7994/react-me-refs-aur-useref-hook-kaise-use-karein-2dde