En aquest tema, explorarem dos hooks avançats de React: useMemo i useCallback. Aquests hooks són essencials per optimitzar el rendiment de les aplicacions React, ja que ajuden a evitar càlculs innecessaris i a memoritzar funcions.
Objectius d'aprenentatge
- Comprendre la necessitat de
useMemoiuseCallback. - Aprendre a utilitzar
useMemoper memoritzar valors calculats. - Aprendre a utilitzar
useCallbackper memoritzar funcions. - Identificar situacions on aquests hooks poden millorar el rendiment de l'aplicació.
useMemo
Què és useMemo?
El hook useMemo és utilitzat per memoritzar el resultat d'una funció de càlcul costosa i només recalcular-lo quan les dependències específiques canvien. Això pot ajudar a evitar càlculs innecessaris en cada renderització.
Sintaxi
computeExpensiveValueés la funció de càlcul costosa.[a, b]són les dependències.useMemonomés tornarà a calcular el valor si alguna d'aquestes dependències canvia.
Exemple pràctic
import React, { useState, useMemo } from 'react';
function ExpensiveCalculationComponent({ a, b }) {
const [count, setCount] = useState(0);
const expensiveCalculation = (a, b) => {
console.log('Calculant...');
return a + b;
};
const memoizedValue = useMemo(() => expensiveCalculation(a, b), [a, b]);
return (
<div>
<p>Resultat de la càlcul: {memoizedValue}</p>
<button onClick={() => setCount(count + 1)}>Incrementar</button>
<p>Comptador: {count}</p>
</div>
);
}
export default ExpensiveCalculationComponent;Explicació
expensiveCalculationés una funció que simula un càlcul costós.useMemomemoritza el resultat deexpensiveCalculation(a, b)i només el recalcula siaobcanvien.- El botó "Incrementar" actualitza el comptador sense recalcular el valor memoritzat, a menys que
aobcanviïn.
useCallback
Què és useCallback?
El hook useCallback és utilitzat per memoritzar funcions. Això és útil quan passes funcions a components fills que es renderitzen condicionalment o quan vols evitar la recreació de funcions en cada renderització.
Sintaxi
doSomethingés la funció que vols memoritzar.[a, b]són les dependències.useCallbacknomés tornarà a crear la funció si alguna d'aquestes dependències canvia.
Exemple pràctic
import React, { useState, useCallback } from 'react';
function Button({ handleClick }) {
return <button onClick={handleClick}>Clica'm</button>;
}
function ParentComponent() {
const [count, setCount] = useState(0);
const increment = useCallback(() => {
setCount(count + 1);
}, [count]);
return (
<div>
<p>Comptador: {count}</p>
<Button handleClick={increment} />
</div>
);
}
export default ParentComponent;Explicació
incrementés una funció que incrementa el comptador.useCallbackmemoritza la funcióincrementi només la recrea sicountcanvia.- El component
Buttonrep la funcióincrementcom a prop, evitant la recreació innecessària de la funció en cada renderització del component pare.
Exercicis pràctics
Exercici 1: Utilitzar useMemo
Crea un component que calculi la suma de dos nombres només quan aquests canvien, utilitzant useMemo.
import React, { useState, useMemo } from 'react';
function SumComponent() {
const [num1, setNum1] = useState(0);
const [num2, setNum2] = useState(0);
const sum = useMemo(() => {
console.log('Calculant suma...');
return num1 + num2;
}, [num1, num2]);
return (
<div>
<input type="number" value={num1} onChange={(e) => setNum1(Number(e.target.value))} />
<input type="number" value={num2} onChange={(e) => setNum2(Number(e.target.value))} />
<p>Suma: {sum}</p>
</div>
);
}
export default SumComponent;Exercici 2: Utilitzar useCallback
Crea un component que incrementi un comptador només quan es clica un botó, utilitzant useCallback.
import React, { useState, useCallback } from 'react';
function IncrementButton({ onIncrement }) {
return <button onClick={onIncrement}>Incrementar</button>;
}
function CounterComponent() {
const [count, setCount] = useState(0);
const increment = useCallback(() => {
setCount(count + 1);
}, [count]);
return (
<div>
<p>Comptador: {count}</p>
<IncrementButton onIncrement={increment} />
</div>
);
}
export default CounterComponent;Errors comuns i consells
- No oblidis les dependències: Assegura't d'incloure totes les dependències necessàries en els arrays de dependències de
useMemoiuseCallback. Si oblides alguna dependència, podries obtenir resultats inesperats. - Evita l'ús excessiu: No utilitzis
useMemoiuseCallbackper a tot. Utilitza'ls només quan hi hagi un benefici clar en termes de rendiment. - Depuració: Utilitza eines com React DevTools per verificar si els components es renderitzen innecessàriament.
Conclusió
Els hooks useMemo i useCallback són eines poderoses per optimitzar el rendiment de les aplicacions React. Utilitzant-los correctament, pots evitar càlculs innecessaris i memoritzar funcions, millorant així l'eficiència de la teva aplicació. Practica amb els exercicis proporcionats per consolidar els teus coneixements i estar preparat per aplicar aquests conceptes en projectes reals.
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
