开发者问题收集

访问 useRef 中的任何元素都会引发“未定义”

2020-11-29
1026

我尝试在 React 中使用 ref,它是一个包含对 DOM 中多个其他 div 的引用的数组。

在 useEffect 中,我通过一个对象进行映射以呈现 div,并为每个 div 分配一个 ref。在分配 ref 之前,我使用 createRef 为其实例化一个插槽。

我本质上是在尝试复制 这个 答案建议的操作。

我遇到的问题是我的编译器一直看到 undefined 。我不确定为什么会发生这种情况,但是这是我拥有的代码:

import React from "react";

const items = [
  [1, 2, 3, 4, 5],
  [6, 7, 8, 9, 10]
];
export default function Component() {
  const [renderedItems, setRenderedItems] = React.useState();
  const [height, setHeight] = React.useState(0);
  const refsArray = React.useRef([]);

  React.useEffect(() => {
    const heightOfFirstDiv = refsArray.current[0].offsetHeight;
    console.log("heightOfFirstDiv", heightOfFirstDiv); // <-- this is always undefined
    setHeight(heightOfFirstDiv);
  }, [renderedItems]);

  React.useEffect(() => {
    setRenderedItems(
      items.map((item, index) => {
        refsArray.current[index] = React.createRef();

        return (
          <div
            ref={refsArray.current[index]}
            style={{ height: 100, width: 40 }}
          >
            {item}
          </div>
        );
      })
    );
  }, []);

  return (
    <div>
      The height is: {height || "undefined"}
      {renderedItems}
    </div>
  );
}

我在这里做错了什么?

awesome-thompson-110v2

2个回答

第二个答案 您链接的问题实际上更好,更简单。这可以通过 callback refs refs

205426524

在组件状态下存储渲染元素不是一个好习惯,因为它使组件变得复杂,混乱且难以调试。

Dmitry Nikulin
2020-11-29

这是因为您的 current[0] 实际上是一个包含 .current 键的对象,您只需编辑 heightOfFirstDiv 来显示该键即可获得所需的值

 const heightOfFirstDiv = refsArray.current[0].current.offsetHeight;

如果您注意到,在您尝试复制的示例中,您会看到他们解构了这个 .current 键,这就是错误的来源

Fried noodles
2020-11-29