Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Will a stateless component re-render if its props have not changed?

Tags:

reactjs

One thing I had learned about React is that if the props to a component don’t change, then React doesn’t bother re-rendering the component. Is that true for stateless components too? Or do they behave more like “stupid” functions and get executed every time?

For example, if I had:

import StatelessComponent from '../StatelessComponent';  export default class DocumentsTable extends React.Component {   state = {     something: 'foobar',   };    render() {     return (       <div>         { this.state.something }         <StatelessComponent theOnlyProp='baz'>       </div>     )   } }; 

When this.state.something updates its value, does <StatelessComponent> get re-rendered? Or is it “smart” enough to see that its props didn’t change, like other React components?

like image 499
user3812429 Avatar asked Oct 13 '17 19:10

user3812429


People also ask

Do components re-render when props change?

React components automatically re-render whenever there is a change in their state or props. A simple update of the state, from anywhere in the code, causes all the User Interface (UI) elements to be re-rendered automatically.

How do you prevent re rendering of components that have not changed?

Preventing Re-Renders: The Old Way To prevent the render method from being called, set the return to false, which cancels the render. This method gets called before the component gets rendered. Sometimes you may want to prevent re-render even if a component's state or prop has changed.

Why is my React component not re rendering?

If React fails to do re-render components automatically, it's likely that an underlying issue in your project is preventing the components from updating correctly.

Which feature can we use to cause a component to render without state change?

Calling forceUpdate() will cause render() to be called on the component, skipping shouldComponentUpdate() .


2 Answers

UPDATE 25.10.2018

Since React 16.6, you can use React.memo for functional components to prevent re-render, similarly to PureComponent for class components:

const MyComponent = React.memo((props) => {   return (     /* markup */   ); }); 

Also, memo does internal optimization.

And unlike a userland memo() higher-order component implementation, the one built into React can be more efficient by avoiding an extra component layer. Blockquote


OLD ANSWER

Yes, they always re-render 1 (unless you use React.memo as explained above) if setState() is called in the component itself or one of its parents, because functional stateless components don't carry a shouldComponentUpdate. In fact, each React component is being re-rendered1 unless they implement shouldComponentUpdate.


Important to note is that calling render() doesn't mean that DOM Nodes are being manipulated in any way. The render method just serves the diff algorithm to decide which DOM Nodes need to really be attached / detached. Note that render() is not expensive, it's the DOM manipulations that are expensive. They are executed only if render() returns different virtual trees.

From React's documentation

Just to be clear, rerender in this context means calling render for all components, it doesn’t mean React will unmount and remount them. It will only apply the differences following the rules stated in the previous sections.

Just don't worry and let render() be called unless your component is huge, then you're better off with stateful Component that implements shouldComponentUpdate().

Look here for an interesting discussion.

1 means that render() function of the component is called, not that the underlying DOM node is being manipulated.

like image 119
Lyubomir Avatar answered Sep 18 '22 06:09

Lyubomir


See react does not only rerenders only If props are changed it even rerenders itself if any state change is there. In your case the component will rerender as your state is changing. The way react works is based on an algorithm named Reconciliation, what this algorithm does is that it compares your virtual DOM with real DOM and if it sees any change then it rerender your actual DOM by replacing it with your virtual DOM so any change in state will cause rerendering of the whole component.

like image 38
Aniruddh Agarwal Avatar answered Sep 17 '22 06:09

Aniruddh Agarwal