I've been reading these links:
https://reactjs.org/docs/hooks-faq.html#how-do-i-implement-shouldcomponentupdate
https://reactjs.org/blog/2018/10/23/react-v-16-6.html
In the first link it says (https://reactjs.org/docs/hooks-faq.html#from-classes-to-hooks):
shouldComponentUpdate: See React.memo
The second link also states that:
Class components can bail out from rendering when their input props are the same using PureComponent or shouldComponentUpdate. Now you can do the same with function components by wrapping them in React.memo.
What is desired:
I want Modal to render only when the Modal is visible (managed by this.props.show)
For class component:
shouldComponentUpdate(nextProps, nextState) { return nextProps.show !== this.props.show; }
How can I use memo
instead in a functional component - here, in Modal.jsx?
The related code:
Functional component Modal.jsx (I don't know how to check for props.show)
import React, { useEffect } from 'react'; import styles from './Modal.module.css'; import BackDrop from '../BackDrop/BackDrop'; const Modal = React.memo(props => { useEffect(() => console.log('it did update')); return ( <React.Fragment> <BackDrop show={props.show} clicked={props.modalClosed} /> <div className={styles.Modal} style={{ transform: props.show ? 'translateY(0)' : 'translateY(-100vh)', opacity: props.show ? '1' : '0' }}> {props.children} </div> </React.Fragment> ); }); export default Modal;
The part of class component PizzaMaker jsx that renders Modal:
return ( <React.Fragment> <Modal show={this.state.purchasing} modalClosed={this.purchaseCancel}> <OrderSummary ingredients={this.state.ingredients} purchaseCancelled={this.purchaseCancel} purchaseContinued={this.purchaseContinue} price={this.state.totalPrice} /> </Modal> ... </React.Fragment> );
Use shouldComponentUpdate() to let React know if a component's output is not affected by the current change in state or props. The default behavior is to re-render on every state change, and in the vast majority of cases you should rely on the default behavior.
shouldComponentUpdate() is used if a component's output is affected by the current change in state or props. The default behaviour is to re-render on every state change. For imitating the functionality of shouldComponentUpdate, we should pass the values in the array through which the component's output gets affected.
The React useMemo Hook returns a memoized value. Think of memoization as caching a value so that it does not need to be recalculated. The useMemo Hook only runs when one of its dependencies update. This can improve performance.
Here is the documentation for React.memo
You can pass a function to control the comparison :
const Modal = React.memo( props => {...}, (prevProps, nextProps) => prevProps.show === nextProps.show );
when the function returns true
, the component will not be re-rendered
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With