javascript - 如何使用 react Hook 动态添加 "refs"?

标签 javascript reactjs react-hooks

所以我有一个数据数组,我正在生成一个包含该数据的组件列表。我想在每个生成的元素上有一个 ref 来计算高度。 我知道如何使用 Class 组件来完成,但我想使用 React Hooks 来完成。

这是一个解释我想做什么的例子:

import React, {useState, useCallback} from 'react'
const data = [
  {
    text: 'test1'
  },
  {
    text: 'test2'
  }
]
const Component = () => {
  const [height, setHeight] = useState(0);
  const measuredRef = useCallback(node => {
    if (node !== null) {
      setHeight(node.getBoundingClientRect().height);
    }
  }, []);

  return (
    <div>
      {
        data.map((item, index) => 
          <div ref={measuredRef} key={index}>
            {item.text}
          </div>
        )
      }
    </div>
  )
}

最佳答案

不确定我是否完全理解您的意图,但我认为您想要这样的东西:

const {
  useState,
  useRef,
  createRef,
  useEffect
} = React;

const data = [
  {
    text: "test1"
  },
  {
    text: "test2"
  }
];

const Component = () => {
  const [heights, setHeights] = useState([]);
  const elementsRef = useRef(data.map(() => createRef()));

  useEffect(() => {
    const nextHeights = elementsRef.current.map(
      ref => ref.current.getBoundingClientRect().height
    );
    setHeights(nextHeights);
  }, []);

  return (
    <div>
      {data.map((item, index) => (
        <div ref={elementsRef.current[index]} key={index} className={`item item-${index}`}>
          {`${item.text} - height(${heights[index]})`}
        </div>
      ))}
    </div>
  );
};

const rootElement = document.getElementById("root");
ReactDOM.render(<Component />, rootElement);
.item {
  box-sizing: border-box;
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid #ccc;
}

.item-0 {
  height: 25px;
}

.item-1 {
  height: 50px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.6/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.6/umd/react-dom.production.min.js"></script>
<div id="root"/>

关于javascript - 如何使用 react Hook 动态添加 "refs"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55995760/

相关文章:

javascript - .click() 是真正的鼠标点击吗?

javascript - 使用 promise 作为回调来 react setState

javascript - 使用 useSelector 强制进行一次重新渲染

javascript - 如何从 JSON 创建动态路由列表?

javascript - 如何使用指针在解析 javascript 中编写内部连接

javascript - Python 的 NetworkX 库可以创建动画吗?他们的主页上有一个精美的动画

javascript - 如何从我的 react-native 应用程序打开笔记本电脑上的 chrome 选项卡(就像远程调试一样)?

reactjs - 在 componentWillReceiveProps 中调度时无限循环

javascript - 在 React 中的两个状态之间传递对象

javascript - useState 不更新其值