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), reactstrap
là thứ bạn có thể tìm thấy trên npm: thay thế innerRef
bằng ref
cho 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.clientHeight
là 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.