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
useMemo
iuseCallback
. - Aprendre a utilitzar
useMemo
per memoritzar valors calculats. - Aprendre a utilitzar
useCallback
per 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.useMemo
nomé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.useMemo
memoritza el resultat deexpensiveCalculation(a, b)
i només el recalcula sia
ob
canvien.- El botó "Incrementar" actualitza el comptador sense recalcular el valor memoritzat, a menys que
a
ob
canviï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.useCallback
nomé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.useCallback
memoritza la funcióincrement
i només la recrea sicount
canvia.- El component
Button
rep la funcióincrement
com 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
useMemo
iuseCallback
. Si oblides alguna dependència, podries obtenir resultats inesperats. - Evita l'ús excessiu: No utilitzis
useMemo
iuseCallback
per 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