You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中如何通过Hooks或其他方式为嵌套数组元素设置多ref

嵌套组件数组的多Ref设置方案

针对嵌套数组的元素引用获取场景,只需要把单层ref数组调整为和数据结构匹配的二维数组,按层级索引存储对应DOM引用即可,具体实现如下:

核心实现逻辑

  • 初始化ref时直接生成二维数组结构,外层长度和父级数组长度对齐
  • 遍历渲染时,通过回调ref的方式,按照「父级索引-子级索引」的二维坐标,把对应子元素DOM存入ref数组
  • 不要在循环渲染中使用createRef,每次重渲染它都会生成新的ref实例,会丢失已存储的DOM引用,直接用生命周期稳定的useRef即可

可直接运行的示例代码

const { useRef, useState, useEffect } = React;

const arr1 = [A, B, C]
const arr2 = [1, 2, 3]

const App = () => {
  // 初始化二维ref数组,和父级数组长度对齐
  const popoverRefs = useRef(arr1.map(() => []));

  useEffect(() => {
    // 可直接通过索引获取任意子元素:比如第一个父元素下第二个子元素为 popoverRefs.current[0][1]
    console.log('所有子元素DOM引用:', popoverRefs.current)
  }, [])

  return (
    <div>
      {arr1.map((parentItem, parentIndex) => {
        return(
          <div key={parentItem.id ?? parentIndex}>
            A Parent Element {parentItem.label}
            {arr2.map((childItem, childIndex) => {
              return (
                <div 
                  key={childItem.id ?? childIndex}
                  // 按二维索引存储对应子元素DOM
                  ref={node => popoverRefs.current[parentIndex][childIndex] = node}
                >
                  A Child Element {childItem.label}     
                </div>
              )
             })}
          </div>
        )
      })}
    </div>
  );
};

ReactDOM.render(
  <App />,
  document.getElementById("root")
);

使用说明

后续需要锚定弹出层时,直接通过索引取出对应DOM节点传入锚点配置即可,比如要给第2个父级下的第3个子元素绑定popover,直接取popoverRefs.current[1][2]就能拿到目标节点。如果子数组长度是动态变化的,记得及时清理ref数组中已经卸载的节点引用,避免无效内存占用。


内容的提问来源于stack exchange,提问作者Parag Pawar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 19:18:17