Câu trả lời vào năm 2020 (hoặc 2019) của tôi
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>
)
}
hãy sử dụng trí tưởng tượng của bạn cho những gì còn thiếu ở đây (WidgetHead), reactstraplà thứ bạn có thể tìm thấy trên npm: thay thế innerRefbằng refcho một phần tử dom cũ (giả sử a <div>).
useEffect hoặc useLayoutEffect
Cuối cùng được cho là đồng bộ cho các thay đổi
useLayoutEffect(hoặc useEffect) đối số thứ hai
Đối số thứ hai là một mảng và nó được kiểm tra trước khi thực thi hàm trong đối số đầu tiên.
Tôi đã sử dụng
[yourself.current, yourself.current? yourself.current.clientHeight: 0]
vì bản thân tôi.current là null trước khi hiển thị và đó là điều tốt không nên kiểm tra, tham số thứ hai ở cuối myself.current.clientHeightlà những gì tôi muốn kiểm tra các thay đổi.
những gì tôi đang giải quyết ở đây (hoặc đang cố gắng giải quyết)
Ở đây tôi đang giải quyết vấn đề tiện ích con trên lưới tự thay đổi chiều cao của nó và hệ thống lưới phải đủ đàn hồi để phản ứng ( https://github.com/STRML/react-grid-layout ).
setStateđể gán giá trị chiều cao cho một biến trạng thái.