En aquest tema, explorarem diverses tècniques per optimitzar el rendiment de les aplicacions React. L'objectiu és assegurar-nos que les nostres aplicacions siguin ràpides i eficients, oferint una experiència d'usuari fluida.
- Evitar renderitzacions innecessàries
1.1. Utilitzar React.memo
React.memo
és una funció d'ordre superior que podem utilitzar per memoritzar components funcionals. Això significa que el component només es tornarà a renderitzar si les seves props
canvien.
import React from 'react'; const MyComponent = React.memo(({ name }) => { console.log('Renderitzant MyComponent'); return <div>Hola, {name}!</div>; }); export default MyComponent;
1.2. Implementar shouldComponentUpdate
en components de classe
Per als components de classe, podem utilitzar el mètode shouldComponentUpdate
per evitar renderitzacions innecessàries.
import React, { Component } from 'react'; class MyComponent extends Component { shouldComponentUpdate(nextProps) { return nextProps.name !== this.props.name; } render() { console.log('Renderitzant MyComponent'); return <div>Hola, {this.props.name}!</div>; } } export default MyComponent;
- Utilitzar
useMemo
i useCallback
useMemo
i useCallback
2.1. useMemo
useMemo
memoritza el valor retornat d'una funció de càlcul, evitant càlculs innecessaris en renderitzacions futures.
import React, { useMemo } from 'react'; const MyComponent = ({ items }) => { const sortedItems = useMemo(() => { console.log('Ordenant elements'); return items.sort(); }, [items]); return ( <ul> {sortedItems.map(item => ( <li key={item}>{item}</li> ))} </ul> ); }; export default MyComponent;
2.2. useCallback
useCallback
memoritza una funció, evitant que es recreï en cada renderització.
import React, { useCallback } from 'react'; const MyComponent = ({ onClick }) => { const handleClick = useCallback(() => { console.log('Botó clicat'); onClick(); }, [onClick]); return <button onClick={handleClick}>Clica'm</button>; }; export default MyComponent;
- Divisió de codi i càrrega mandrosa
3.1. React.lazy
i Suspense
Podem utilitzar React.lazy
per carregar components de manera mandrosa, només quan es necessiten. Suspense
ens permet mostrar un indicador de càrrega mentre el component es carrega.
import React, { Suspense } from 'react'; const LazyComponent = React.lazy(() => import('./LazyComponent')); const MyComponent = () => ( <div> <Suspense fallback={<div>Carregant...</div>}> <LazyComponent /> </Suspense> </div> ); export default MyComponent;
- Utilitzar
React.PureComponent
React.PureComponent
React.PureComponent
és una versió optimitzada de React.Component
que implementa un shouldComponentUpdate
superficial per a les props
i state
.
import React, { PureComponent } from 'react'; class MyComponent extends PureComponent { render() { console.log('Renderitzant MyComponent'); return <div>Hola, {this.props.name}!</div>; } } export default MyComponent;
- Evitar operacions costoses en el renderitzat
5.1. Descompondre components grans
Dividir components grans en components més petits i reutilitzables pot ajudar a millorar el rendiment.
5.2. Evitar càlculs costosos en el renderitzat
Evitar realitzar càlculs costosos directament en el mètode render
. Utilitzar useMemo
o moure els càlculs fora del renderitzat.
Exercicis pràctics
Exercici 1: Optimitzar un component amb React.memo
import React, { useState } from 'react'; const Counter = React.memo(({ count }) => { console.log('Renderitzant Counter'); return <div>Comptador: {count}</div>; }); const App = () => { const [count, setCount] = useState(0); return ( <div> <button onClick={() => setCount(count + 1)}>Incrementar</button> <Counter count={count} /> </div> ); }; export default App;
Exercici 2: Utilitzar useMemo
per optimitzar el càlcul d'una llista ordenada
import React, { useState, useMemo } from 'react'; const SortedList = ({ items }) => { const sortedItems = useMemo(() => { console.log('Ordenant elements'); return items.sort(); }, [items]); return ( <ul> {sortedItems.map(item => ( <li key={item}>{item}</li> ))} </ul> ); }; const App = () => { const [items, setItems] = useState(['banana', 'apple', 'orange']); return ( <div> <button onClick={() => setItems([...items, 'grape'])}>Afegir raïm</button> <SortedList items={items} /> </div> ); }; export default App;
Resum
En aquesta secció, hem après diverses tècniques per optimitzar el rendiment de les aplicacions React, incloent l'ús de React.memo
, shouldComponentUpdate
, useMemo
, useCallback
, React.lazy
, Suspense
, i React.PureComponent
. També hem vist com evitar operacions costoses en el renderitzat i com descompondre components grans en components més petits i reutilitzables. Aquestes tècniques ens ajudaran a crear aplicacions React més ràpides i eficients.
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