La mia risposta del 2020 (o del 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>
)
}
usa la tua immaginazione per ciò che manca qui (WidgetHead), reactstrap
è qualcosa che puoi trovare su npm: sostituisci innerRef
con ref
un elemento dom legacy (ad esempio a <div>
).
useEffect o useLayoutEffect
Si dice che l'ultimo sia sincrono per i cambiamenti
useLayoutEffect
(o useEffect
) secondo argomento
Il secondo argomento è un array e viene verificato prima di eseguire la funzione nel primo argomento.
ero solito
[me stesso.current, me stesso.corrente? me stesso.current.clientHeight: 0]
poiché me stesso.current è nullo prima del rendering, ed è una buona cosa non controllare, il secondo parametro alla fine myself.current.clientHeight
è quello che voglio controllare per le modifiche.
cosa sto risolvendo qui (o cercando di risolvere)
Sto risolvendo qui il problema del widget su una griglia che cambia la sua altezza per propria volontà e il sistema della griglia dovrebbe essere abbastanza elastico per reagire ( https://github.com/STRML/react-grid-layout ).
setState
per assegnare il valore di altezza a una variabile di stato.