La respuesta de mi 2020 (o 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>
)
}
Use su imaginación para lo que falta aquí (WidgetHead), reactstrap
es algo que puede encontrar en npm: reemplace innerRef
con ref
para un elemento dom heredado (por ejemplo, a <div>
).
useEffect o useLayoutEffect
Se dice que el último es sincrónico para los cambios.
useLayoutEffect
(o useEffect
) segundo argumento
El segundo argumento es una matriz y se verifica antes de ejecutar la función en el primer argumento.
solía
[yo mismo actual, yo mismo actual? yo mismo actual.clienteHeight: 0]
porque yo mismo.currente es nulo antes de renderizar, y es bueno no verificarlo, el segundo parámetro al final myself.current.clientHeight
es lo que quiero verificar para ver si hay cambios.
lo que estoy resolviendo aquí (o tratando de resolver)
Estoy resolviendo aquí el problema del widget en una cuadrícula que cambia su altura por su propia voluntad, y el sistema de cuadrícula debe ser lo suficientemente elástico para reaccionar ( https://github.com/STRML/react-grid-layout ).
setState
para asignar el valor de altura a una variable de estado.