Dies könnte möglicherweise auf einfachere Weise durch Verwendung von Rückrufreferenzen gehandhabt werden .
Mit React können Sie eine Funktion an eine Referenz übergeben, die das zugrunde liegende DOM-Element oder den zugrunde liegenden Komponentenknoten zurückgibt. Siehe: https://reactjs.org/docs/refs-and-the-dom.html#callback-refs
const MyComponent = () => {
const myRef = node => console.log(node ? node.innerText : 'NULL!');
return <div ref={myRef}>Hello World</div>;
}
Diese Funktion wird ausgelöst, wenn der zugrunde liegende Knoten geändert wird. Zwischen den Updates wird es null sein, daher müssen wir dies überprüfen. Beispiel:
const MyComponent = () => {
const [time, setTime] = React.useState(123);
const myRef = node => console.log(node ? node.innerText : 'NULL!');
setTimeout(() => setTime(time+1), 1000);
return <div ref={myRef}>Hello World {time}</div>;
}
Obwohl dies nicht die Größenänderung als solche behandelt (wir würden immer noch einen Listener für die Größenänderung benötigen, um die Größe des Fensters zu ändern), bin ich mir nicht sicher, ob das OP dies verlangt hat. In dieser Version wird die Größe des Knotens aufgrund eines Updates geändert.
Hier ist ein benutzerdefinierter Haken, der auf dieser Idee basiert:
export const useClientRect = () => {
const [rect, setRect] = useState({width:0, height:0});
const ref = useCallback(node => {
if (node !== null) {
const { width, height } = node.getBoundingClientRect();
setRect({ width, height });
}
}, []);
return [rect, ref];
};
Das Obige basiert auf https://reactjs.org/docs/hooks-faq.html#how-can-i-measure-a-dom-node
Notieren Sie den Haken zurückkehrt einen ref Rückruf, anstatt dass sie bestanden einen ref. Und wir verwenden useCallback , um zu vermeiden, dass jedes Mal eine neue Ref-Funktion neu erstellt wird. nicht lebenswichtig, aber als gute Praxis angesehen.
Die Verwendung ist wie folgt (basierend auf dem Beispiel von Marco Antônio):
const MyComponent = ({children}) => {
const [rect, myRef] = useClientRect();
const { width, height } = rect;
return (
<div ref={myRef}>
<p>width: {width}px</p>
<p>height: {height}px</p>
{children}
<div/>
)
}