小编典典

如何使用react钩子动态添加“ refs”?

reactjs

因此,我有一个数据数组,并且正在使用该数据生成组件列表。我想在每个生成的元素上都有一个引用来计算高度。我知道如何使用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>
  )
}

阅读 300

收藏
2020-07-22

共1个答案

小编典典

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

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"/>
2020-07-22