2020'nin (veya 2019) cevabı
import React, {Component, useRef, useLayoutEffect} from 'react';
import { useDispatch } from 'react-redux';
import { Toast, ToastBody, ToastHeader } from 'reactstrap';
import {WidgetHead} from './WidgetHead';
export const Widget = ({title, toggle, reload, children, width, name}) => {
let myself = useRef(null);
const dispatch = useDispatch();
useLayoutEffect(()=>{
if (myself.current) {
const height = myself.current.clientHeight
dispatch({type:'GRID_WIDGET_HEIGHT', widget:name, height})
}
}, [myself.current, myself.current?myself.current.clientHeight:0])
return (
<Toast innerRef={myself}>
<WidgetHead title={title}
toggle={toggle}
reload={reload} />
<ToastBody>
{children}
</ToastBody>
</Toast>
)
}
Burada eksik olan şey için hayal gücünüzü kullanın (WidgetHead), reactstrap
npm'de bulabileceğiniz bir şeydir: eski bir dom öğesi için innerRef
ile değiştirin ref
(örneğin a <div>
).
useEffect veya useLayoutEffect
Sonuncunun değişiklikler için senkronize olduğu söyleniyor
useLayoutEffect
(veya useEffect
) ikinci argüman
İkinci argüman bir dizidir ve ilk argümandaki fonksiyon çalıştırılmadan önce kontrol edilir.
kullandım
[kendim.current, kendim.current? kendim.current.clientHeight: 0]
çünkü kendim.current, renderlemeden önce null ve bu kontrol etmemek için iyi bir şey, sondaki ikinci parametre myself.current.clientHeight
değişiklikleri kontrol etmek istediğim şey.
burada çözdüğüm (veya çözmeye çalıştığım)
Burada kendi iradesiyle yüksekliğini değiştiren bir ızgarada widget sorununu çözüyorum ve ızgara sistemi tepki verecek kadar esnek olmalıdır ( https://github.com/STRML/react-grid-layout ).
setState
yükseklik değerini bir durum değişkenine atamak için kullanabilirsiniz .