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

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

回答与解析:

在 React 中,若需获取多个动态生成子组件(或 DOM 元素)的引用,不能直接将同一个 useRef 对象赋给多个元素,因为 useRef 创建的是单一引用。正确做法是使用一个 ref 数组或对象来分别存储每个子元素的 ref。

推荐方式是结合 useCallback 和 useRef 创建一个动态 ref 容器。例如:

import { useRef, useCallback } from 'react';

function ParentComponent({ items }) {
  const itemRefs = useRef([]);

  const setItemRef = useCallback((index) => (el) => {
    itemRefs.current[index] = el;
  }, []);

  return (
    <div>
      {items.map((item, index) => (
        <div key={item.id} ref={setItemRef(index)}>
          {item.name}
        </div>
      ))}
    </div>
  );
}

解析:

  • useRef() 创建一个可变对象 itemRefs.current,用于保存多个 DOM 引用。
  • useCallback 用于生成一个稳定的函数 setItemRef,避免每次渲染都创建新函数。
  • setItemRef(index) 返回一个闭包函数,该函数在 React 挂载/卸载 DOM 时被调用,将对应索引的元素存入 itemRefs.current。
  • 使用 key 确保 React 能正确追踪每个元素的身份,避免 ref 错乱。

这种方式避免了使用 useRef 直接赋值给多个元素导致的覆盖问题,也比使用 createRef() 在每次渲染时创建新 ref 更高效。

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

昵称:
邮箱:
内容: