Here we use a shallow comparison to determine if the props of the component have changed. If so, the component should update.
React.PureComponent
This is a React component that implements shouldComponentUpdate() and only diffs and updates when it returns true. Any child of PureComponent must also be a PureComponent.
Other hooks
useReducer
This is an alternative to useState. Accepts a reducer of type (state, action) => newState, and returns the current state paired with a dispatch method.
Cases to use useReducer over useState:
Complex state logic that involves multiple sub-values
The dispatch function identity is stable and won't change on re-renders.
useCallback
This returns a memoized callback that only changes if one of the dependencies has changed. This is useful when passing callbacks to optimized child components that rely on reference equality to prevent unnecessary renders (e.g. shouldComponentUpdate).
useCallback(fn, deps) is equivalent to useMemo(() => fn, deps).
Not Mutating Data
Code examples
Consider this example:
This example creates a bug and "world" is not actually displayed
To solve this problem, we should avoid mutating values that we are using as props or state.
One solution using concat can be:
Or we can use the spread operator in ES6:
For objects, we can also write code to avoid mutating objects. This is the way in which we mutate an object:
However, we can avoid mutating the original object using Object.assign in ES6:
Or, we can use the spread operator for objects from ES2018: