[QUESTION EDITED AS IT WAS NOT CLEAR ENOUGH]
I am trying to simply get the width & height of one of the rendered <div/> on Child.js. This is a great example, but on my case I do not have jus one <div/>, but an array of containers dynamically rendered.
Issue:
I have restricted the number of refs being sent up to App.js as you can see on Child.js: line 12 hopping that it would work, having a stable data being received so I could setState for just the ref of the first <div> being rendered at Child.js.
It actually works on an "apparent" first iteration, but then, event though I am getting childData from just index 0 of Child.js, somehow childData iterates again and it becomes null, with the following error: Cannot read property 'getBoundingClientRect' of null
Here is my code
import React from "react";
import Child from "./Child";
import "./styles.css";
export default class App extends React.Component {
state = {
childDims: {
width: "",
heigth: ""
}
};
gettingDimsFromChildDataDiv = childData => {
const { height, width } = childData.getBoundingClientRect();
console.log(`height: ${height} & width: ${width}`);
this.setState(
({ childDims, ...restTop }) => ({
childDims: {
width,
height
},
...restTop
}), //It actually sets state once... But for some reason it iterates
//another time and childData becomes null...
() => console.log("setting state", this.state.childDims)
);
};
render() {
return (
<div className="App">
<Child liftContainerDimensions={this.gettingDimsFromChildDataDiv} />
</div>
);
}
}
import React from "react";
export default class Child extends React.Component {
state = {
dummyArray: [1, 2, 3, 4]
};
render() {
return (
<div>
{this.state.dummyArray.map((donkey, index) => {
let ref = null;
//I tried to restrict the number of instances sent up to App.js
// Hopping that it would make it possible to safely setState there
if (index === 0) {
ref = el =>
this.props.liftContainerDimensions((this.container = el));
}
return (
<div
key={donkey}
style={{ border: "1px solid red", margin: "5px" }}
ref={ref}
>
{donkey}
</div>
);
})}
</div>
);
}
}