คำตอบของฉันในปี 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: แทนที่innerRef
ด้วยref
องค์ประกอบ Dom แบบเดิม (พูด a <div>
)
useEffect หรือ useLayoutEffect
สุดท้ายกล่าวว่าซิงโครนัสสำหรับการเปลี่ยนแปลง
useLayoutEffect
(หรือuseEffect
) อาร์กิวเมนต์ที่สอง
อาร์กิวเมนต์ที่สองคืออาร์เรย์และมีการตรวจสอบก่อนเรียกใช้ฟังก์ชันในอาร์กิวเมนต์แรก
ฉันใช้
[ตัวเองปัจจุบัน, ตัวเองปัจจุบัน? ตัวเอง.current.clientHeight: 0]
เนื่องจากตัวเองปัจจุบันเป็นโมฆะก่อนที่จะแสดงผลและนั่นเป็นสิ่งที่ดีที่จะไม่ตรวจสอบพารามิเตอร์ที่สองในตอนท้ายmyself.current.clientHeight
คือสิ่งที่ฉันต้องการตรวจสอบการเปลี่ยนแปลง
สิ่งที่ฉันกำลังแก้อยู่ที่นี่ (หรือพยายามแก้)
ฉันกำลังแก้ปัญหาของวิดเจ็ตบนกริดที่เปลี่ยนความสูงตามความต้องการของตัวเองและระบบกริดควรยืดหยุ่นพอที่จะตอบสนอง ( https://github.com/STRML/react-grid-layout )
setState
ในการกำหนดค่าความสูงให้กับตัวแปรรัฐ