Відповідь мого 2020 року (або 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>
)
}
давайте використовувати свою уяву для того , що тут відсутній (WidgetHead), reactstrap
є те , що ви можете знайти на НПМ: замінити innerRef
з ref
на спадщину йот елемент (скажімо <div>
).
useEffect або useLayoutEffect
Остання, як кажуть, є синхронною для змін
useLayoutEffect
(або useEffect
) другий аргумент
Другий аргумент - це масив, і він перевіряється перед виконанням функції першого аргументу.
я використав
[себе.поточний, сам.поточний? сам.струмент.клиентВисота: 0]
оскільки сам.current є нульовим перед рендерінгом, і це добре не перевіряти, другий параметр в кінці myself.current.clientHeight
- це те, що я хочу перевірити на зміни.
що я тут вирішую (або намагаюся вирішити)
Я вирішую тут проблему віджетів на сітці, які змінюють свою висоту за власним бажанням, а система сітки повинна бути достатньо еластичною, щоб реагувати ( https://github.com/STRML/react-grid-layout ).
setState
для призначення значення висоти змінної стану.