{"componentChunkName":"component---src-templates-docs-js","path":"/docs/implementation-notes.html","result":{"data":{"markdownRemark":{"html":"<p>Cette section fournit un ensemble de notes relatives à l’implémentation du <a href=\"/docs/codebase-overview.html#stack-reconciler\">réconciliateur <em>“stack”</em></a>.</p>\n<p>C’est très technique et suppose une solide compréhension de l’API publique de React ainsi que de sa structure divisée en noyau, moteurs de rendu et réconciliateur. Si vous ne connaissez pas bien la base de code React, lisez d’abord l’<a href=\"/docs/codebase-overview.html\">aperçu du code source</a>.</p>\n<p>Ça suppose également de comprendre les <a href=\"/blog/2015/12/18/react-components-elements-and-instances.html\">différences entre les composants React, leurs instances et leurs éléments</a>.</p>\n<p>Le réconciliateur <em>“stack”</em> était utilisé jusqu’à React 15 inclus. Il se trouve dans <a href=\"https://github.com/facebook/react/tree/15-stable/src/renderers/shared/stack/reconciler\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">src/renderers/shared/stack/reconciler</a>.</p>\n<h3 id=\"video-building-react-from-scratch\"><a href=\"#video-building-react-from-scratch\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Vidéo : construire React à partir de zéro </h3>\n<p><a href=\"https://twitter.com/zpao\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Paul O’Shannessy</a> a donné une conférence (en anglais) sur la <a href=\"https://www.youtube.com/watch?v=_MAD4Oly9yg\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">construction de React à partir de zéro</a> qui a largement inspiré ce document.</p>\n<p>Ce document et sa conférence sont des simplifications de la véritable base de code : en vous familiarisant avec ces deux sources, vous devriez mieux comprendre.</p>\n<h3 id=\"overview\"><a href=\"#overview\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Aperçu </h3>\n<p>Le réconciliateur lui-même n’a pas d’API publique. Les <a href=\"/docs/codebase-overview.html#renderers\">moteurs de rendu</a> comme React DOM et React Native l’utilisent pour mettre à jour efficacement l’interface utilisateur en fonction des composants React écrits par l’utilisateur.</p>\n<h3 id=\"mounting-as-a-recursive-process\"><a href=\"#mounting-as-a-recursive-process\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Le montage, un processus récursif </h3>\n<p>Intéressons-nous à la première fois que vous montez un composant :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">const</span> root <span class=\"token operator\">=</span> ReactDOM<span class=\"token punctuation\">.</span><span class=\"token function\">createRoot</span><span class=\"token punctuation\">(</span>rootEl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nroot<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>React DOM passera <code class=\"gatsby-code-text\">&lt;App /></code> au réconciliateur. Rappelez-vous que <code class=\"gatsby-code-text\">&lt;App /></code> est un élément React, c’est-à-dire une description de <em>quoi</em> afficher. Vous pouvez le considérer comme un simple objet :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// { type: App, props: {} }</span></code></pre></div>\n<p>Le réconciliateur vérifiera si <code class=\"gatsby-code-text\">App</code> est une classe ou une fonction.</p>\n<p>Si <code class=\"gatsby-code-text\">App</code> est une fonction, le réconciliateur appellera <code class=\"gatsby-code-text\">App(props)</code> pour obtenir le rendu de l’élément associé.</p>\n<p>Si <code class=\"gatsby-code-text\">App</code> est une classe, le réconciliateur instanciera une <code class=\"gatsby-code-text\">App</code> avec <code class=\"gatsby-code-text\">new App(props)</code>, appellera la méthode de cycle de vie <code class=\"gatsby-code-text\">componentWillMount()</code>, puis appellera la méthode <code class=\"gatsby-code-text\">render()</code> pour obtenir le rendu de l’élément.</p>\n<p>Dans les deux cas, le réconciliateur saura quel élément « a été produit par le rendu » de <code class=\"gatsby-code-text\">App</code>.</p>\n<p>Ce processus est récursif. Le rendu de <code class=\"gatsby-code-text\">App</code> peut produire un <code class=\"gatsby-code-text\">&lt;Greeting /></code>, celui de <code class=\"gatsby-code-text\">Greeting</code> peut produire un <code class=\"gatsby-code-text\">&lt;Button /></code>, et ainsi de suite. Le réconciliateur « creusera » récursivement dans les composants définis par l’utilisateur, et saura ainsi ce que produit le rendu de chacun.</p>\n<p>Vous pouvez imaginer ce processus comme un pseudo-code :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">isClass</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">type</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Les sous-classes de React.Component ont ce drapeau</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token function\">Boolean</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">.</span>prototype<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span>\n    <span class=\"token function\">Boolean</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">.</span>prototype<span class=\"token punctuation\">.</span>isReactComponent<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Cette fonction prend en paramètre un élément React (par exemple &lt;App />)</span>\n<span class=\"token comment\">// et renvoie un nœud DOM ou natif représentant l’arbre monté.</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> type <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">var</span> props <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Nous déterminerons l’élément rendu</span>\n  <span class=\"token comment\">// soit en exécutant le type comme une fonction</span>\n  <span class=\"token comment\">// soit en créant une instance puis en appelant render().</span>\n  <span class=\"token keyword\">var</span> renderedElement<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isClass</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Composant basé classe</span>\n    <span class=\"token keyword\">var</span> publicInstance <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">type</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// Initialise les props</span>\n    publicInstance<span class=\"token punctuation\">.</span>props <span class=\"token operator\">=</span> props<span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// Appelle le cycle de vie si besoin</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>publicInstance<span class=\"token punctuation\">.</span>componentWillMount<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      publicInstance<span class=\"token punctuation\">.</span><span class=\"token function\">componentWillMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// Obtient l’élément rendu en appelant render()</span>\n    renderedElement <span class=\"token operator\">=</span> publicInstance<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Fonction composant</span>\n    renderedElement <span class=\"token operator\">=</span> <span class=\"token function\">type</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// Ce processus est récursif parce qu’un composant peut</span>\n  <span class=\"token comment\">// renvoyer un élément avec un autre type de composant.</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">mount</span><span class=\"token punctuation\">(</span>renderedElement<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Remarque : cette implémentation est incomplète et la récursivité est infinie !</span>\n  <span class=\"token comment\">// Ça gère uniquement les éléments comme &lt;App /> ou &lt;Button />.</span>\n  <span class=\"token comment\">// Ça ne gère pas pour l’instant les éléments comme &lt;div /> ou &lt;p />.</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">var</span> rootEl <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">'root'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span> node <span class=\"token operator\">=</span> <span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nrootEl<span class=\"token punctuation\">.</span><span class=\"token function\">appendChild</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<blockquote>\n<p>Remarque</p>\n<p>C’est <em>vraiment</em> du pseudo-code. L’implémentation actuelle diffère pas mal. Ce code saturerait la pile car nous n’avons pas précisé de condition d’arrêt pour la récursivité.</p>\n</blockquote>\n<p>Récapitulons quelques idées clés dans l’exemple ci-dessus :</p>\n<ul>\n<li>Les éléments React sont des objets simples représentant le type du composant (par exemple <code class=\"gatsby-code-text\">App</code>) et les props.</li>\n<li>Les composants définis par l’utilisateur (par exemple <code class=\"gatsby-code-text\">App</code>) peuvent être des classes ou des fonctions mais toutes « font un rendu » avec des éléments comme résultat.</li>\n<li>Le « montage » est un processus récursif qui crée un arbre DOM ou natif à partir de l’élément racine React (par exemple <code class=\"gatsby-code-text\">&lt;App /></code>).</li>\n</ul>\n<h3 id=\"mounting-host-elements\"><a href=\"#mounting-host-elements\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Montage d’éléments hôtes </h3>\n<p>Ce processus serait inutile si nous n’affichions pas quelque chose à l’écran au final.</p>\n<p>En plus des composants définis par l’utilisateur (« composites »), les éléments React peuvent également représenter des composants pour des plates-formes spécifiques (« hôtes »). Par exemple, la méthode de rendu de <code class=\"gatsby-code-text\">Button</code> pourrait renvoyer une <code class=\"gatsby-code-text\">&lt;div /></code>.</p>\n<p>Si la propriété <code class=\"gatsby-code-text\">type</code> de l’élément est une chaîne de caractères, il s’agit d’un élément hôte :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">console<span class=\"token punctuation\">.</span><span class=\"token function\">log</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// { type: 'div', props: {} }</span></code></pre></div>\n<p>Il n’y a aucun code défini par l’utilisateur associé aux éléments hôtes.</p>\n<p>Lorsque le réconciliateur rencontre un élément hôte, il laisse le moteur de rendu s’occuper du montage. Par exemple, React DOM créerait un nœud DOM.</p>\n<p>Si l’élément hôte a des enfants, le réconciliateur les monte de manière récursive en suivant le même algorithme que celui décrit plus haut. Peu importe que les enfants soient hôtes (comme <code class=\"gatsby-code-text\">&lt;div>&lt;hr />&lt;/div></code>), composites (comme <code class=\"gatsby-code-text\">&lt;div>&lt;Button />&lt;/div></code>) ou un mélange des deux.</p>\n<p>Les nœuds DOM produits par les composants enfants seront ajoutés au nœud DOM parent, et donc de manière récursive, l’ensemble de la structure DOM sera constituée.</p>\n<blockquote>\n<p>Remarque</p>\n<p>Le réconciliateur lui-même n’est pas lié au DOM. Le résultat exact du montage (parfois appelé <em>“mount image”</em> dans le code source) dépend du moteur de rendu, et donc peut être un nœud DOM (React DOM), une chaîne de caractères (React DOM Server) ou un nombre représentant une vue native (React Native).</p>\n</blockquote>\n<p>Si nous devions étendre le code pour gérer des éléments hôtes, il ressemblerait à ceci :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">isClass</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">type</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Les sous-classes de React.Component ont ce drapeau</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token function\">Boolean</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">.</span>prototype<span class=\"token punctuation\">)</span> <span class=\"token operator\">&amp;&amp;</span>\n    <span class=\"token function\">Boolean</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">.</span>prototype<span class=\"token punctuation\">.</span>isReactComponent<span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Cette fonction gère uniquement les éléments avec un type composite.</span>\n<span class=\"token comment\">// Par exemple, elle gère &lt;App /> et &lt;Button />, mais pas une &lt;div />.</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">mountComposite</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> type <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">var</span> props <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n\n  <span class=\"token keyword\">var</span> renderedElement<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isClass</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Composant basé classe</span>\n    <span class=\"token keyword\">var</span> publicInstance <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">type</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// Initialise les props</span>\n    publicInstance<span class=\"token punctuation\">.</span>props <span class=\"token operator\">=</span> props<span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// Appelle le cycle de vie si besoin</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>publicInstance<span class=\"token punctuation\">.</span>componentWillMount<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      publicInstance<span class=\"token punctuation\">.</span><span class=\"token function\">componentWillMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    renderedElement <span class=\"token operator\">=</span> publicInstance<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> type <span class=\"token operator\">===</span> <span class=\"token string\">'function'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Fonction composant</span>\n    renderedElement <span class=\"token operator\">=</span> <span class=\"token function\">type</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// C’est récursif mais nous atteindrons finalement le bas de la récursion lorsque</span>\n  <span class=\"token comment\">// l’élément sera hôte (par exemple &lt;div />) au lieu de composite (par exemple &lt;App />) :</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">mount</span><span class=\"token punctuation\">(</span>renderedElement<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\">// Cette fonction gère uniquement les éléments avec un type hôte.</span>\n<span class=\"token comment\">// Par exemple, il gère &lt;div /> et &lt;p />, mais pas un &lt;App />.</span>\n<span class=\"token keyword\">function</span> <span class=\"token function\">mountHost</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> type <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">var</span> props <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">var</span> children <span class=\"token operator\">=</span> props<span class=\"token punctuation\">.</span>children <span class=\"token operator\">||</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>Array<span class=\"token punctuation\">.</span><span class=\"token function\">isArray</span><span class=\"token punctuation\">(</span>children<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    children <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>children<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  children <span class=\"token operator\">=</span> children<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span>Boolean<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Ce bloc de code ne devrait pas être dans le réconciliateur.</span>\n  <span class=\"token comment\">// Les différents moteurs de rendu peuvent initialiser les nœuds différemment.</span>\n  <span class=\"token comment\">// Par exemple, React Native crée des vues iOS ou Android.</span>\n  <span class=\"token keyword\">var</span> node <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">createElement</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  Object<span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">propName</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>propName <span class=\"token operator\">!==</span> <span class=\"token string\">'children'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      node<span class=\"token punctuation\">.</span><span class=\"token function\">setAttribute</span><span class=\"token punctuation\">(</span>propName<span class=\"token punctuation\">,</span> props<span class=\"token punctuation\">[</span>propName<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Monte les enfants</span>\n  children<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">childElement</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// L’enfant peut être hôte (par exemple &lt;div />) ou composite (par exemple &lt;Button />).</span>\n    <span class=\"token comment\">// Nous les monterons également de manière récursive :</span>\n    <span class=\"token keyword\">var</span> childNode <span class=\"token operator\">=</span> <span class=\"token function\">mount</span><span class=\"token punctuation\">(</span>childElement<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Cette ligne de code est également spécifique au moteur de rendu.</span>\n    <span class=\"token comment\">// Ce serait différent en fonction du moteur de rendu :</span>\n    node<span class=\"token punctuation\">.</span><span class=\"token function\">appendChild</span><span class=\"token punctuation\">(</span>childNode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Renvoie le nœud DOM comme résultat de montage.</span>\n  <span class=\"token comment\">// C’est ici que se termine la récursion.</span>\n  <span class=\"token keyword\">return</span> node<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> type <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> type <span class=\"token operator\">===</span> <span class=\"token string\">'function'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Composants définis par l’utilisateur</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">mountComposite</span><span class=\"token punctuation\">(</span>element<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> type <span class=\"token operator\">===</span> <span class=\"token string\">'string'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Composants spécifiques aux plates-formes</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">mountHost</span><span class=\"token punctuation\">(</span>element<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">var</span> rootEl <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">'root'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">var</span> node <span class=\"token operator\">=</span> <span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\nrootEl<span class=\"token punctuation\">.</span><span class=\"token function\">appendChild</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Ça fonctionne mais ça reste loin de la manière dont le réconciliateur est réellement implémenté. L’ingrédient clé manquant est la prise en charge des mises à jour.</p>\n<h3 id=\"introducing-internal-instances\"><a href=\"#introducing-internal-instances\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Voici venir les instances internes </h3>\n<p>La principale caractéristique de React est que vous pouvez refaire tout le rendu sans recréer le DOM ni réinitialiser l’état :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">root<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// Devrait réutiliser le DOM existant :</span>\nroot<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Cependant, notre implémentation ci-dessus sait uniquement monter l’arbre initial. Elle ne peut pas effectuer de mises à jour dans l’arborescence car elle ne stocke pas toutes les informations nécessaires, telles que toutes les références <code class=\"gatsby-code-text\">publicInstance</code> ou les nœuds DOM qui correspondent aux composants.</p>\n<p>La base de code du réconciliateur <em>“stack”</em> résout ce problème en faisant de la fonction <code class=\"gatsby-code-text\">mount()</code> une méthode au sein d’une classe. Cette approche présente des inconvénients et nous allons dans la direction opposée pour la <a href=\"/docs/codebase-overview.html#fiber-reconciler\">réécriture en cours du réconciliateur</a>. Cependant, voici comment ça fonctionne dans le réconciliateur historique.</p>\n<p>Plutôt que deux fonctions distinctes <code class=\"gatsby-code-text\">mountHost</code> et <code class=\"gatsby-code-text\">mountComposite</code>, nous créerons deux classes : <code class=\"gatsby-code-text\">DOMComponent</code> et <code class=\"gatsby-code-text\">CompositeComponent</code>.</p>\n<p>Les deux classes ont un constructeur acceptant <code class=\"gatsby-code-text\">element</code>, ainsi qu’une méthode <code class=\"gatsby-code-text\">mount()</code> qui renvoie le nœud monté. Nous remplacerons la fonction racine <code class=\"gatsby-code-text\">mount()</code> par une fabrique <em>(factory, NdT)</em> qui instanciera la bonne classe :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">instantiateComponent</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">var</span> type <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> type <span class=\"token operator\">===</span> <span class=\"token string\">'function'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Composants définis par l’utilisateur</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CompositeComponent</span><span class=\"token punctuation\">(</span>element<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> type <span class=\"token operator\">===</span> <span class=\"token string\">'string'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Composants spécifiques aux plates-formes</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">DOMComponent</span><span class=\"token punctuation\">(</span>element<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Tout d’abord, examinons l’implémentation de <code class=\"gatsby-code-text\">CompositeComponent</code> :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CompositeComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>currentElement <span class=\"token operator\">=</span> element<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>renderedComponent <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>publicInstance <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">getPublicInstance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Pour les composants composites, exposons l’instance de la classe.</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>publicInstance<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">var</span> element <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>currentElement<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> type <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> props <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">var</span> publicInstance<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> renderedElement<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isClass</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// Composant basé classe</span>\n      publicInstance <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">type</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token comment\">// Initialise les props</span>\n      publicInstance<span class=\"token punctuation\">.</span>props <span class=\"token operator\">=</span> props<span class=\"token punctuation\">;</span>\n      <span class=\"token comment\">// Appelle le cycle de vie si besoin</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>publicInstance<span class=\"token punctuation\">.</span>componentWillMount<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        publicInstance<span class=\"token punctuation\">.</span><span class=\"token function\">componentWillMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n      renderedElement <span class=\"token operator\">=</span> publicInstance<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> type <span class=\"token operator\">===</span> <span class=\"token string\">'function'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// Fonction composant</span>\n      publicInstance <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n      renderedElement <span class=\"token operator\">=</span> <span class=\"token function\">type</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Sauvegarde l’instance publique</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>publicInstance <span class=\"token operator\">=</span> publicInstance<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Construit l’instance interne de l’enfant en fonction de l’élément.</span>\n    <span class=\"token comment\">// Ce sera un DOMComponent pour &lt;div /> ou &lt;p />,</span>\n    <span class=\"token comment\">// et un CompositeComponent pour &lt;App /> ou &lt;Button /> :</span>\n    <span class=\"token keyword\">var</span> renderedComponent <span class=\"token operator\">=</span> <span class=\"token function\">instantiateComponent</span><span class=\"token punctuation\">(</span>renderedElement<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>renderedComponent <span class=\"token operator\">=</span> renderedComponent<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Monte le résultat du rendu</span>\n    <span class=\"token keyword\">return</span> renderedComponent<span class=\"token punctuation\">.</span><span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Ce n’est pas très différent de notre implémentation précédente de <code class=\"gatsby-code-text\">mountComposite()</code>, mais maintenant, nous pouvons sauver certaines informations, telles que <code class=\"gatsby-code-text\">this.currentElement</code>, <code class=\"gatsby-code-text\">this.renderedComponent</code> et <code class=\"gatsby-code-text\">this.publicInstance</code>, pour les utiliser lors des mises à jour d’éléments.</p>\n<p>Remarquez qu’une instance de <code class=\"gatsby-code-text\">CompositeComponent</code> n’est pas la même chose qu’une instance du <code class=\"gatsby-code-text\">element.type</code> fourni par l’utilisateur. <code class=\"gatsby-code-text\">CompositeComponent</code> est un détail d’implémentation de notre réconciliateur et n’est jamais exposé à l’utilisateur. La classe définie par l’utilisateur est celle que nous avons lue dans <code class=\"gatsby-code-text\">element.type</code>, et <code class=\"gatsby-code-text\">CompositeComponent</code> crée une instance de celle-ci.</p>\n<p>Pour éviter toute confusion, nous appellerons les instances de <code class=\"gatsby-code-text\">CompositeComponent</code> et <code class=\"gatsby-code-text\">DOMComponent</code> des « instances internes ». Elles existent pour nous permettre de leur associer des données durables. Seuls le moteur de rendu et le réconciliateur s’en servent.</p>\n<p>En revanche, nous appelons une instance de classe définie par l’utilisateur « instance publique ». L’instance publique, c’est ce que vous voyez comme <code class=\"gatsby-code-text\">this</code> dans <code class=\"gatsby-code-text\">render()</code> et les autres méthodes de vos composants personnalisés.</p>\n<p>La fonction <code class=\"gatsby-code-text\">mountHost()</code> a été refactorisée pour devenir la méthode <code class=\"gatsby-code-text\">mount()</code> dans la classe <code class=\"gatsby-code-text\">DOMComponent</code>, et son code a des airs familiers :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">DOMComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>currentElement <span class=\"token operator\">=</span> element<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>renderedChildren <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>node <span class=\"token operator\">=</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">getPublicInstance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Pour les composants DOM, expose uniquement le nœud du DOM.</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">var</span> element <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>currentElement<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> type <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> props <span class=\"token operator\">=</span> element<span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> children <span class=\"token operator\">=</span> props<span class=\"token punctuation\">.</span>children <span class=\"token operator\">||</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>Array<span class=\"token punctuation\">.</span><span class=\"token function\">isArray</span><span class=\"token punctuation\">(</span>children<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      children <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>children<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Crée et sauvegarde le nœud</span>\n    <span class=\"token keyword\">var</span> node <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">createElement</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>node <span class=\"token operator\">=</span> node<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Initialise les attributs</span>\n    Object<span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">propName</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>propName <span class=\"token operator\">!==</span> <span class=\"token string\">'children'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        node<span class=\"token punctuation\">.</span><span class=\"token function\">setAttribute</span><span class=\"token punctuation\">(</span>propName<span class=\"token punctuation\">,</span> props<span class=\"token punctuation\">[</span>propName<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Crée et sauvegarde les enfants contenus.</span>\n    <span class=\"token comment\">// Chacun d’eux peut être un DOMComponent ou un CompositeComponent,</span>\n    <span class=\"token comment\">// selon que le type de l’élément est une chaîne de caractères ou une fonction.</span>\n    <span class=\"token keyword\">var</span> renderedChildren <span class=\"token operator\">=</span> children<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span>instantiateComponent<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>renderedChildren <span class=\"token operator\">=</span> renderedChildren<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Collecte les nœuds DOM qui sont renvoyés lors du montage</span>\n    <span class=\"token keyword\">var</span> childNodes <span class=\"token operator\">=</span> renderedChildren<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">child</span> <span class=\"token operator\">=></span> child<span class=\"token punctuation\">.</span><span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    childNodes<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">childNode</span> <span class=\"token operator\">=></span> node<span class=\"token punctuation\">.</span><span class=\"token function\">appendChild</span><span class=\"token punctuation\">(</span>childNode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Renvoie le nœud DOM comme résultat du montage</span>\n    <span class=\"token keyword\">return</span> node<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Après la refactorisation de <code class=\"gatsby-code-text\">mountHost()</code>, la différence principale est que nous conservons <code class=\"gatsby-code-text\">this.node</code> et <code class=\"gatsby-code-text\">this.renderedChildren</code>, qui sont maintenant associés à l’instance interne du composant DOM. Nous les utiliserons également à l’avenir pour appliquer des mises à jour non destructives.</p>\n<p>Par conséquent, chaque instance interne, composite ou hôte, pointe maintenant vers ses instances internes enfants. Pour vous aider à le visualiser, si une fonction composant <code class=\"gatsby-code-text\">&lt;App></code> donne un composant basé classe <code class=\"gatsby-code-text\">&lt;Button></code>, et qu’un <code class=\"gatsby-code-text\">Button</code> donne une <code class=\"gatsby-code-text\">&lt;div></code>, l’arbre des instances internes ressemblera à ceci :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token punctuation\">[</span>object CompositeComponent<span class=\"token punctuation\">]</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token literal-property property\">currentElement</span><span class=\"token operator\">:</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">publicInstance</span><span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  <span class=\"token literal-property property\">renderedComponent</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>object CompositeComponent<span class=\"token punctuation\">]</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token literal-property property\">currentElement</span><span class=\"token operator\">:</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">Button</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">publicInstance</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>object Button<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    <span class=\"token literal-property property\">renderedComponent</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>object DOMComponent<span class=\"token punctuation\">]</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token literal-property property\">currentElement</span><span class=\"token operator\">:</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">node</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>object HTMLDivElement<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n      <span class=\"token literal-property property\">renderedChildren</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Dans le DOM, vous verriez uniquement la <code class=\"gatsby-code-text\">&lt;div></code>. Pourtant, l’arbre d’instances internes contient tant les instances internes composites que celles hôtes.</p>\n<p>Les instances internes composites ont besoin de stocker :</p>\n<ul>\n<li>L’élément actuel.</li>\n<li>L’instance publique si le type de l’élément est une classe.</li>\n<li>L’instance interne unique produite par le rendu. Il peut s’agir d’un <code class=\"gatsby-code-text\">DOMComponent</code> ou d’un <code class=\"gatsby-code-text\">CompositeComponent</code>.</li>\n</ul>\n<p>Les instances internes hôtes ont besoin de stocker :</p>\n<ul>\n<li>L’élément actuel.</li>\n<li>Le nœud DOM.</li>\n<li>Toutes les instances internes enfants. Chacune d’elles peut être soit un <code class=\"gatsby-code-text\">DOMComponent</code> soit un <code class=\"gatsby-code-text\">CompositeComponent</code>.</li>\n</ul>\n<p>Si vous avez du mal à imaginer la structure d’un arbre d’instances internes dans des applications plus complexes, <a href=\"https://github.com/facebook/react-devtools\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React DevTools</a> peut vous donner une bonne approximation, dans la mesure où il signale les instances hôtes en gris, et les instances composites en violet :</p>\n\n  <a class=\"gatsby-resp-image-link\" href=\"/static/d96fec10d250eace9756f09543bf5d58/00d43/implementation-notes-tree.png\" style=\"display: block\" target=\"_blank\" rel=\"noopener\">\n  \n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block;  max-width: 840px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 61.904761904761905%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsTAAALEwEAmpwYAAABXElEQVQoz5XSyW7bMBAAUP//r7VJGgdtFStWZJkiKXIorhJlroWbAEFyKOrBYG4PmG3HpoliKiZY3ZpyLrnU/45dykmAmMZp/7B/aVpGiVZzDPFyCTGmUurfLG/1Kw4h0FdCfo2yl5sMwUnHOqOFscrbpf6zj12t1XsPQjhnNyusdVJGgI1Sz2Gb52DMyjl3zgHAsize+5zzB661WmdnKVZFrDGMeYyX08ki5Aj1Si1nNCitCCHWWufcJ3yxGztO7Mj8HKJLNyzMe08R4RjECYvuMPetFvSVd2c5EI07eOlFd2DNWZ5GhbbL9nXmlBPnnDKqORL9E/Q/u8Pd43D/zH63rNmPDz/Q93v0jSts2SDpwJg2xrzjnDIeMR4xpVPTNO3heTwPjF8/ADjEFHPJIYXrvXIqKb6f7g1rq2EGqWTKNwx8xateaU/IkazzUkq9DW/aa6RFC7IT9Ub9B1SMslTHW6kcAAAAAElFTkSuQmCC'); background-size: cover; display: block;\">\n      <img class=\"gatsby-resp-image-image\" style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\" alt=\"Arbre React DevTools\" title=\"\" src=\"/static/d96fec10d250eace9756f09543bf5d58/1e088/implementation-notes-tree.png\" srcset=\"/static/d96fec10d250eace9756f09543bf5d58/65ed1/implementation-notes-tree.png 210w,\n/static/d96fec10d250eace9756f09543bf5d58/d10fb/implementation-notes-tree.png 420w,\n/static/d96fec10d250eace9756f09543bf5d58/1e088/implementation-notes-tree.png 840w,\n/static/d96fec10d250eace9756f09543bf5d58/00d43/implementation-notes-tree.png 1000w\" sizes=\"(max-width: 840px) 100vw, 840px\">\n    </span>\n  </span>\n  \n  </a>\n    \n<p>Pour terminer cette refactorisation, nous allons introduire une fonction qui monte une arbre complet dans un nœud conteneur, tout comme <code class=\"gatsby-code-text\">root.render()</code>. Elle renvoie une instance publique, là aussi comme <code class=\"gatsby-code-text\">root.render()</code> :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">mountTree</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element<span class=\"token punctuation\">,</span> containerNode</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Crée une instance interne racine</span>\n  <span class=\"token keyword\">var</span> rootComponent <span class=\"token operator\">=</span> <span class=\"token function\">instantiateComponent</span><span class=\"token punctuation\">(</span>element<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Monte le composant racine dans le conteneur</span>\n  <span class=\"token keyword\">var</span> node <span class=\"token operator\">=</span> rootComponent<span class=\"token punctuation\">.</span><span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  containerNode<span class=\"token punctuation\">.</span><span class=\"token function\">appendChild</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Renvoie l’instance publique fournie</span>\n  <span class=\"token keyword\">var</span> publicInstance <span class=\"token operator\">=</span> rootComponent<span class=\"token punctuation\">.</span><span class=\"token function\">getPublicInstance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> publicInstance<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">var</span> rootEl <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">'root'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token function\">mountTree</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">,</span> rootEl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h3 id=\"unmounting\"><a href=\"#unmounting\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Démontage </h3>\n<p>Maintenant que nous avons des instances internes qui conservent leurs enfants et les nœuds DOM, nous pouvons implémenter le démontage. Pour un composant composite, le démontage appelle une méthode de cycle de vie et opère récursivement.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CompositeComponent</span> <span class=\"token punctuation\">{</span>\n\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token function\">unmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Appelle la méthode de cycle de vie si besoin</span>\n    <span class=\"token keyword\">var</span> publicInstance <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>publicInstance<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>publicInstance<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>publicInstance<span class=\"token punctuation\">.</span>componentWillUnmount<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        publicInstance<span class=\"token punctuation\">.</span><span class=\"token function\">componentWillUnmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Démonte l’unique composant affiché</span>\n    <span class=\"token keyword\">var</span> renderedComponent <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>renderedComponent<span class=\"token punctuation\">;</span>\n    renderedComponent<span class=\"token punctuation\">.</span><span class=\"token function\">unmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Pour <code class=\"gatsby-code-text\">DOMComponent</code>, le démontage appelle celui de chaque enfant :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">DOMComponent</span> <span class=\"token punctuation\">{</span>\n\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token function\">unmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Démonte tous les éléments enfants</span>\n    <span class=\"token keyword\">var</span> renderedChildren <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>renderedChildren<span class=\"token punctuation\">;</span>\n    renderedChildren<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">child</span> <span class=\"token operator\">=></span> child<span class=\"token punctuation\">.</span><span class=\"token function\">unmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>En pratique, le démontage des composants DOM enlève également les écouteurs d’événements et efface certains caches, mais nous ignorerons ces détails.</p>\n<p>Nous pouvons maintenant ajouter une nouvelle fonction racine appelée <code class=\"gatsby-code-text\">unmountTree(containerNode)</code>, semblable à <code class=\"gatsby-code-text\">ReactDOM.unmountComponentAtNode()</code> :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">unmountTree</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">containerNode</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Lit l’instance interne depuis un nœud DOM :</span>\n  <span class=\"token comment\">// (Ça ne fonctionne pas encore, il faudra changer mountTree() pour le stocker.)</span>\n  <span class=\"token keyword\">var</span> node <span class=\"token operator\">=</span> containerNode<span class=\"token punctuation\">.</span>firstChild<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">var</span> rootComponent <span class=\"token operator\">=</span> node<span class=\"token punctuation\">.</span>_internalInstance<span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Démonte l’arbre et efface le conteneur</span>\n  rootComponent<span class=\"token punctuation\">.</span><span class=\"token function\">unmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  containerNode<span class=\"token punctuation\">.</span>innerHTML <span class=\"token operator\">=</span> <span class=\"token string\">''</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Pour que ça fonctionne, nous devons lire une instance interne racine à partir d’un nœud DOM. Nous modifierons <code class=\"gatsby-code-text\">mountTree()</code> pour ajouter la propriété <code class=\"gatsby-code-text\">_internalInstance</code> au nœud DOM racine. Nous apprendrons aussi à <code class=\"gatsby-code-text\">mountTree()</code> à détruire n’importe quel arbre existant, donc nous pourrons l’appeler plusieurs fois :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">mountTree</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element<span class=\"token punctuation\">,</span> containerNode</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Détruit un éventuel arbre existant</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>containerNode<span class=\"token punctuation\">.</span>firstChild<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">unmountTree</span><span class=\"token punctuation\">(</span>containerNode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// Crée l’instance interne racine</span>\n  <span class=\"token keyword\">var</span> rootComponent <span class=\"token operator\">=</span> <span class=\"token function\">instantiateComponent</span><span class=\"token punctuation\">(</span>element<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Monte le composant racine dans un conteneur</span>\n  <span class=\"token keyword\">var</span> node <span class=\"token operator\">=</span> rootComponent<span class=\"token punctuation\">.</span><span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  containerNode<span class=\"token punctuation\">.</span><span class=\"token function\">appendChild</span><span class=\"token punctuation\">(</span>node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Sauvegarde une référence à l’instance interne</span>\n  node<span class=\"token punctuation\">.</span>_internalInstance <span class=\"token operator\">=</span> rootComponent<span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Renvoie l’instance publique fournie</span>\n  <span class=\"token keyword\">var</span> publicInstance <span class=\"token operator\">=</span> rootComponent<span class=\"token punctuation\">.</span><span class=\"token function\">getPublicInstance</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> publicInstance<span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>À présent, l’exécution répétée de <code class=\"gatsby-code-text\">unmountTree()</code> ou de <code class=\"gatsby-code-text\">mountTree()</code> supprime l’ancien arbre et exécute la méthode de cycle de vie <code class=\"gatsby-code-text\">componentWillUnmount()</code> sur les composants.</p>\n<h3 id=\"updating\"><a href=\"#updating\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Mise à jour </h3>\n<p>Dans la section précédente, nous avons implémenté le démontage. Cependant, React ne serait pas très utile si à chaque modification de prop, l’arbre entier était démonté puis remonté. Le but du réconciliateur est de réutiliser dans la mesure du possible les instances existantes afin de préserver le DOM et l’état local :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">var</span> rootEl <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">'root'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">mountTree</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">,</span> rootEl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// Devrait réutiliser le DOM existant :</span>\n<span class=\"token function\">mountTree</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">,</span> rootEl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Nous allons ajouter une méthode supplémentaire au contrat de nos instances internes. En plus de <code class=\"gatsby-code-text\">mount()</code> et <code class=\"gatsby-code-text\">unmount()</code>, <code class=\"gatsby-code-text\">DOMComponent</code> et <code class=\"gatsby-code-text\">CompositeComponent</code> implémenteront une nouvelle méthode appelée <code class=\"gatsby-code-text\">receive(nextElement)</code> :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CompositeComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token function\">receive</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">nextElement</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">DOMComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token function\">receive</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">nextElement</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// ...</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Son travail consiste à faire tout le nécessaire pour mettre à jour le composant (et ses enfants) avec la description fournie par <code class=\"gatsby-code-text\">nextElement</code>.</p>\n<p>C’est la partie qui est souvent décrite comme la « comparaison de DOM virtuel » <em>(virtual DOM diffing, NdT)</em>, même si ça consiste en réalité à parcourir récursivement l’arbre interne pour permettre à chaque instance interne de recevoir une mise à jour.</p>\n<h3 id=\"updating-composite-components\"><a href=\"#updating-composite-components\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Mise à jour des composants composites </h3>\n<p>Lorsqu’un composant composite reçoit un nouvel élément, nous exécutons la méthode de cycle de vie <code class=\"gatsby-code-text\">componentWillUpdate()</code>.</p>\n<p>Ensuite nous rafraîchissons le composant avec les nouvelles props et récupérons le prochain élément issu du rendu :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CompositeComponent</span> <span class=\"token punctuation\">{</span>\n\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token function\">receive</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">nextElement</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">var</span> prevProps <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>currentElement<span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> publicInstance <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>publicInstance<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> prevRenderedComponent <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>renderedComponent<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> prevRenderedElement <span class=\"token operator\">=</span> prevRenderedComponent<span class=\"token punctuation\">.</span>currentElement<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Met à jour l’élément *associé*</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>currentElement <span class=\"token operator\">=</span> nextElement<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> type <span class=\"token operator\">=</span> nextElement<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> nextProps <span class=\"token operator\">=</span> nextElement<span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Détermine quel est le prochain résultat de render()</span>\n    <span class=\"token keyword\">var</span> nextRenderedElement<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token function\">isClass</span><span class=\"token punctuation\">(</span>type<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// Composant basé classe</span>\n      <span class=\"token comment\">// Appelle le cycle de vie si besoin</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>publicInstance<span class=\"token punctuation\">.</span>componentWillUpdate<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        publicInstance<span class=\"token punctuation\">.</span><span class=\"token function\">componentWillUpdate</span><span class=\"token punctuation\">(</span>nextProps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n      <span class=\"token comment\">// Met à jour les props</span>\n      publicInstance<span class=\"token punctuation\">.</span>props <span class=\"token operator\">=</span> nextProps<span class=\"token punctuation\">;</span>\n      <span class=\"token comment\">// Rafraîchit</span>\n      nextRenderedElement <span class=\"token operator\">=</span> publicInstance<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> type <span class=\"token operator\">===</span> <span class=\"token string\">'function'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// Fonction composant</span>\n      nextRenderedElement <span class=\"token operator\">=</span> <span class=\"token function\">type</span><span class=\"token punctuation\">(</span>nextProps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// ...</span></code></pre></div>\n<p>Ensuite, nous pouvons regarder le <code class=\"gatsby-code-text\">type</code> de l’élément produit. Si le <code class=\"gatsby-code-text\">type</code> n’a pas changé depuis le dernier rendu, le composant sous-jacent peut être mis à jour directement.</p>\n<p>Par exemple, s’il renvoie <code class=\"gatsby-code-text\">&lt;Button color=\"red\" /></code> la première fois et <code class=\"gatsby-code-text\">&lt;Button color=\"blue\" /></code> la seconde fois, nous pouvons simplement dire à l’instance interne correspondante de recevoir (<code class=\"gatsby-code-text\">receive()</code>) l’élément mis à jour :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">    <span class=\"token comment\">// ...</span>\n\n    <span class=\"token comment\">// Si le type de l’élément affiché n’a pas changé,</span>\n    <span class=\"token comment\">// réutilise l’instance du composant existant et sort.</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>prevRenderedElement<span class=\"token punctuation\">.</span>type <span class=\"token operator\">===</span> nextRenderedElement<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      prevRenderedComponent<span class=\"token punctuation\">.</span><span class=\"token function\">receive</span><span class=\"token punctuation\">(</span>nextRenderedElement<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// ...</span></code></pre></div>\n<p>Cependant, si l’élément mis à jour a un <code class=\"gatsby-code-text\">type</code> différent de celui affiché jusqu’ici, nous ne pouvons pas mettre à jour l’instance interne. Un <code class=\"gatsby-code-text\">&lt;button></code> ne peut pas simplement « devenir » un <code class=\"gatsby-code-text\">&lt;input></code>.</p>\n<p>Dans ce cas, nous devons démonter l’instance interne existante et monter la nouvelle correspondant au type du nouvel élément. Par exemple, voici ce qui se produit lorsqu’un composant ayant précédemment affiché un <code class=\"gatsby-code-text\">&lt;button /></code> affiche désormais un <code class=\"gatsby-code-text\">&lt;input /></code> :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">    <span class=\"token comment\">// ...</span>\n\n    <span class=\"token comment\">// Si nous arrivons jusqu’ici, nous devons démonter le composant</span>\n    <span class=\"token comment\">// précédemment monté, monter le nouveau et échanger leurs nœuds.</span>\n\n    <span class=\"token comment\">// Récupère l’ancien nœud car il devra être remplacé</span>\n    <span class=\"token keyword\">var</span> prevNode <span class=\"token operator\">=</span> prevRenderedComponent<span class=\"token punctuation\">.</span><span class=\"token function\">getHostNode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Démonte l’ancien élément enfant et en monte un nouveau</span>\n    prevRenderedComponent<span class=\"token punctuation\">.</span><span class=\"token function\">unmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> nextRenderedComponent <span class=\"token operator\">=</span> <span class=\"token function\">instantiateComponent</span><span class=\"token punctuation\">(</span>nextRenderedElement<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> nextNode <span class=\"token operator\">=</span> nextRenderedComponent<span class=\"token punctuation\">.</span><span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Remplace la référence à l’enfant</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>renderedComponent <span class=\"token operator\">=</span> nextRenderedComponent<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Remplace l’ancien nœud par le nouveau.</span>\n    <span class=\"token comment\">// Remarque : il s’agit d’un code spécifique au moteur de rendu et</span>\n    <span class=\"token comment\">// idéalement il devrait vivre en dehors de CompositeComponent :</span>\n    prevNode<span class=\"token punctuation\">.</span>parentNode<span class=\"token punctuation\">.</span><span class=\"token function\">replaceChild</span><span class=\"token punctuation\">(</span>nextNode<span class=\"token punctuation\">,</span> prevNode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>En résumé, lorsqu’un composant composite reçoit un nouvel élément, il peut soit déléguer la mise à jour à son instance interne issue du rendu précédent, soit la démonter et en monter une nouvelle en remplacement.</p>\n<p>Il existe un autre cas dans lequel un composant va être remonté plutôt que de recevoir un élément : lorsque la <code class=\"gatsby-code-text\">key</code> de cet élément a été modifiée. Nous ne voyons pas la gestion des <code class=\"gatsby-code-text\">key</code> dans ce document, car elle ajoute une complexité supplémentaire à un tutoriel déjà velu.</p>\n<p>Remarquez que nous devons encore ajouter une méthode appelée <code class=\"gatsby-code-text\">getHostNode()</code> à l’instance interne afin qu’il soit possible de localiser le nœud spécifique à la plate-forme et de le remplacer lors de la mise à jour. Son implémentation est simple pour les deux classes :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">CompositeComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token function\">getHostNode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Demande au composant issu du rendu de le fournir.</span>\n    <span class=\"token comment\">// Ça analysera récursivement tous les composites.</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>renderedComponent<span class=\"token punctuation\">.</span><span class=\"token function\">getHostNode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">DOMComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token function\">getHostNode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"updating-host-components\"><a href=\"#updating-host-components\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Mise à jour des composants hôtes </h3>\n<p>Les implémentations de composant hôte, comme <code class=\"gatsby-code-text\">DOMComponent</code>, font leurs mises à jour différemment. À la réception d’un élément, ils ont besoin de mettre à jour la vue spécifique à la plate-forme sous-jacente. Dans le cas de React DOM, ça implique de mettre à jour les attributs DOM :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">class</span> <span class=\"token class-name\">DOMComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// ...</span>\n\n  <span class=\"token function\">receive</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">nextElement</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">var</span> node <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> prevElement <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>currentElement<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> prevProps <span class=\"token operator\">=</span> prevElement<span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> nextProps <span class=\"token operator\">=</span> nextElement<span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>currentElement <span class=\"token operator\">=</span> nextElement<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Supprime les anciens attributs.</span>\n    Object<span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span>prevProps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">propName</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>propName <span class=\"token operator\">!==</span> <span class=\"token string\">'children'</span> <span class=\"token operator\">&amp;&amp;</span> <span class=\"token operator\">!</span>nextProps<span class=\"token punctuation\">.</span><span class=\"token function\">hasOwnProperty</span><span class=\"token punctuation\">(</span>propName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        node<span class=\"token punctuation\">.</span><span class=\"token function\">removeAttribute</span><span class=\"token punctuation\">(</span>propName<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\">// Initialise les nouveaux attributs.</span>\n    Object<span class=\"token punctuation\">.</span><span class=\"token function\">keys</span><span class=\"token punctuation\">(</span>nextProps<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">propName</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>propName <span class=\"token operator\">!==</span> <span class=\"token string\">'children'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        node<span class=\"token punctuation\">.</span><span class=\"token function\">setAttribute</span><span class=\"token punctuation\">(</span>propName<span class=\"token punctuation\">,</span> nextProps<span class=\"token punctuation\">[</span>propName<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// ...</span></code></pre></div>\n<p>Ensuite, les composants hôtes doivent mettre à jour leurs enfants. Contrairement aux composants composites, ils peuvent posséder plusieurs enfants.</p>\n<p>Dans cet exemple simplifié, nous utilisons un tableau d’instances internes et itérons dessus. Si le <code class=\"gatsby-code-text\">type</code> reçu des instances internes correspond au <code class=\"gatsby-code-text\">type</code> précédent, nous les mettons à jour, sinon nous les remplaçons. Le vrai réconciliateur prend également en compte la <code class=\"gatsby-code-text\">key</code> de l’élément et détecte les déplacements en plus des insertions et des suppressions, mais nous omettons cette logique.</p>\n<p>Nous collectons les opérations DOM sur les enfants dans une liste, afin de pouvoir les exécuter par lot :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">    <span class=\"token comment\">// ...</span>\n\n    <span class=\"token comment\">// Ce sont des tableaux d’éléments React :</span>\n    <span class=\"token keyword\">var</span> prevChildren <span class=\"token operator\">=</span> prevProps<span class=\"token punctuation\">.</span>children <span class=\"token operator\">||</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>Array<span class=\"token punctuation\">.</span><span class=\"token function\">isArray</span><span class=\"token punctuation\">(</span>prevChildren<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      prevChildren <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>prevChildren<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">var</span> nextChildren <span class=\"token operator\">=</span> nextProps<span class=\"token punctuation\">.</span>children <span class=\"token operator\">||</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>Array<span class=\"token punctuation\">.</span><span class=\"token function\">isArray</span><span class=\"token punctuation\">(</span>nextChildren<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      nextChildren <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>nextChildren<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n    <span class=\"token comment\">// Ce sont des tableaux d’instances internes :</span>\n    <span class=\"token keyword\">var</span> prevRenderedChildren <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>renderedChildren<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> nextRenderedChildren <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Au fil de l’itération sur les enfants, nous ajouterons des opérations dans le tableau.</span>\n    <span class=\"token keyword\">var</span> operationQueue <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Remarque : la section ci-dessous est extrêmement simplifiée !</span>\n    <span class=\"token comment\">// Elle ne gère pas le réordonnancement, les enfants avec des trous ou les clés (`key`).</span>\n    <span class=\"token comment\">// Elle existe uniquement pour illustrer le flux général, pas les détails.</span>\n\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> i <span class=\"token operator\">=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">;</span> i <span class=\"token operator\">&lt;</span> nextChildren<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> i<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\">// Essaie de récupérer une instance interne existante pour cet enfant</span>\n      <span class=\"token keyword\">var</span> prevChild <span class=\"token operator\">=</span> prevRenderedChildren<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">// S’il n’y a aucune instance interne pour cet index,</span>\n      <span class=\"token comment\">// c’est qu’un enfant a été ajouté à la fin. Nous créons une nouvelle</span>\n      <span class=\"token comment\">// instance interne, nous la montons, et nous utilisons son nœud.</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>prevChild<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">var</span> nextChild <span class=\"token operator\">=</span> <span class=\"token function\">instantiateComponent</span><span class=\"token punctuation\">(</span>nextChildren<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">var</span> node <span class=\"token operator\">=</span> nextChild<span class=\"token punctuation\">.</span><span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Enregistre le besoin d'ajouter un nœud</span>\n        operationQueue<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">type</span><span class=\"token operator\">:</span> <span class=\"token string\">'ADD'</span><span class=\"token punctuation\">,</span> node<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        nextRenderedChildren<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>nextChild<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n\n      <span class=\"token comment\">// Nous ne pouvons mettre à jour l’instance que si le type de son élément est identique.</span>\n      <span class=\"token comment\">// Par exemple, &lt;Button size=\"small\" /> peut être mis à jour par</span>\n      <span class=\"token comment\">// &lt;Button size=\"large\" /> mais pas par un &lt;App />.</span>\n      <span class=\"token keyword\">var</span> canUpdate <span class=\"token operator\">=</span> prevChildren<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>type <span class=\"token operator\">===</span> nextChildren<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">// Si nous ne pouvons pas mettre à jour une instance existante, nous devons la démonter</span>\n      <span class=\"token comment\">// et monter une nouvelle à la place.</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>canUpdate<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">var</span> prevNode <span class=\"token operator\">=</span> prevChild<span class=\"token punctuation\">.</span><span class=\"token function\">getHostNode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        prevChild<span class=\"token punctuation\">.</span><span class=\"token function\">unmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token keyword\">var</span> nextChild <span class=\"token operator\">=</span> <span class=\"token function\">instantiateComponent</span><span class=\"token punctuation\">(</span>nextChildren<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">var</span> nextNode <span class=\"token operator\">=</span> nextChild<span class=\"token punctuation\">.</span><span class=\"token function\">mount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n        <span class=\"token comment\">// Enregistre le besoin de remplacer un nœud</span>\n        operationQueue<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">type</span><span class=\"token operator\">:</span> <span class=\"token string\">'REPLACE'</span><span class=\"token punctuation\">,</span> prevNode<span class=\"token punctuation\">,</span> nextNode<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        nextRenderedChildren<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>nextChild<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">continue</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n\n      <span class=\"token comment\">// Si nous pouvons mettre à jour une instance existante,</span>\n      <span class=\"token comment\">// laissons-la simplement recevoir l’élément cible et gérer sa propre mise à jour.</span>\n      prevChild<span class=\"token punctuation\">.</span><span class=\"token function\">receive</span><span class=\"token punctuation\">(</span>nextChildren<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      nextRenderedChildren<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>prevChild<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Enfin, démonte tous les enfants qui n’existent pas :</span>\n    <span class=\"token keyword\">for</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">var</span> j <span class=\"token operator\">=</span> nextChildren<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> j <span class=\"token operator\">&lt;</span> prevChildren<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">;</span> j<span class=\"token operator\">++</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">var</span> prevChild <span class=\"token operator\">=</span> prevRenderedChildren<span class=\"token punctuation\">[</span>j<span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">var</span> node <span class=\"token operator\">=</span> prevChild<span class=\"token punctuation\">.</span><span class=\"token function\">getHostNode</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      prevChild<span class=\"token punctuation\">.</span><span class=\"token function\">unmount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token comment\">// Enregistre le besoin de supprimer un nœud</span>\n      operationQueue<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span><span class=\"token literal-property property\">type</span><span class=\"token operator\">:</span> <span class=\"token string\">'REMOVE'</span><span class=\"token punctuation\">,</span> node<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Actualise la liste des enfants issus du rendu.</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>renderedChildren <span class=\"token operator\">=</span> nextRenderedChildren<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// ...</span></code></pre></div>\n<p>Pour finir, nous exécutons les opérations sur le DOM. Encore une fois, le vrai code du réconciliateur est plus complexe car il gère également les déplacements :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">    <span class=\"token comment\">// ...</span>\n\n    <span class=\"token comment\">// Traite les opérations dans la file d’attente</span>\n    <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span>operationQueue<span class=\"token punctuation\">.</span>length <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">var</span> operation <span class=\"token operator\">=</span> operationQueue<span class=\"token punctuation\">.</span><span class=\"token function\">shift</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">switch</span> <span class=\"token punctuation\">(</span>operation<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">case</span> <span class=\"token string\">'ADD'</span><span class=\"token operator\">:</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">.</span><span class=\"token function\">appendChild</span><span class=\"token punctuation\">(</span>operation<span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">case</span> <span class=\"token string\">'REPLACE'</span><span class=\"token operator\">:</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">.</span><span class=\"token function\">replaceChild</span><span class=\"token punctuation\">(</span>operation<span class=\"token punctuation\">.</span>nextNode<span class=\"token punctuation\">,</span> operation<span class=\"token punctuation\">.</span>prevNode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">case</span> <span class=\"token string\">'REMOVE'</span><span class=\"token operator\">:</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">.</span><span class=\"token function\">removeChild</span><span class=\"token punctuation\">(</span>operation<span class=\"token punctuation\">.</span>node<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n        <span class=\"token keyword\">break</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Et c’est tout pour la mise à jour des composants hôtes.</p>\n<h3 id=\"top-level-updates\"><a href=\"#top-level-updates\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Mise à jour de la racine </h3>\n<p>Maintenant que <code class=\"gatsby-code-text\">CompositeComponent</code> et <code class=\"gatsby-code-text\">DOMComponent</code> implémentent la méthode <code class=\"gatsby-code-text\">receive(nextElement)</code>, nous pouvons modifier la fonction racine <code class=\"gatsby-code-text\">mountTree()</code> pour l’utiliser lorsque le <code class=\"gatsby-code-text\">type</code> de l’élément est identique à celui de la dernière fois :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">mountTree</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element<span class=\"token punctuation\">,</span> containerNode</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Vérifie l'existence d’un arbre</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>containerNode<span class=\"token punctuation\">.</span>firstChild<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">var</span> prevNode <span class=\"token operator\">=</span> containerNode<span class=\"token punctuation\">.</span>firstChild<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> prevRootComponent <span class=\"token operator\">=</span> prevNode<span class=\"token punctuation\">.</span>_internalInstance<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">var</span> prevElement <span class=\"token operator\">=</span> prevRootComponent<span class=\"token punctuation\">.</span>currentElement<span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\">// Si possible, réutilise le composant racine existant</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>prevElement<span class=\"token punctuation\">.</span>type <span class=\"token operator\">===</span> element<span class=\"token punctuation\">.</span>type<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      prevRootComponent<span class=\"token punctuation\">.</span><span class=\"token function\">receive</span><span class=\"token punctuation\">(</span>element<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\">// Autrement, démonte l’arborescence existante</span>\n    <span class=\"token function\">unmountTree</span><span class=\"token punctuation\">(</span>containerNode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\">// ...</span>\n\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Désormais, appeler deux fois <code class=\"gatsby-code-text\">mountTree()</code> avec le même type n’est plus destructif :</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">var</span> rootEl <span class=\"token operator\">=</span> document<span class=\"token punctuation\">.</span><span class=\"token function\">getElementById</span><span class=\"token punctuation\">(</span><span class=\"token string\">'root'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token function\">mountTree</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">,</span> rootEl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// Réutilise le DOM existant :</span>\n<span class=\"token function\">mountTree</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">,</span> rootEl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Et voilà les bases du fonctionnement interne de React.</p>\n<h3 id=\"what-we-left-out\"><a href=\"#what-we-left-out\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Ce que nous avons laissé de côté </h3>\n<p>Ce document est simplifié par rapport au vrai code. Il y a quelques aspects importants que nous n’avons pas abordés :</p>\n<ul>\n<li>Les composants peuvent faire un rendu à <code class=\"gatsby-code-text\">null</code> et le réconciliateur peut gérer des « emplacements vides » dans les tableaux et le résultat du rendu.</li>\n<li>Le réconciliateur lit également la <code class=\"gatsby-code-text\">key</code> des éléments, et l’utilise pour déterminer quelle instance interne correspond à quel élément dans un tableau. Une grande partie de la complexité de la véritable implémentation de React est liée à ça.</li>\n<li>En plus des classes d’instance interne composite et hôte, il existe également des classes pour les composants « texte » et « vide ». Ils représentent des nœuds de texte et des « emplacements vides » que vous obtenez en faisant un rendu <code class=\"gatsby-code-text\">null</code>.</li>\n<li>Les moteurs de rendu utilisent l’<a href=\"/docs/codebase-overview.html#dynamic-injection\">injection</a> pour passer la classe interne hôte au réconciliateur. Par exemple, React DOM indique au réconciliateur d’utiliser <code class=\"gatsby-code-text\">ReactDOMComponent</code> pour l’implémentation de l’instance interne hôte.</li>\n<li>La logique de mise à jour de la liste des enfants est extraite dans un <em>mixin</em> appelé <code class=\"gatsby-code-text\">ReactMultiChild</code>, utilisé par les implémentations de la classe d’instance interne hôte dans React DOM comme dans React Native.</li>\n<li>Le réconciliateur implémente également la prise en charge de <code class=\"gatsby-code-text\">setState()</code> dans les composants composites. Les mises à jour d’état multiples dans les gestionnaires d’événements sont regroupées en lot pour une mise à jour unique.</li>\n<li>Le réconciliateur prend également en charge l’attachement et le détachement des refs aux composants composites et aux nœuds hôtes.</li>\n<li>Les méthodes de cycle de vie appelées une fois que le DOM est prêt, telles que <code class=\"gatsby-code-text\">componentDidMount()</code> et <code class=\"gatsby-code-text\">componentDidUpdate()</code>, sont rassemblées dans des « files d’attente de fonctions de rappel » et exécutées en un seul lot.</li>\n<li>React stocke les informations sur la mise à jour en cours dans un objet interne appelé « transaction ». Les transactions sont utiles pour garder trace de la liste des méthodes de cycle de vie en attente, de l’imbrication actuelle du DOM pour les avertissements et de tout ce qui est « global » à une mise à jour spécifique. Les transactions garantissent également que React « nettoie tout » après les mises à jour. Par exemple, la classe de transaction fournie par React DOM restaure après toute mise à jour l’éventuelle sélection d’une saisie.</li>\n</ul>\n<h3 id=\"jumping-into-the-code\"><a href=\"#jumping-into-the-code\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Sauter dans le code </h3>\n<ul>\n<li><a href=\"https://github.com/facebook/react/blob/83381c1673d14cd16cf747e34c945291e5518a86/src/renderers/dom/client/ReactMount.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">ReactMount</code></a> est l’endroit où réside le code équivalent aux <code class=\"gatsby-code-text\">mountTree()</code> et <code class=\"gatsby-code-text\">unmountTree()</code> de ce tutoriel. Il s’occupe du montage et du démontage des composants racines. <a href=\"https://github.com/facebook/react/blob/83381c1673d14cd16cf747e34c945291e5518a86/src/renderers/native/ReactNativeMount.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">ReactNativeMount</code></a> est son homologue pour React Native.</li>\n<li><a href=\"https://github.com/facebook/react/blob/83381c1673d14cd16cf747e34c945291e5518a86/src/renderers/dom/shared/ReactDOMComponent.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">ReactDOMComponent</code></a> est l’équivalent de <code class=\"gatsby-code-text\">DOMComponent</code> dans ce tutoriel. Il implémente la classe de composant hôte pour le moteur de rendu de React DOM. <a href=\"https://github.com/facebook/react/blob/83381c1673d14cd16cf747e34c945291e5518a86/src/renderers/native/ReactNativeBaseComponent.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">ReactNativeBaseComponent</code></a> est son équivalent React Native.</li>\n<li><a href=\"https://github.com/facebook/react/blob/83381c1673d14cd16cf747e34c945291e5518a86/src/renderers/shared/stack/reconciler/ReactCompositeComponent.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">ReactCompositeComponent</code></a> est l’équivalent de <code class=\"gatsby-code-text\">CompositeComponent</code> dans ce tutoriel. Il gère l’appel des composants définis par l’utilisateur et la maintenance de leur état local.</li>\n<li><a href=\"https://github.com/facebook/react/blob/83381c1673d14cd16cf747e34c945291e5518a86/src/renderers/shared/stack/reconciler/instantiateReactComponent.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">instantiateReactComponent</code></a> contient le code qui sélectionne la classe d’instance interne appropriée pour construire un élément. C’est l’équivalent de <code class=\"gatsby-code-text\">instantiateComponent()</code> dans ce tutoriel.</li>\n<li><a href=\"https://github.com/facebook/react/blob/83381c1673d14cd16cf747e34c945291e5518a86/src/renderers/shared/stack/reconciler/ReactReconciler.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">ReactReconciler</code></a> est un enrobage avec les méthodes <code class=\"gatsby-code-text\">mountComponent()</code>, <code class=\"gatsby-code-text\">receiveComponent()</code> et <code class=\"gatsby-code-text\">unmountComponent()</code>. Il appelle les implémentations sous-jacentes des instances internes, mais contient en prime du code de gestion partagé par toutes ces implémentations.</li>\n<li><a href=\"https://github.com/facebook/react/blob/83381c1673d14cd16cf747e34c945291e5518a86/src/renderers/shared/stack/reconciler/ReactChildReconciler.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">ReactChildReconciler</code></a> implémente la logique de montage, de mise à jour et de démontage des enfants en fonction de la <code class=\"gatsby-code-text\">key</code> de leurs éléments.</li>\n<li><a href=\"https://github.com/facebook/react/blob/83381c1673d14cd16cf747e34c945291e5518a86/src/renderers/shared/stack/reconciler/ReactMultiChild.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><code class=\"gatsby-code-text\">ReactMultiChild</code></a> implémente le traitement de la file d’attente des opérations pour les insertions, les suppressions et les déplacements d’enfants indépendamment du moteur de rendu.</li>\n<li><code class=\"gatsby-code-text\">mount()</code>, <code class=\"gatsby-code-text\">receive()</code> et <code class=\"gatsby-code-text\">unmount()</code> sont nommées en réalité <code class=\"gatsby-code-text\">mountComponent()</code>, <code class=\"gatsby-code-text\">receiveComponent()</code> et <code class=\"gatsby-code-text\">unmountComponent()</code> dans la base de code React pour des raisons historiques, mais elles reçoivent des éléments.</li>\n<li>Les propriétés des instances internes commencent par un tiret bas <em>(underscore, NdT)</em>, par exemple <code class=\"gatsby-code-text\">_currentElement</code>. Elles sont considérées dans la base de code comme des champs publics en lecture seule.</li>\n</ul>\n<h3 id=\"future-directions\"><a href=\"#future-directions\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Orientations futures </h3>\n<p>Le réconciliateur <em>“stack”</em> a des limitations intrinsèques, comme le fait qu’il soit synchrone et incapable d’interrompre le travail ou de le découper en plusieurs morceaux. Le <a href=\"/docs/codebase-overview.html#fiber-reconciler\">nouveau réconciliateur <em>“fiber”</em></a> a une <a href=\"https://github.com/acdlite/react-fiber-architecture\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">architecture complètement différente</a>. À partir de React 16, il remplace le réconciliateur <em>“stack”</em>.</p>\n<h3 id=\"next-steps\"><a href=\"#next-steps\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Prochaines étapes </h3>\n<p>Lisez la <a href=\"/docs/design-principles.html\">page suivante</a> pour en apprendre davantage sur les principes de conception que nous utilisons pour le développement de React.</p>","frontmatter":{"title":"Notes d’implémentation","next":"design-principles.html","prev":"codebase-overview.html"},"fields":{"path":"content/docs/implementation-notes.md","slug":"docs/implementation-notes.html"}}},"pageContext":{"slug":"docs/implementation-notes.html"}},"staticQueryHashes":[]}