Explication de la rendu React : mises à jour de l’état vers les pixels de l’écran
Comment les phases de rendu, de réconciliation et d’application de React se connectent au rendu du navigateur : mise en page, peinture et composition, d’une mise à jour d’état aux pixels réels de l’écran.
Sources: Rendering Lifecycle in React: From State Update to Pixels on the Screen
Lorsque l’on travaille avec React, on entend souvent l’expression « le composant a été rérendu ». Mais qu’est-ce que le rendu signifie réellement en arrière-plan ?
Plusieurs questions naturelles se posent alors. React envoie-t-il des mises à jour au DOM dès que l’état change ? Un changement d’état force-t-il chaque composant à être rérendu ? Et lorsque React rérend une élément, cela signifie-t-il que le navigateur redessine immédiatement toute la page ? Il s’avère que rien de tout cela n’est vrai.
Pour vraiment comprendre le cycle de vie du rendu, il faut saisir deux systèmes distincts qui fonctionnent ensemble :
Le cycle de vie de rendu propre à React, et le pipeline de rendu du navigateur.
Dès que vous comprenez comment ces deux systèmes sont connectés, des concepts tels que la réconciliation, la phase d’inscription, useEffect, useLayoutEffect, le re-rendering et la mémorisation cessent de sembler magiques pour devenir logiques.
1. La vue d’ensemble
À un niveau général, le flux est le suivant :
User Interaction
│
▼
State / Props Change
│
▼
┌──────────────────────┐
│ React Render │
│ │
│ Component executes │
│ New UI is returned │
└──────────┬───────────┘
│
▼
Reconciliation
│
▼
┌──────────────────────┐
│ Commit Phase │
│ │
│ Update real DOM │
└──────────┬───────────┘
│
▼
┌──────────────────────────┐
│ Browser Rendering │
│ │
│ Style → Layout → Paint │
│ → Composite │
└────────────┬─────────────┘
│
▼
Screen
Le point essentiel à retenir est le suivant :
React détermine à quoi doit ressembler l’interface utilisateur et quels changements dans le DOM sont nécessaires. Le navigateur prend ensuite ces modifications du DOM et les transforme en pixels réels à l’écran.
2. Que signifie « Rendering » ?
Le terme rendering est utilisé dans plusieurs sens.
Dans le contexte de React, rendering signifie généralement ceci :
React appelle la fonction de votre composant et détermine à quoi doit ressembler l’interface utilisateur résultante.
Considérez ce composant :
function Counter() {
const [count, setCount] = useState(0);
return (
<button>
Count: {count}
</button>
);
}
Lorsque React le rend, le corps de la fonction s’exécute :
Counter()
↓
returns React element
↓
<button>Count: 0</button>
Cela ne signifie pas pour autant que le navigateur a déjà affiché le bouton à l’écran.
Au préalable de tout élément visuel, React doit encore déterminer si le DOM réel a vraiment besoin d’être modifié.
En bref :
React Render
≠
DOM Update
≠
Browser Paint
Le rendu et la mise à jour du DOM sont deux opérations distinctes.
3. Cycle de rendu du navigateur
Imaginons que vous ayez ce markup :
<h1 class="title">
Hello World
</h1>
Accompagné de cette feuille de style :
.title {
color: red;
font-size: 30px;
}
Avant que ce contenu ne soit affiché visuellement, le navigateur effectue une série d’étapes internes.
Une version simplifiée de ce processus se présente comme suit :
HTML
↓
DOM
↓
CSS
↓
CSSOM
↓
Render Tree
↓
Layout
↓
Paint
↓
Composite
↓
Screen
Examinons chaque étape en détail.
4. HTML → DOM
Le navigateur lit l’HTML et crée le DOM, pour Document Object Model.
Avec ce marquage :
<body>
<h1>Hello World</h1>
<p>Welcome</p>
</body>
Le navigateur construit une structure en arbre à peu près comme ceci :
Document
│
└── body
├── h1
│ └── "Hello World"
│
└── p
└── "Welcome"
JavaScript peut alors interroger et manipuler directement cette structure :
document.querySelector("h1");
En essence, le DOM répond à une seule question :
Quels éléments existent sur la page ?
5. CSS → CSSOM
En plus du DOM, le navigateur analyse également votre CSS et crée le CSSOM, ou CSS Object Model.
Par exemple :
h1 {
color: red;
font-size: 30px;
}
À partir de cela, le navigateur détermine quels styles s’appliquent à quels éléments.
Conceptuellement, c’est représenté comme suit :
h1
├── color: red
└── font-size: 30px
Le CSSOM répond à une question différente :
Comment chaque élément doit-il être stylisé visuellement ?
6. DOM + CSSOM → Arbre de rendu
Ensuite, le navigateur fusionne le DOM et le CSSOM pour créer un arbre de rendu.
Il y a une subtilité à noter :
Tous les nœuds du DOM ne sont pas représentés dans l’arbre de rendu.
Prenons par exemple ce markup :
<div class="hidden">
Hello
</div>
En combinaison avec cette règle :
.hidden {
display: none;
}
L’élément div est présent dans le DOM :
DOM
└── div
Mais comme il contient :
display: none;
il est complètement exclu de l’arbre de rendu visuel.
7. Mise en page
Lorsque le navigateur sait exactement quels éléments doivent être affichés, il détermine leur géométrie.
Cela implique le calcul de éléments tels que :
- Largeur
- Hauteur
- Position
- Marges
- Espace interne
- Coordonnées
- La relation spatiale entre les éléments
Prenons cette règle comme exemple :
.box {
width: 200px;
height: 100px;
margin-left: 50px;
}
Le navigateur doit produire des valeurs concrètes de ce type :
x = 50px
y = ...
width = 200px
height = 100px
Cette étape de calcul est appelée Layout, et elle est également souvent désignée sous le nom de Reflow.
8. Paint
Lorsque le layout est terminé, le navigateur dispose des coordonnées de chaque élément visible.
L’étape suivante consiste à dessiner l’apparence réelle de ces éléments.
Considérez ce style :
.box {
background: blue;
color: white;
border: 2px solid black;
}
Le processus de Paint comprend des éléments tels que :
- Arrière-plan
- Texte
- Bordures
- Ombres
- Images
- Autres éléments visuels
En séquence :
Layout
↓
Paint
↓
Pixels
9. Composite
Les navigateurs actuels peuvent diviser une page en plusieurs couches distinctes.
Par exemple :
Layer 1 → Page background
Layer 2 → Header
Layer 3 → Content
Layer 4 → Modal
Le composant du navigateur fusionne ensuite toutes ces couches en une seule image qui apparaît à l’écran.
Certaines propriétés CSS, comme :
transform
opacity
Il est généralement possible de l’animer uniquement par composition, en évitant ainsi le travail de mise en page plus complexe requis par les propriétés affectant la géométrie.
C’est en partie pour cette raison que l’animation de transform est souvent la méthode préférée.
10. Cycle de rendu de React
Puisque le côté navigateur a été abordé, examinons maintenant la manière dont React gère le rendu.
1. Trigger
2. Render
3. Reconciliation
4. Commit
5. Browser Rendering
Examinons chacune d’elles.
11. Phase 1 — Déclencheur
Au préalable, React a besoin d’un signal indiquant :
"L’interface utilisateur pourrait nécessiter une mise à jour."
Ce signal est appelé déclencheur de rendu.
Les déclencheurs typiques incluent :
1. Mise à jour de l’état : setCount(10);
2. Modification des props : <Child count={count} />
Lorsqu’un composant parent se rérend avec une nouvelle valeur pour count, ses enfants peuvent ainsi recevoir de nouvelles propriétés.
3. Mise à jour du contexte : useContext(MyContext);
Chaque fois que la valeur lue dans le contexte change, les composants qui l’utilisent peuvent avoir besoin d’être mis à jour.
4. Mise à jour d’un stock externe : Les bibliothèques et les API peuvent également déclencher des mises à jour de React.
Les exemples incluent :
Redux
Zustand
useSyncExternalStore
Le montage d’une application pour la première fois compte également comme un déclencheur.
12. Phase 2 — Rendu
Dès que React détecte une mise à jour, il passe à la phase de rendu, où il exécute les composants afin de déterminer la nouvelle interface utilisateur.
Prenons cet exemple :
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(c => c + 1)}>
Count: {count}
</button>
);
}
Au début, count vaut 0. React appelle Counter() et produit :
<button>
Count: 0
</button>
Lorsque le bouton est cliqué et que ce code s’exécute :
setCount(c => c + 1);
count devient 1, et React réexécute le composant, ce qui donne :
<button>
Count: 1
</button>
13. Important : Le rendu ne signifie pas à proprement parler une mise à jour du DOM
C’est une distinction cruciale dans le modèle de React.
Lorsque React exécute cette fonction :
function Counter() {
console.log("Counter rendered");
return <button>Count: 1</button>;
}
il se contente de calculer à quoi l’interface utilisateur devrait ressembler. Cela ne signifie pas automatiquement que le DOM a changé ou que le navigateur a redessiné quoi que ce soit.
La véritable séquence est la suivante :
Component executes
↓
React creates new element representation
↓
Reconciliation
↓
Determine required DOM changes
↓
Commit changes
Cela mène à une règle fondamentale :
Rendre un composant ne se traduit pas automatiquement par une mise à jour du DOM.
14. Phase 3 — Réconciliation
À ce stade, React compare l’interface utilisateur ancienne et la nouvelle pour déterminer précisément ce qui a changé.
Disons que l’arborescence précédente ressemblait à :
button
└── "Count: 0"
Et que l’arborescence nouvelle ressemble à :
button
└── "Count: 1"
React peut déterminer :
button → same
text → changed
Il n’a donc besoin de modifier que la partie du DOM qui a réellement changé :
button.textContent = "Count: 1";
L’objectif principal est d’éviter de démanteler et de reconstruire tout l’arbre DOM lorsque seules de petites parties ont changé.
15. Clés et réconciliation
Les clés sont particulièrement importantes lorsque React traite des listes.
Par exemple :
items.map(item => (
<li key={item.id}>
{item.name}
</li>
))
React s’appuie sur les clés pour suivre quel élément correspond à quoi entre différentes rendus. Supposons que vous commenciez avec :
Before:
A
B
C
et que vous arriviez à :
After:
A
C
Avec des clés stables, React peut inférer correctement :
A → same
B → removed
C → same
Cela fournit à React des informations bien plus fiables sur lesquelles s’appuyer lors de la réconciliation.
Évitez de vous fier aux indices d’array en tant que clés lorsque les éléments de liste pourraient être réordonnés, ajoutés ou supprimés.
16. Phase 4 — Validation
Lorsque React a déterminé ce qui doit être modifié, il passe à la phase d’application, où ces modifications sont réellement appliquées au DOM réel.
Imaginez un élément bouton dont l’étiquette passe d’une valeur zéro à une valeur un une fois cette phase terminée.
À ce stade, l’arbre interne de React et le DOM en temps réel coïncident enfin.
La phase d’application est une étape distincte de la phase de rendu :
Render Phase
↓
Calculate what should change
Commit Phase
↓
Actually apply DOM changes
17. Phase de rendu vs phase d’application
Comprendre cette distinction fait partie des sujets les plus fréquemment abordés lors des entretiens.
Phase de rendu
Pendant cette phase, React :
- Exécute les fonctions des composants
- Détermine la prochaine version de l’interface utilisateur
- Effectue la réconciliation
- Découvre ce qui doit être modifié
Component
↓
React elements
↓
Reconciliation
Phase d’application
Pendant cette phase, React :
- Applique les mutations réelles du DOM
- Mise à jour de tous les référentiels
- Exécution des effets de mise en page liés à cette mise à jour
React result
↓
Real DOM
Voici une représentation simplifiée du flux :
React
│
▼
┌──────────────┐
│ Render Phase │
└──────┬───────┘
│
▼
┌───────────────┐
│ Commit Phase │
└──────┬────────┘
│
▼
Real DOM
18. Que se passe-t-il après l’envoi du commit ?
Lorsque la phase d’envoi du commit est terminée, le navigateur prend le relais et constate que le DOM a changé.
En fonction de ce qui a changé, le navigateur peut devoir effectuer plusieurs étapes :
DOM Changes
↓
Style Calculation
↓
Layout
↓
Paint
↓
Composite
Chaque modification n’exige pas l’ensemble de ces étapes pour produire un résultat significatif — une modification peut nécessiter uniquement une mise à jour visuelle, par exemple, sans avoir besoin d’un rec calcul complet de la mise en page.
C’est précisément à ce stade que le cycle de vie propre à React transfère la responsabilité au pipeline de rendu du navigateur décrit précédemment.
19. useLayoutEffect
useLayoutEffect s’exécute après que React ait enregistré ses mises à jour du DOM, mais avant que le navigateur n’ait l’occasion de redessiner les éléments nouveaux.
La séquence est la suivante :
React Render
↓
Commit
↓
DOM updated
↓
useLayoutEffect
↓
Browser Paint
function Tooltip() {
const ref = useRef(null);
useLayoutEffect(() => {
const rect = ref.current.getBoundingClientRect();
console.log(rect.width);
}, []);
return (
<div ref={ref}>
Tooltip
</div>
);
}
Cet hook est l’outil idéal lorsque vous avez besoin de :
- Mesurer les éléments dans le DOM
- Lire les valeurs de mise en page actuelles
- Appliquer des ajustements visuels de manière synchrone, avant que l’utilisateur ne voie quoi que ce soit
Une précaution : si les opérations à l’intérieur de useLayoutEffect sont lourdes, elles peuvent retarder le redessin et rendre l’interface utilisateur lente.
20. useEffect
useEffect, en revanche, est conçu pour les effets qui n’ont pas besoin de bloquer le redessin du navigateur.
useEffect(() => {
fetch("/api/products");
}, []);
Render
↓
Commit
↓
Browser Paint
↓
useEffect
Les détails précis de planification sont un peu plus subtils que cela, mais la règle pratique fondamentale est :
Utilisez
useLayoutEffectuniquement lorsque quelque chose doit se produire avant que le navigateur ne redessine l’interface ; utilisezuseEffectpour tout ce qui peut être exécuté après que l’UI soit déjà visible.
21. Exemple complet
import { useEffect, useLayoutEffect, useState } from "react";
function Counter() {
const [count, setCount] = useState(0);
console.log("Render");
useLayoutEffect(() => {
console.log("Layout Effect");
});
useEffect(() => {
console.log("Effect");
});
return (
<button onClick={() => setCount(c => c + 1)}>
Count: {count}
</button>
);
}
Conceptuellement, la séquence des événements se présente comme suit :
User clicks button
↓
setCount()
↓
State update scheduled
↓
Counter() executes
↓
"Render"
↓
React reconciles
↓
React commits DOM update
↓
"Layout Effect"
↓
Browser paints updated UI
↓
"Effect"
22. Un re-render du parent provoque-t-il un re-render de l’enfant ?
Prenons cet exemple :
function Parent() {
const [count, setCount] = useState(0);
return (
<>
<button onClick={() => setCount(c => c + 1)}>
{count}
</button>
<Child />
</>
);
}
Lorsque count est mis à jour :
Parent renders
↓
Child is encountered
↓
Child may render as part of reconciliation
So,
Parent state update
↓
Parent render
↓
Child can render
Ce comportement explique en partie pourquoi React.memo existe en tant qu’outil d’optimisation.
23. React.memo
Supposons que vous ayez :
const Child = React.memo(function Child() {
console.log("Child rendered");
return <p>Hello</p>;
});
Si le parent se re-render mais que les props transmises à l’enfant restent identiques sur le plan référentiel, React peut éviter complètement de re-render cet enfant mémorisé.
Voici l’idée de manière visuelle :
Parent update
↓
Parent renders
↓
React.memo checks Child props
↓
Props unchanged
↓
Skip Child render
N’oubliez pas cependant :
React.memovous offre un raccourci de performance — il ne garantit pas pour autant qu’un composant ne sera jamais rendu à nouveau.
Les changements de contexte, l’état interne et d’autres déclencheurs peuvent encore le forcer à s’actualiser, indépendamment de la mémorisation.
24. useMemo et useCallback
Ces deux hooks sont souvent mal compris.
useMemo : Il mémorise une valeur calculée.
const result = useMemo(() => expensiveCalculation(data), [data]);
useCallback : Il mémorise une référence de fonction.
const handleClick = useCallback(() => {
doSomething(id);
}, [id]);
Tous deux sont véritablement utiles dans les situations où l’égalité de référence est importante pour éviter des tâches répétées — notamment lors du passage de props à des composants enfants mémorisés.
Néanmoins, les utiliser partout par défaut a tendance à ajouter de la complexité à votre code sans apporter d’amélioration réelle en termes de performance.
25. Un rendu React n’est pas identique à une mise en page par le navigateur
Ce point mérite d’être souligné explicitement.
Imaginons le composant suivant :
function App() {
const [count, setCount] = useState(0);
return (
<div>
<button onClick={() => setCount(c => c + 1)}>
{count}
</button>
<p>Hello</p>
</div>
);
}
Lorsque count change :
App renders
↓
New React tree created
↓
Reconciliation
↓
Only count text differs
↓
Commit small DOM update
↓
Browser rendering
React ne reconstruira pas nécessairement ce markup à partir de zéro :
<div>
<button>...</button>
<p>Hello</p>
</div>
26. Virtual DOM — Comprendre correctement le modèle conceptuel
On affirme souvent que React s’appuie sur un Virtual DOM pour accélérer le navigateur. C’est une simplification excessive.
En réalité, React conserve en mémoire une description interne de l’interface utilisateur et utilise la réconciliation pour déterminer ce qui a changé.
Le navigateur lui-même ne connaît pas le concept de Virtual DOM. Il ne travaille qu’avec des éléments tels que l’HTML, le DOM, le CSS et, en fin de compte, les pixels.
Conceptuellement, le flux est le suivant :
React Component
↓
React Element Tree
↓
Reconciliation
↓
DOM Mutations
↓
Browser
↓
Pixels
Le Virtual DOM n’est jamais quelque chose que le navigateur rend réellement.
27. Re-render vs Repaint
Ces deux concepts sont distincts et ne doivent pas être confondus.
Re-render dans React
C’est le moment où la fonction d’un composant s’exécute à nouveau — en d’autres termes, Component() est appelé.
Repaint par le navigateur
C’est lorsque le navigateur redessine les pixels à l’écran en raison d’un changement dans une propriété visuelle — c’est l’étape de Paint.
N’oubliez pas : un re-render dans React n’est pas équivalent à un repaint par le navigateur.
Il est tout à fait possible qu’un composant soit rendu à nouveau tout en produisant une structure DOM identique. Inversement, le navigateur peut effectuer un repaint pour des raisons qui n’ont rien à voir avec le rendu d’un composant React.
28. Reflow vs Repaint
Prenons cet exemple : element.style.width = "500px";
Changer la largeur d’un élément force généralement un rec calcul du layout :
Style
↓
Layout
↓
Paint
↓
Composite
Comparons maintenant avec : element.style.backgroundColor = "red";
Ici, le navigateur n’a généralement pas besoin de refaire les calculs géométriques :
Style
↓
Paint
↓
Composite
Et pour certaines modifications de transformation ou d’opacité, le navigateur n’a peut-être besoin que de :
Composite
Comprendre cette différence est très important lorsque l’on optimise des animations ou des interfaces nécessitant beaucoup de rendu.
29. Application à un scénario réel avec React
Imaginons une page de produit typique pour e-commerce structurée comme suit :
Product Page
├── Navbar
├── Product Gallery
├── Product Information
├── Add To Cart
├── Reviews
└── Recommendations
Supposons qu’un utilisateur clique sur le bouton Ajouter au panier, ce qui met à jour le compteur du panier.
Conceptuellement, la séquence d’événements pourrait ressembler à ceci :
User clicks "Add to Cart"
↓
Cart state updates
↓
React schedules update
↓
Relevant components render
↓
React reconciles new tree
↓
Only required DOM changes are committed
↓
Browser performs necessary rendering work
↓
Updated cart count appears
Dans une application bien structurée, cette mise à jour du compteur de panier ne devrait pas forcer la reconstruction inutile de toute l’interface utilisateur. C’est précisément pour cette raison que les décisions concernant les limites des composants, l’emplacement de l’état, la mémorisation et l’architecture globale de rendu revêtent une grande importance.
30. Lorsque le rendu coûteux devient un problème de performance
function ProductList({ products }) {
return products.map(product => (
<ExpensiveProductCard
key={product.id}
product={product}
/>
));
}
Supposons que cette liste affiche 10 000 produits, et qu’un changement d’état non lié déclenche des opérations inutiles dans un grand nombre de composants — la performance peut se dégrader de manière significative.
Les techniques d’atténuation courantes incluent :
React.memo
+
Stable props
+
useMemo/useCallback where justified
+
Virtualization
+
Pagination
+
Code splitting
Pour des listes particulièrement longues, la virtualisation s’avère souvent particulièrement efficace :
10000 items
↓
Only visible ~20-50 items rendered
31. Comment le rendu interagit avec React concurrent
Les versions plus récentes de React intègrent des capacités de planification plus avancées. React peut attribuer une priorité aux différentes mises à jour et, le cas échéant, suspendre ou reporter les tâches de rendu.
Le modèle mental essentiel à retenir est :
Render work
↓
Can be scheduled
↓
Can be interrupted in modern React
↓
Eventually committed
C’est précisément pour cette raison que les effets secondaires ne devraient pas figurer dans la logique de rendu d’un composant :
function Component() {
fetch("/api/data"); // ❌ Side effect during render
return <div>Hello</div>;
}
Préférez plutôt utiliser un hook effect ou un schéma adapté de récupération de données. Idéalement, la phase de rendu doit rester pure.
32. Les avantages d’un rendu pur
Conceptuellement, un composant React doit se comporter comme une fonction pure :
UI = f(props, state)
Avec les mêmes props et état, il doit toujours représenter le même interface utilisateur. Par exemple :
function Greeting({ name }) {
return <h1>Hello {name}</h1>;
}
Ce comportement est prévisible et sûr.
En revanche, effectuer une telle action à l’intérieur de la fonction render pose problème :
function Component() {
localStorage.setItem("x", "1"); // ❌
fetch("/api"); // ❌
return <div>Hello</div>;
}
Cela introduit des effets secondaires dans une phase que React pourrait exécuter plus d’une fois ou planifier de manières inattendues.
Les effets secondaires doivent être placés ailleurs — à l’intérieur des effets, des gestionnaires d’événements ou des mécanismes de récupération de données fournis par votre framework.
33. Cycle de vie du rendu — Modèle mental complet
USER ACTION
│
▼
State / Props Update
│
▼
React Schedules Work
│
▼
┌──────────────┐
│ RENDER │
│ │
│ Components │
│ execute │
└──────┬───────┘
│
▼
Reconciliation
│
▼
┌──────────────┐
│ COMMIT │
│ │
│ DOM mutation │
└──────┬───────┘
│
▼
useLayoutEffect
│
▼
Browser Rendering
│
▼
Style Calculation
│
▼
Layout
│
▼
Paint
│
▼
Composite
│
▼
SCREEN
│
▼
useEffect
Questions d’entretien courantes
Q1. Une mise à jour d’état met-elle immédiatement à jour le DOM ?
Non. Une mise à jour d’état ne fait que planifier des tâches à effectuer par React. React rend la composante, compare le résultat avec ce qui était affiché précédemment, et n’applique les modifications du DOM nécessaires qu’à ce moment-là.
setState
↓
Render
↓
Reconciliation
↓
Commit
↓
DOM
Q2. Chaque rendu entraîne-t-il une mise à jour du DOM ?
Non. React peut rendre une composante et conclure que la description de l’interface résultante est identique à celle qui est déjà affichée à l’écran ; dans ce cas, il évite de modifier le DOM.
Render
↓
Compare
↓
No meaningful DOM difference
↓
No DOM mutation
Q3. Le rérendu dans React force-t-il le navigateur à redessiner ?
Non. Le rendu dans React et le dessin dans le navigateur sont deux processus indépendants.
React Render ≠ Browser Paint
Q4. Que signifie la réconciliation ?
La réconciliation consiste en ce que React compare l’arbre UI fraîchement calculé à celui précédent afin de déterminer exactement ce qui doit changer.
Q5. Que se passe-t-il pendant la phase de commit ?
Pendant le commit, React applique les modifications nécessaires à l’environnement hôte — par exemple, en mettant à jour les nœuds DOM réels dans un navigateur.
Q6. En quoi useEffect et useLayoutEffect diffèrent-ils ?
Une façon simple de s’en souvenir :
useLayoutEffect
→ after DOM commit, before paint
useEffect
→ after commit and generally after paint
Utilisez useLayoutEffect lorsque vous devez mesurer ou ajuster le layout de manière synchrone avant que l’utilisateur ne voie la nouvelle frame. Utilisez useEffect pour la plupart des effets secondaires qui n’ont pas besoin de bloquer le rendu.
Q7. Qu’est-ce qui déclenche le rendu d’un composant ?
Les déclencheurs typiques sont : un montage initial, une mise à jour d’état, un rérendu d’un parent, un changement de props, une mise à jour du contexte, ou une mise à jour provenant d’un stock externe.
Q8. Comment optimiser le rendu ? [IMP]
Au lieu d’utiliser useMemo partout par défaut, identifiez d’abord où se trouve le véritable goulot d’étranglement. Ensuite, envisagez ces approches :
1. Conservez l’état près de l’endroit où il est utilisé
Évitez une structure où l’état se trouve en haut et où chaque descendant dépend de lui :
App
↓
Everything depends on state
prefer:
Feature
↓
Local state
Préférer une emplacement plus restreint lorsque l’état global n’est pas vraiment nécessaire.
2. Mémoriser sélectivement les composants coûteux
const ProductCard = React.memo(ProductCardComponent);
3. Faire attention à la création d’objets qui perturbent la mémorisation
Au lieu de créer à chaque fois un nouvel objet en ligne comme ceci :
<Child config={{ theme: "dark" }} />
vous pourriez avoir besoin d’une référence stable si Child est enveloppé dans React.memo et que l’identité compte — mais ne résolvez ce problème qu’en cas de véritable difficulté.
4. Virtualiser les listes longues
Au lieu de rendre tous les 10 000 nœuds DOM en même temps, ne rendez que ceux qui sont actuellement visibles.
5. Reporter le chargement des fonctionnalités coûteuses
const AdminDashboard = lazy(() => import("./AdminDashboard"));
Cela réduit la quantité de JavaScript qui doit être téléchargée et exécutée au préalable.
6. Privilégier des techniques de rendu compatibles avec le navigateur
Animez avec des propriétés peu coûteuses telles que transform et opacité lorsque c’est possible, et évitez de forcer des recalculs de mise en page coûteux à chaque frame.