Moja odpowiedź z 2020 (lub 2019)
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>
)
}
niech wykorzystać swoją wyobraźnię do czego brakuje tutaj (WidgetHead), reactstrapjest czymś, co można znaleźć na KMP zamienić innerRefze refdla elementu dziedzictwo dom (powiedzmy <div>).
useEffect lub useLayoutEffect
Mówi się, że to ostatnie jest synchroniczne dla zmian
useLayoutEffect(lub useEffect) drugi argument
Drugi argument jest tablicą i jest sprawdzany przed wykonaniem funkcji w pierwszym argumencie.
użyłem
[yourself.current, yourself.current? yourself.current.clientHeight: 0]
Ponieważ self.current ma wartość null przed renderowaniem, a tego dobrze nie sprawdzać, drugi parametr na końcu myself.current.clientHeightjest tym, co chcę sprawdzić pod kątem zmian.
co tutaj rozwiązuję (lub próbuję rozwiązać)
Rozwiązuję tutaj problem widżetu na siatce, który z własnej woli zmienia swoją wysokość, a układ siatki powinien być na tyle elastyczny, aby zareagować ( https://github.com/STRML/react-grid-layout ).
setStatedo przypisania wartości wysokości do zmiennej stanu.