This is a recurring problem I have with React. The componentDidMount
method is guaranteed to be fired when the component is rendered for the first time so it seems like a natural place to take DOM measurements like heights and offsets. However, many times I receive wrong style readings at this point of the component's lifecycle. The component is in the DOM, when I break with the debugger, but it's not yet painted on the screen. I get this problem with elements that have width/height set to 100% mostly. When I take measurements in componentDidUpdate
- everything works fine, but this method will not fire at the initial render of the component.
So my question is - when exactly is componentDidMount
fired because it's obviously not fired after all the browser paints are done.
EDIT: This Stackoverflow issue deals with the same subject:
It also references this github conversation that explains what happens
componentDidMount() only runs once after the first render. componentDidMount() may be called multiple times if the key prop value for the component changes. componentDidMount method is used for handling all network requests and setting up subscriptions during the mounting phase.
The componentDidMount() method allows us to execute the React code when the component is already placed in the DOM (Document Object Model). This method is called during the Mounting phase of the React Life-cycle i.e after the component is rendered.
Render JavaScript with Initial Render The componentDidMount() method will be triggered as soon as the component is mounted or inserted into the DOM. The basic syntax to use componentDidMount() is looks like this. This method used widely by developers because it loads immediately once the component is mounted.
componentDidMount. Similarily to the method above, componentDidMount is also only called once, but immediately after the render() method has taken place.
Inside a react component tree, componentDidMount()
is fired after all children components have also been mounted. This means, that any component's componentDidMount()
is fired before its parent has been mounted.
So if you want to measure DOM position and sizes etc, using componentDidMount()
of a child component is an unsafe place/ time to do this.
In your case: to get accurate reading from 100% width/height components, a safe place to take such measurements would be inside the componentDidMount()
of the top react component.
100% is a width/height relative to the parent/ container. So measurements can only be taken after the parent has been mounted too.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With