I recently saw the following tweet from @_georgemoller which posed an interesting question related to component re-rendering in React:
// Det...
For further actions, you may consider blocking this person and/or reporting abuse
This isn't entirely true because React compares each child and bails out of re-rendering if a child is strictly equal.
That is actually not true as you can see in the examples. This behavior can be prevented though either by using memoization or the
shouldComponentUpdate
method (assuming the state can't be moved to another component of course).The
shouldComponentUpdate
method returnstrue
by default. This is why the default behavior of React is to re-render all child components on state change.Not true, huh?
I've provided an example code, have you even checked it? Does
SomeComponent
re-renders when you click the button? So annoying...I stand corrected. But can I ask, why are you re-assigning the component to a variable and then using that variable to render the component? Because this seems to be why
SomeComponent
is not re-rendering.It does re-render when you plug it in directly with
<SomeComponent />
even though its still not changing whencount
updates.I'm not re-assigning anything.
someComponent
is a React element and<SomeComponent/>
is a function call that returns a React element. These are two different things from JavaScript standpoint.If you have
A = () => ({})
thenA() !== A()
but whena = A()
thena === a
. That's the gist of it.Thanks for this post, really helpful.
Appreciate your feedback.
This is not true i think. I believe you are talking about 're evaluation' and not 're rendering'. Here the SomeComponent is indeed re evaluated as mentioned in the post,but it is not re rendered, as React sees no new changes to the element that requires a DOM update.
Great post!
And we also can use React.memo() for prevent unnecessary rerenders.
Absolutely. But you'd have to memoize every child component. In the case where the state lives in the root component (like in the original question), you'll have to memoize every component of the app! 😄