Introduction
Le rendu React est au cœur de la performance des applications web modernes. En 2026, avec des bundles de plus en plus complexes, optimiser le rendu permet d'éviter les re-rendus inutiles et d'améliorer l'expérience utilisateur. Ce tutoriel vous guide à travers les techniques avancées comme la mémorisation et les hooks de performance. Vous apprendrez à diagnostiquer les problèmes de rendu et à appliquer des solutions concrètes. Chaque exemple est conçu pour être directement applicable dans vos projets.
Prérequis
- Node.js 20+ et React 18+
- Connaissances solides en TypeScript et hooks React
- Un éditeur comme VS Code avec ESLint
Initialisation du projet
npx create-vite@latest react-render-2026 --template react-ts
cd react-render-2026
npm installCette commande crée un projet Vite avec TypeScript, idéal pour tester les optimisations de rendu rapidement.
Composant de base sans optimisation
import React, { useState } from 'react';
interface Product {
id: number;
name: string;
price: number;
}
const ProductList: React.FC = () => {
const [products] = useState<Product[]>([
{ id: 1, name: 'Laptop', price: 999 },
{ id: 2, name: 'Phone', price: 599 }
]);
const [filter, setFilter] = useState('');
const filteredProducts = products.filter(p =>
p.name.toLowerCase().includes(filter.toLowerCase())
);
return (
<div>
<input
type="text"
value={filter}
onChange={(e) => setFilter(e.target.value)}
/>
{filteredProducts.map(product => (
<div key={product.id}>{product.name} - {product.price}€</div>
))}
</div>
);
};
export default ProductList;Ce composant se re-rend entièrement à chaque frappe clavier, même si les produits n'ont pas changé. C'est un cas classique de rendu inefficace.
Application de React.memo
import React from 'react';
interface ProductItemProps {
name: string;
price: number;
}
const ProductItem: React.FC<ProductItemProps> = ({ name, price }) => {
console.log('Rendu ProductItem:', name);
return <div>{name} - {price}€</div>;
};
export default React.memo(ProductItem);React.memo empêche le re-rendu du composant si ses props n'ont pas changé. Ajoutez-le aux composants enfants pour réduire les calculs inutiles.
Utilisation de useMemo pour les calculs
import React, { useState, useMemo } from 'react';
import ProductItem from './ProductItem';
// ... interface Product inchangée
const ProductList: React.FC = () => {
const [products] = useState<Product[]>([/* ... */]);
const [filter, setFilter] = useState('');
const filteredProducts = useMemo(() =>
products.filter(p =>
p.name.toLowerCase().includes(filter.toLowerCase())
), [products, filter]
);
return (
<div>
<input type="text" value={filter} onChange={(e) => setFilter(e.target.value)} />
{filteredProducts.map(product => (
<ProductItem key={product.id} name={product.name} price={product.price} />
))}
</div>
);
};
export default ProductList;useMemo mémorise le résultat du filtrage. Le tableau de dépendances garantit que le calcul ne s'exécute que lorsque products ou filter changent.
Hook personnalisé pour le rendu
import { useRef, useEffect } from 'react';
export function useRenderCount(componentName: string) {
const count = useRef(0);
useEffect(() => {
count.current += 1;
console.log(`${componentName} a rendu ${count.current} fois`);
});
return count.current;
}Ce hook permet de tracker le nombre de rendus pendant le développement pour identifier les composants problématiques.
Intégration finale du hook
import { useRenderCount } from '../hooks/useRenderCount';
// Dans le composant ProductList
const ProductList: React.FC = () => {
useRenderCount('ProductList');
// ... reste du code
};Intégrez le hook dans vos composants pour mesurer l'impact de vos optimisations de rendu en temps réel.
Bonnes pratiques
- Utilisez React.memo uniquement sur les composants purs avec des props stables
- Combinez useMemo et useCallback pour éviter les nouvelles références
- Préférez les clés uniques et stables dans les listes
- Mesurez les performances avec React DevTools avant d'optimiser
- Évitez la mémorisation prématurée qui complexifie le code inutilement
Erreurs courantes à éviter
- Oublier les dépendances dans les tableaux useMemo/useEffect
- Appliquer React.memo sur des composants qui reçoivent des objets inline créés à chaque rendu
- Ignorer les warnings de React sur les clés manquantes
- Optimiser sans profiler d'abord les vrais goulots d'étranglement
Pour aller plus loin
Approfondissez ces concepts avec nos formations React avancées.