Meine 2020 (oder 2019) Antwort
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>
)
}
nutzen Sie Ihre Fantasie lassen , was hier (WidgetHead) fehlt, reactstrap
ist etwas , das Sie auf npm finden: ersetzen innerRef
mit ref
einem Vermächtnis dom Element (sagen a <div>
).
useEffect oder useLayoutEffect
Der letzte soll für Änderungen synchron sein
useLayoutEffect
(oder useEffect
) zweites Argument
Das zweite Argument ist ein Array und wird überprüft, bevor die Funktion im ersten Argument ausgeführt wird.
ich benutzte
[Ich selbst. Aktuell, Ich. Aktuell? Ich. Aktuell. Kunde Höhe: 0]
Da mir.current vor dem Rendern null ist und dies eine gute Sache ist, die nicht überprüft werden sollte, myself.current.clientHeight
möchte ich den zweiten Parameter am Ende auf Änderungen überprüfen.
was ich hier löse (oder zu lösen versuche)
Ich löse hier das Problem des Widgets in einem Raster, das seine Höhe nach eigenem Willen ändert, und das Rastersystem sollte elastisch genug sein , um zu reagieren ( https://github.com/STRML/react-grid-layout ).
setState
den Höhenwert einer Statusvariablen zuweisen.