如何在 React 中正确地使用 useRef 来获取动态生成的多个子组件的 DOM 节点引用?

如何在 React 中正确地使用 useRef 来获取动态生成的多个子组件的 DOM 节点引用?

在 React 中,若需获取多个动态生成子组件的 DOM 引用,应使用 useRef 配合回调函数或创建 ref 数组,而不是直接为每个元素分配同一个 ref。具体做法如下:

方法一:使用 ref 回调函数

import { useRef, useEffect } from 'react';

function Parent() {
  const itemRefs = useRef([]);

  useEffect(() => {
    // 此时 itemRefs.current 包含所有 DOM 节点
    console.log(itemRefs.current);
  }, []);

  const items = ['A', 'B', 'C'];

  return (
    <div>
      {items.map((item, index) => (
        <div
          key={item}
          ref={(el) => (itemRefs.current[index] = el)}
        >
          {item}
        </div>
      ))}
    </div>
  );
}

方法二:使用 useRef 创建 ref 数组(推荐)

import { useRef, useEffect } from 'react';

function Parent() {
  const items = ['A', 'B', 'C'];
  const itemRefs = useRef(items.map(() => React.createRef()));

  useEffect(() => {
    itemRefs.current.forEach((ref, index) => {
      console.log(`Item ${index}:`, ref.current);
    });
  }, []);

  return (
    <div>
      {items.map((item, index) => (
        <div key={item} ref={itemRefs.current[index]}>
          {item}
        </div>
      ))}
    </div>
  );
}

解析:

  • 不能直接将同一个 useRef 对象分配给多个元素,否则只会保留最后一个元素的引用。
  • 方法一通过回调函数动态将每个元素赋值到 ref 数组的对应索引位置,适用于函数组件。
  • 方法二使用 React.createRef() 为每个元素创建独立的 ref 对象,更直观但略显冗余。
  • 注意:ref 数组本身不应放在组件状态或每次渲染重新创建,应使用 useRef 保证引用稳定。
  • 若子组件是自定义组件而非原生 DOM 元素,需在子组件上使用 forwardRef 才能正确转发 ref。

发表评论 (审核通过后显示评论):

昵称:
邮箱:
内容: