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