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.memoper optimitzar components funcionals. - Veure exemples pràctics de com
React.memopot 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
ExpensiveComponentque accepti una propvaluei mostri el valor. - Utilitza
React.memoper memoritzarExpensiveComponent. - Crea un component pare que tingui un estat
valuei un botó per incrementarvalue. - Afegeix un altre estat i un input per canviar aquest estat.
- Observa com
ExpensiveComponentnomés es torna a renderitzar quanvaluecanvia.
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
UserComponentque accepti una propuseri mostri el nom de l'usuari. - Utilitza
React.memoper memoritzarUserComponentamb una funció de comparació personalitzada que només torni a renderitzar el component siuser.idcanvia. - Crea un component pare que tingui un estat
useri un botó per canviar el nom de l'usuari. - Observa com
UserComponentnomés es torna a renderitzar quanuser.idcanvia.
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
