Мой ответ 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
это то , что вы можете найти на npm: replace innerRef
with ref
для устаревшего элемента dom (скажем, a <div>
).
useEffect или useLayoutEffect
Последний считается синхронным для изменений
useLayoutEffect
(или useEffect
) второй аргумент
Второй аргумент - это массив, и он проверяется перед выполнением функции в первом аргументе.
я использовал
[self.current ,self.current ?self.current.clientHeight: 0]
поскольку перед рендерингомself.current имеет значение null, и это хорошо, чтобы не проверять, второй параметр в конце myself.current.clientHeight
- это то, что я хочу проверить на предмет изменений.
что я здесь решаю (или пытаюсь решить)
Я решаю здесь проблему виджетов в сетке, которые изменяют свою высоту по собственному желанию, и система сетки должна быть достаточно эластичной, чтобы реагировать ( https://github.com/STRML/react-grid-layout ).
setState
для присвоения значения высоты переменной состояния.