У вас была правильная идея, просто потребовалась пара настроек ... в основном, передача элемента ref и использование elementRef (не elementRef.current
) в массиве зависимостей useEffect
.
(Что касается useEffect
против useLayoutEffect
, поскольку вы только измеряете, а не мутируете DOM, то я считаю, что useEffect
- это путь к , но вы можете поменять его, как ... например, если вам нужно)
const useDimensions = elementRef => {
const [dimensions, setDimensions] = useState({ width: 0, height: 0 });
useEffect(() => {
const el = elementRef.current;
setDimensions({ width: el.clientWidth, height: el.clientHeight });
}, [elementRef]);
return [dimensions];
};
Используйте это так:
function App() {
const divRef = useRef(null);
const [dimensions] = useDimensions(divRef);
return (
<div ref={divRef} className="App">
<div>
width: {dimensions.width}, height: {dimensions.height}
</div>
</div>
);
}
Рабочие коды и коробка здесь
Отредактировано для добавления React Собственная версия:
Для React Native вы можете использовать useState
с onLayout
следующим образом:
const App=()=>{
const [dimensions, setDimensions] = useState({width:0, height:0})
return (
<View onLayout={(event) => {
const {x, y, width, height} = event.nativeEvent.layout;
setDimensions({width:width, height:height});
}}>
<Text}>
height: {dimensions.height} width: {dimensions.width}
</Text>
</View>
);
}