Jawaban saya tahun 2020 (atau 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>
)
}
biarkan menggunakan imajinasi Anda untuk apa yang hilang di sini (WidgetHead), reactstrap
adalah sesuatu yang dapat Anda temukan di npm: ganti innerRef
dengan ref
untuk elemen dom warisan (katakanlah a <div>
).
useEffect atau useLayoutEffect
Yang terakhir dikatakan sinkron untuk perubahan
useLayoutEffect
(atau useEffect
) argumen kedua
Argumen kedua adalah array, dan diperiksa sebelum menjalankan fungsi dalam argumen pertama.
Saya dulu
[diriku.current, myself.current? myself.current.clientHeight: 0]
karena diriku.current adalah null sebelum rendering, dan itu adalah hal yang baik untuk tidak diperiksa, parameter kedua di akhir myself.current.clientHeight
adalah apa yang ingin saya periksa perubahannya.
apa yang saya selesaikan di sini (atau coba pecahkan)
Di sini saya memecahkan masalah widget pada kisi yang mengubah ketinggiannya sesuai keinginan mereka sendiri, dan sistem kisi harus cukup elastis untuk bereaksi ( https://github.com/STRML/react-grid-layout ).
setState
untuk menetapkan nilai ketinggian ke variabel status.