Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is setState() inside componentDidMount() considered an anti-pattern

Tags:

reactjs

I've just had a look at this discussion about setState() inside componentDidMount().

You can see that after the render() function, the componentDidMount() function will be called by React. When you put a setState() call in componentDidMount() then you are causing the entire component tree be re-rendered not only the current component - not to forget, the current component did just finished with rendering.

And some people suggested to put setState() call inside componentWillMount(). In some cases, I want to get the height of a rendered element and store it as state, and the above method wouldn't work. I also had a look at the React official website, and it suggests to do Ajax call inside componentDidMount(), which again goes against the above idea.

So, am I wrong about putting setState() inside componentDidMount()? If yes, what should I apply as an alternative?

like image 429
WebDeg Brian Avatar asked Sep 04 '18 13:09

WebDeg Brian


Video Answer


2 Answers

You may call setState() immediately in componentDidMount(). It will trigger an extra rendering, but it will happen before the browser updates the screen. This guarantees that even though the render() will be called twice in this case, the user won’t see the intermediate state. Use this pattern with caution because it often causes performance issues. In most cases, you should be able to assign the initial state in the constructor() instead. It can, however, be necessary for cases like modals and tooltips when you need to measure a DOM node before rendering something that depends on its size or position.

React docs

Using DidMount makes it clear that data won’t be loaded until after the initial render. This reminds you to set up initial state properly, so you don’t end up with undefined state that causes errors.

Example

TLDR: - If you have all needed data in constructor - assign state there

constructor(props) {
  super(props);
  // Don't call this.setState() here!
  this.state = { counter: 0 };
}
  • Call async action, touch DOM in componentDidMount()
like image 56
Buggy Avatar answered Oct 27 '22 12:10

Buggy


Your case with unknowing the height of a rendered element might be a valid excuse to use setState inside componentDidMount. However in such a case I would definitely add another lifecycle method,shouldComponentUpdate, to control the rerender issue.

like image 29
milkersarac Avatar answered Oct 27 '22 12:10

milkersarac