Introducció
En aquest tema, explorarem la memorització en React utilitzant React.memo
. La memorització és una tècnica d'optimització que permet evitar càlculs innecessaris emmagatzemant els resultats de funcions costoses i reutilitzant-los quan els mateixos inputs es tornen a utilitzar. React.memo
és una funció d'ordre superior que podem utilitzar per memoritzar components funcionals, evitant així renderitzacions innecessàries.
Objectius
- Comprendre què és la memorització i per què és útil.
- Aprendre a utilitzar
React.memo
per optimitzar components funcionals. - Veure exemples pràctics de com
React.memo
pot millorar el rendiment de les aplicacions React.
Què és la Memorització?
La memorització és una tècnica d'optimització que consisteix a emmagatzemar els resultats de funcions costoses i reutilitzar-los quan els mateixos inputs es tornen a utilitzar. Això pot ser especialment útil en aplicacions React per evitar renderitzacions innecessàries de components.
React.memo
React.memo
és una funció d'ordre superior que podem utilitzar per memoritzar components funcionals. Quan un component està embolicat amb React.memo
, React memoritza el resultat de la renderització i només torna a renderitzar el component si les seves props han canviat.
Sintaxi
Exemple Bàsic
Vegem un exemple bàsic per entendre com funciona React.memo
.
import React, { useState } from 'react'; const ChildComponent = React.memo(({ count }) => { console.log('ChildComponent render'); return <div>Count: {count}</div>; }); const ParentComponent = () => { const [count, setCount] = useState(0); const [text, setText] = useState(''); return ( <div> <button onClick={() => setCount(count + 1)}>Increment Count</button> <input type="text" value={text} onChange={(e) => setText(e.target.value)} /> <ChildComponent count={count} /> </div> ); }; export default ParentComponent;
En aquest exemple, ChildComponent
només es tornarà a renderitzar quan la prop count
canviï. Si només canviem el text de l'input, ChildComponent
no es tornarà a renderitzar gràcies a React.memo
.
Comparació de Props Personalitzada
Per defecte, React.memo
fa una comparació superficial de les props per determinar si el component s'ha de tornar a renderitzar. Si necessitem una comparació més complexa, podem proporcionar una funció de comparació personalitzada.
const ChildComponent = React.memo( ({ count, user }) => { console.log('ChildComponent render'); return ( <div> <div>Count: {count}</div> <div>User: {user.name}</div> </div> ); }, (prevProps, nextProps) => { return prevProps.count === nextProps.count && prevProps.user.id === nextProps.user.id; } );
En aquest exemple, ChildComponent
només es tornarà a renderitzar si count
o user.id
canvien.
Exercicis Pràctics
Exercici 1: Memoritzar un Component
- Crea un component funcional anomenat
ExpensiveComponent
que accepti una propvalue
i mostri el valor. - Utilitza
React.memo
per memoritzarExpensiveComponent
. - Crea un component pare que tingui un estat
value
i un botó per incrementarvalue
. - Afegeix un altre estat i un input per canviar aquest estat.
- Observa com
ExpensiveComponent
només es torna a renderitzar quanvalue
canvia.
Solució
import React, { useState } from 'react'; const ExpensiveComponent = React.memo(({ value }) => { console.log('ExpensiveComponent render'); return <div>Value: {value}</div>; }); const ParentComponent = () => { const [value, setValue] = useState(0); const [text, setText] = useState(''); return ( <div> <button onClick={() => setValue(value + 1)}>Increment Value</button> <input type="text" value={text} onChange={(e) => setText(e.target.value)} /> <ExpensiveComponent value={value} /> </div> ); }; export default ParentComponent;
Exercici 2: Comparació de Props Personalitzada
- Crea un component funcional anomenat
UserComponent
que accepti una propuser
i mostri el nom de l'usuari. - Utilitza
React.memo
per memoritzarUserComponent
amb una funció de comparació personalitzada que només torni a renderitzar el component siuser.id
canvia. - Crea un component pare que tingui un estat
user
i un botó per canviar el nom de l'usuari. - Observa com
UserComponent
només es torna a renderitzar quanuser.id
canvia.
Solució
import React, { useState } from 'react'; const UserComponent = React.memo( ({ user }) => { console.log('UserComponent render'); return <div>User: {user.name}</div>; }, (prevProps, nextProps) => { return prevProps.user.id === nextProps.user.id; } ); const ParentComponent = () => { const [user, setUser] = useState({ id: 1, name: 'John' }); return ( <div> <button onClick={() => setUser({ ...user, name: 'Jane' })}> Change Name </button> <UserComponent user={user} /> </div> ); }; export default ParentComponent;
Conclusió
En aquesta secció, hem après què és la memorització i com utilitzar React.memo
per optimitzar components funcionals en React. Hem vist exemples pràctics i hem realitzat exercicis per reforçar els conceptes apresos. La memorització és una tècnica poderosa per millorar el rendiment de les aplicacions React, especialment quan es treballa amb components costosos de renderitzar.
Curs de React
Mòdul 1: Introducció a React
- Què és React?
- Configuració de l'entorn de desenvolupament
- Hola Món en React
- JSX: Extensió de la sintaxi de JavaScript
Mòdul 2: Components de React
- Comprendre els components
- Components funcionals vs components de classe
- Props: Passar dades als components
- State: Gestionar l'estat del component
Mòdul 3: Treballar amb esdeveniments
- Gestionar esdeveniments en React
- Renderització condicional
- Llistes i claus
- Formularis i components controlats
Mòdul 4: Conceptes avançats de components
- Elevar l'estat
- Composició vs herència
- Mètodes del cicle de vida de React
- Hooks: Introducció i ús bàsic
Mòdul 5: Hooks de React
Mòdul 6: Enrutament en React
Mòdul 7: Gestió de l'estat
- Introducció a la gestió de l'estat
- API de context
- Redux: Introducció i configuració
- Redux: Accions i reductors
- Redux: Connexió amb React
Mòdul 8: Optimització del rendiment
- Tècniques d'optimització del rendiment de React
- Memorització amb React.memo
- Hooks useMemo i useCallback
- Divisió de codi i càrrega mandrosa
Mòdul 9: Proves en React
- Introducció a les proves
- Proves unitàries amb Jest
- Proves de components amb React Testing Library
- Proves de punta a punta amb Cypress
Mòdul 10: Temes avançats
- Renderització del costat del servidor (SSR) amb Next.js
- Generació de llocs estàtics (SSG) amb Next.js
- TypeScript amb React
- React Native: Construir aplicacions mòbils