Ma réponse de 2020 (ou 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>
)
}
laissez utiliser votre imagination pour ce qui manque ici (WidgetHead), reactstrap
est quelque chose que vous pouvez trouver sur npm: remplacez innerRef
par ref
un élément dom hérité (disons a <div>
).
useEffect ou useLayoutEffect
Le dernier est dit synchrone pour les changements
useLayoutEffect
(ou useEffect
) deuxième argument
Le deuxième argument est un tableau et il est vérifié avant d'exécuter la fonction dans le premier argument.
j'ai utilisé
[moi-même.current, moi-même.current? moi-même.current.clientHeight: 0]
car moi-même.current est nul avant le rendu, et c'est une bonne chose de ne pas vérifier, le deuxième paramètre à la fin myself.current.clientHeight
est ce que je veux vérifier pour les changements.
ce que je résous ici (ou essaie de résoudre)
Je résous ici le problème du widget sur une grille qui change sa hauteur de sa propre volonté, et le système de grille doit être suffisamment élastique pour réagir ( https://github.com/STRML/react-grid-layout ).
setState
pour affecter la valeur de hauteur à une variable d'état.