Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why ReactJS components must act like pure functions?

the documentation says All React components must act like pure functions with respect to their props. https://facebook.github.io/react/docs/components-and-props.html, but does not explain the real reason behind it, why is that?

like image 327
nomadus Avatar asked Feb 01 '17 17:02

nomadus


People also ask

Why React components are pure functions?

A React component is considered pure if it renders the same output for the same state and props. For this type of class component, React provides the PureComponent base class. Class components that extend the React. PureComponent class are treated as pure components.

Why all React components must act like pure functions with respect to their props?

Props are Read-Only Such functions are called “pure” because they do not attempt to change their inputs, and always return the same result for the same inputs. React is pretty flexible but it has a single strict rule: All React components must act like pure functions with respect to their props.

Should React components be pure?

React's rendering process must always be pure. Components should only return their JSX, and not change any objects or variables that existed before rendering—that would make them impure!

What is a pure function in React JS?

In JavaScript, a function is considered pure if the return value is determined by its input values only and is always the same for the particular input values. The same concept can be applied to React components, therefore a React component is said to be pure if it renders the same output for the same input (props).


3 Answers

A React component should be pure, this means the result of its render method should depend solely on the props and the state, and for the same properties and state render should give the same result.

If render is not pure, it means it can return different results for the same input, so React cannot tell which parts of the DOM need to be updated based on the changes to the component. This is critical as the performance of React depends of this. Why? That's a bit complex.

It is amazing to define the UI based on a state, and have the UI re-render itselfs every time any part of the state changes. But you can imagine doing a complete re-render of the entire DOM every time you change something would be painfully slow. React solves this by checking the minimum ammount of changes needed o the DOM to reflect the new state. It knows what those changes are based on what properties and state each component receives, and can tell if it needs to update a component if any of its properties or state changed.

Take this tree as an example of a component hierarchy

State tree

Here we changed h to 8, so we also changed f because h is a child of f, and we also changed c because f is child of c and etcetera.

The key here is to think how React checks the component tree. It ill start at the root and see it changed. Then it'll check all the children and realize only c changed, so there is no need to check all the a and b branches. Then it'll check the c branch and realize only f changed so there is no need to check e and g. That operation is done on every component to calculate the minimum ammount of changes and also what needs to be updated.

If at any point you could mutate how a component is rendered it means React will need to check all of the branches and all of its children to know what changed because it can't rely on the state and the props to know when a branch changed and how. This would be painfully slow and make the whole React framework inviable.

like image 106
Marco Scabbiolo Avatar answered Sep 30 '22 08:09

Marco Scabbiolo


I would say because of tracking the component state changes. If it isn't pure, it would cause side-effects every time it is executed. That way, would be very hard to know what has changed and furthermore how to react to these changes.

Pure functions, in other way, have the same output with the same input. Making it a lot easier to manage properties and track when something has changed, resulting a easier and predictable way to react to the change.

like image 42
Diego Faria Avatar answered Sep 30 '22 07:09

Diego Faria


If they weren't pure functions in relation to their props then it would be violating the entire heirarchy/delegation structure that react provides and relies on.

Lets say you have two components, component A and Component B, and Component A is the parent to Component B. Component A has its own state based on some sort of data. When you pass a part of its state down as a prop to component B, you are establishing a contract between the two components that component B will delegate to component A to get the value of said prop.

This is in a sense a contract between the two components and the only way the contract isn't violated is that component B doesn't directly alter or change the passed down prop. That is what being a pure function means, that it doesn't mutate the prop directly. Of course you can clone the prop and then change it however you want that isn't a breaking of contract since at that point they aren't referencing the same values. But if you do mutate props directly you will also be mutating the parent component value. This can cause unintended side effects as well as cause issues with the react shadow dom differencing algorithm.

Here is that explained from the official react docs

https://facebook.github.io/react/blog/2015/02/24/streamlining-react-elements.html#problem-mutating-props-you-dont-own

like image 27
finalfreq Avatar answered Sep 30 '22 09:09

finalfreq