{"componentChunkName":"component---src-templates-docs-js","path":"/docs/implementation-notes.html","result":{"data":{"markdownRemark":{"html":"<p>Esta seção é um conjunto de notas de implementação para o <a href=\"/docs/codebase-overview.html#stack-reconciler\">reconciliador de pilha</a>.</p>\n<p>Ela é bastante técnica e assume um forte entendimento da API pública do React, assim como da sua divisão em núcleos, renderizadores e o próprio reconciliador. Se você não estiver muito familiarizado com o código do React, leia a <a href=\"/docs/codebase-overview.html\">visão geral da base de código</a> primeiro.</p>\n<p>Também é pressuposto o entendimento da <a href=\"/blog/2015/12/18/react-components-elements-and-instances.html\">diferença entre componentes React, suas instâncias e elementos</a>.</p>\n<p>O reconciliador de pilha foi usado no React 15 e em versões anteriores. Está localizado em <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>Vídeo: Construindo React do zero </h3>\n<p><a href=\"https://twitter.com/zpao\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Paul O’Shannessy</a> deu uma palestra sobre <a href=\"https://www.youtube.com/watch?v=_MAD4Oly9yg\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">construir React do zero</a> que muito inspirou esse documento.</p>\n<p>Tanto este texto quanto a palestra são simplificações da real base de código, então se familiarizar com os dois pode resultar em um entendimento melhor.</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>Visão geral </h3>\n<p>O reconciliador em si não possui uma API pública. <a href=\"/docs/codebase-overview.html#renderers\">Renderizadores</a> como o React DOM e React Native usam-no para atualizar a interface do usuário de acordo com os componentes React escritos pelo usuário.</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>Montagem como um Processo Recursivo </h3>\n<p>Vamos considerar a primeira vez que você monta um componente:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">ReactDOM<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> rootEl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>O React DOM passará <code class=\"gatsby-code-text\">&lt;App /&gt;</code> para o reconciliador. Lembre-se que <code class=\"gatsby-code-text\">&lt;App /&gt;</code> é um elemento React, isto é, uma descrição <em>do quê</em> renderizar. Você pode pensar nele como um simples objeto:</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>O reconciliador irá verificar se <code class=\"gatsby-code-text\">App</code> é uma classe ou uma função.</p>\n<p>Se <code class=\"gatsby-code-text\">App</code> for uma função, o reconciliador chamará <code class=\"gatsby-code-text\">App(props)</code> para obter o elemento renderizado.</p>\n<p>Se <code class=\"gatsby-code-text\">App</code> for uma classe, o reconciliador instanciará <code class=\"gatsby-code-text\">App</code> com <code class=\"gatsby-code-text\">new App(props)</code>, chamará o método de ciclo de vida <code class=\"gatsby-code-text\">componentWillMount()</code>, e por fim chamando o método render()` para obter o elemento renderizado.</p>\n<p>De qualquer forma, o reconciliador saberá em que elemento o <code class=\"gatsby-code-text\">App</code> foi “renderizado”.</p>\n<p>Esse processo é recursivo. <code class=\"gatsby-code-text\">App</code> talvez seja renderizado para um <code class=\"gatsby-code-text\">&lt;Greeting /&gt;</code>, <code class=\"gatsby-code-text\">Greeting</code> talvez seja renderizado para um <code class=\"gatsby-code-text\">&lt;Button /&gt;</code>, e assim por diante. O reconciliador irá “investigar” os componentes definidos pelo usuário recursivamente enquanto ele aprende para o quê cada um será renderizado.</p>\n<p>Você pode imaginar esse processo como um pseudo-código:</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\">// Subclasses React.Component possuem essa flag</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\">// Essa função recebe um elemento React (e.g. &lt;App />)</span>\n<span class=\"token comment\">// e retorna um DOM ou nó Nativo representando a árvore montada.</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\">// Nós vamos determinar o elemento renderizado</span>\n  <span class=\"token comment\">// executando o tipo como função</span>\n  <span class=\"token comment\">// ou criando uma instância e chamando 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\">// Componente de 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\">// Define as 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\">// Chama o ciclo de vida se necessário</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\">// Obtêm o elemento renderizado ao chamar 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\">// Componente de função</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\">// Esse processo é recursivo pois um componente pode</span>\n  <span class=\"token comment\">// retornar um elemento com o tipo de outro componente.</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\">// Nota: essa implementação é incompleta e recorre infinitamente!</span>\n  <span class=\"token comment\">// Ela só lida com elementos &lt;App /> ou &lt;Button />.</span>\n  <span class=\"token comment\">// Ela não lida com elementos como &lt;div /> ou &lt;p /> ainda.</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><strong>Nota:</strong></p>\n<p>Isso realmente <em>é</em> um pseudocódigo. Não é semelhante a implementação real. Causará um estouro de pilha porque não discutimos quando parar a recursão.</p>\n</blockquote>\n<p>Recapitulando alguns conceitos chaves do exemplo acima:</p>\n<ul>\n<li>Os elementos do React são objetos simples que representam o tipo do componente (e.g. <code class=\"gatsby-code-text\">App</code>) e as props.</li>\n<li>Componentes definidos pelo usuário (e.g. <code class=\"gatsby-code-text\">App</code>) podem ser classes ou funções mas todos eles “se renderizam” a um elemento.</li>\n<li>“Montagem” é um processo recursivo que cria uma árvore DOM ou Nativa dado um elemento React de nível superior (e.g. <code class=\"gatsby-code-text\">&lt;App /&gt;</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>Montando Elementos Hospedeiros </h3>\n<p>Esse processo seria inútil se o resultado não fosse renderizar algo na tela.</p>\n<p>Além dos componentes definidos pelo usuário (“compostos”), elementos React podem também representar componentes (“hospedeiros”) para plataformas específicas. Por exemplo, <code class=\"gatsby-code-text\">Button</code> pode retornar uma <code class=\"gatsby-code-text\">&lt;div /&gt;</code> no seu método render.</p>\n<p>Se a propriedade <code class=\"gatsby-code-text\">type</code> for uma string, estamos lidando com um elemento hospedeiro:</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>Não há código definido pelo usuário associado com elementos do tipo hospedeiro.</p>\n<p>Quando o reconciliador encontra um elemento hospedeiro, ele permite que o renderizador cuide da montagem. Por exemplo, o React DOM criaria um nó do DOM.</p>\n<p>Se o elemento hospedeiro possuir filhos, o reconciliador recursivamente os monta seguindo o mesmo algoritmo descrito acima. Não importa se os filhos são hospedeiros (como <code class=\"gatsby-code-text\">&lt;div&gt;&lt;hr /&gt;&lt;/div&gt;</code>) ou se são compostos (como <code class=\"gatsby-code-text\">&lt;div&gt;&lt;Button /&gt;&lt;/div&gt;</code>), ou os dois.</p>\n<p>Os nós DOM produzidos pelos componentes filhos serão anexados ao nó DOM pai, e, recursivamente, a completa estrutura DOM será construída.</p>\n<blockquote>\n<p><strong>Nota:</strong></p>\n<p>O reconciliador em si não está ligado ao DOM. O exato resultado da montagem (por vezes chamada de “mount image” no código fonte) depende do renderizador, e pode ser um nó do DOM (React DOM), uma string (React DOM Server), ou um número representando uma view nativa (React Native).</p>\n</blockquote>\n<p>Se fôssemos estender o código para lidar com elementos hospedeiros, ficaria assim:</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\">// Subclasses React.Component possuem essa flag</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\">// Essa função apenas lida com elementos do tipo composto.</span>\n<span class=\"token comment\">// Por exemplo, ela lida com &lt;App /> e &lt;Button />, mas não com uma &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\">// Componente de 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\">// Define as 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\">// Chama o ciclo de vida se necessário</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\">// Componente de função</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\">// Isso é recursivo mas eventualmente chegaremos no fim da recursão quando</span>\n  <span class=\"token comment\">// o elemento for o hospedeiro (e.g. &lt;div />) ao invés de composto (e.g. &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\">// Essa função apenas lida com elementos do tipo hospedeiro.</span>\n<span class=\"token comment\">// Por exemplo, ela lida com &lt;div /> e &lt;p /> mas não com um &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\">// Esse bloco de código não deveria estar no reconciliador.</span>\n  <span class=\"token comment\">// Renderizadores diferentes podem inicializar nós diferentemente.</span>\n  <span class=\"token comment\">// Por exemplo, React Native iria criar views de 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\">// Monta os filhos</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\">// Filhos podem ser hospedeiros (e.g. &lt;div />) ou compostos (e.g &lt;Button />).</span>\n    <span class=\"token comment\">// Também os montaremos recursivamente:</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\">// Essa linha de código também é específica do renderizador.</span>\n    <span class=\"token comment\">// Ela seria diferente dependendo do renderizador:</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\">// Retorna o nó do DOM como resultado da montagem.</span>\n  <span class=\"token comment\">// Aqui é onde a recursão acaba.</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\">// Componentes definidos pelo usuário</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\">// Componentes de plataformas específicas</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>Isto funciona mas ainda está longe de como o reconciliador é realmente implementado. O ingrediente que falta é o suporte para atualizações.</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>Introduzindo instâncias Internas </h3>\n<p>A característica principal do React é que você pode re-renderizar tudo, e ele não irá recriar o DOM ou resetar o estado.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">ReactDOM<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> rootEl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">// Deve reutilizar o DOM existente:</span>\nReactDOM<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> rootEl<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Contudo, a nossa implementação acima apenas sabe como montar a árvore inicial. Ela não executa atualizações na árvore pois não armazena todas as informações necessárias, como todas as <code class=\"gatsby-code-text\">publicInstance</code>s, ou quais nós do DOM correspondem a qual componente.</p>\n<p>O código do reconciliador de pilha resolve isso fazendo a função <code class=\"gatsby-code-text\">mount()</code> um método e a colocando em uma classe. Existem desvantagens para essa abordagem, e nos iremos na direção oposta na <a href=\"/docs/codebase-overview.html#fiber-reconciler\">atual reescrita do reconciliador</a>. No entanto, é assim que funciona atualmente.</p>\n<p>Ao invés de funções <code class=\"gatsby-code-text\">mountHost</code> e <code class=\"gatsby-code-text\">mountComposite</code> separadas, nós criaremos duas classes: <code class=\"gatsby-code-text\">DOMComponent</code> e <code class=\"gatsby-code-text\">CompositeComponent</code>.</p>\n<p>Ambas as classes possuem um construtor aceitando o <code class=\"gatsby-code-text\">element</code>, assim como um método <code class=\"gatsby-code-text\">mount()</code> retornando o nó montado. Nós iremos trocar a função de nível superior <code class=\"gatsby-code-text\">mount()</code> com uma <em>factory</em> que instancia a classe correta.</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 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 comment\">// Componentes definidos pelo usuário</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\">// Componentes de plataformas específicas</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>Primeiro, vamos considerar a implementação 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\">// Para componentes compostos, exponha a instância da 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\">// Componente de 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\">// Define as 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\">// Chama o ciclo de vida se necessário</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\">// Componente de função</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\">// Salva a instância pública</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\">// Instancia a instância interna filha de acordo com o elemento.</span>\n    <span class=\"token comment\">// Seria algo como um DOMComponent para &lt;div /> ou &lt;p />,</span>\n    <span class=\"token comment\">// e um CompositeComponent para &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\">// Monta o output renderizado</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>Isso não é muito diferente da nossa implementação anterior de <code class=\"gatsby-code-text\">mountComposite</code>, mas agora podemos salvar algumas informações, como <code class=\"gatsby-code-text\">this.currentElement</code>, <code class=\"gatsby-code-text\">this.renderedComponent</code>, e <code class=\"gatsby-code-text\">this.publicInstance</code> , para usar durante atualizações.</p>\n<p>Note que uma instância de <code class=\"gatsby-code-text\">CompositeComponent</code> não é a mesma coisa que uma instância de um <code class=\"gatsby-code-text\">element.type</code> fornecida pelo usuário. <code class=\"gatsby-code-text\">CompositeComponent</code> é um detalhe de implementação do nosso reconciliador e nunca é exposto para o usuário. A classe definida pelo usuário é quem lê de <code class=\"gatsby-code-text\">element.type</code> e <code class=\"gatsby-code-text\">CompositeComponent</code> cria uma instância dela.</p>\n<p>Para evitar confusão, nós vamos chamar instâncias de <code class=\"gatsby-code-text\">CompositeComponent</code> e <code class=\"gatsby-code-text\">DOMComponent</code> de “instâncias internas”. Elas existem para que possamos associá-las a alguns dados de longa vida. Apenas o renderizador e o reconciliador sabem que elas existem.</p>\n<p>Em contraste, nós chamamos uma instância de uma classe definida pelo usuário uma “instância pública”. A instância pública é o que você vê como <code class=\"gatsby-code-text\">this</code> no <code class=\"gatsby-code-text\">render()</code> e outros métodos de seus componentes customizados.</p>\n<p>A função <code class=\"gatsby-code-text\">mountHost()</code>, refatorada para ser um método <code class=\"gatsby-code-text\">mount()</code> na classe <code class=\"gatsby-code-text\">DOMComponent</code>, também é familiar:</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\">// For DOM components, only expose the DOM node.</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\">// Cria e salva o nó</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\">// Define os atributos</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\">// Cria e salva os filhos contidos.</span>\n    <span class=\"token comment\">// Cada um deles pode ser um DOMComponent ou um CompositeComponent</span>\n    <span class=\"token comment\">// dependendo se o tipo do elemento é uma string ou uma função.</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\">// Coleta nos DOM retornados na montagem</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\">// Retorna o nó do DOM como resultado da montagem</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>A diferença principal depois de refatorar <code class=\"gatsby-code-text\">mountHost()</code> é que agora nós podemos deixar <code class=\"gatsby-code-text\">this.node</code> e <code class=\"gatsby-code-text\">this.renderedChildren</code> associados com a instância interna do componente DOM. Nós também os usaremos para aplicar atualizações não destrutivas no futuro.</p>\n<p>Como resultado, cada instância interna, composta ou hospedeira, agora aponta para sua instância interna filha. Para auxiliar na visualização disso, se o componente de função <code class=\"gatsby-code-text\">&lt;App&gt;</code> renderiza um componente de classe, e a classe <code class=\"gatsby-code-text\">Button</code> renderiza a <code class=\"gatsby-code-text\">&lt;div&gt;</code>, a árvore da instância interna ficaria assim:</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  currentElement<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  publicInstance<span class=\"token operator\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  renderedComponent<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>object CompositeComponent<span class=\"token punctuation\">]</span> <span class=\"token punctuation\">{</span>\n    currentElement<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    publicInstance<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>object Button<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n    renderedComponent<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>object DOMComponent<span class=\"token punctuation\">]</span> <span class=\"token punctuation\">{</span>\n      currentElement<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      node<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>object HTMLDivElement<span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n      renderedChildren<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>No DOM você apenas veria a <code class=\"gatsby-code-text\">&lt;div&gt;</code>. No entanto, a árvore da instância interna possui ambas instâncias internas: composta e hospedeira.</p>\n<p>A instância interna composta precisa armazenar:</p>\n<ul>\n<li>O elemento atual.</li>\n<li>A instância pública se o tipo do elemento for uma classe.</li>\n<li>A instância interna única renderizada. Pode ser tanto um <code class=\"gatsby-code-text\">DOMComponent</code> ou um <code class=\"gatsby-code-text\">CompositeComponent</code>.</li>\n</ul>\n<p>A instância interna hospedeira precisa armazenar:</p>\n<ul>\n<li>O elemento atual.</li>\n<li>O nó do DOM.</li>\n<li>Todas as instâncias internas filhas. Cada uma delas pode ser tanto um <code class=\"gatsby-code-text\">DOMComponent</code> ou um <code class=\"gatsby-code-text\">CompositeComponent</code>.</li>\n</ul>\n<p>Se você está tendo dificuldades para imaginar como uma árvore de instâncias internas é estruturada em aplicações mais complexas, <a href=\"https://github.com/facebook/react-devtools\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React DevTools</a> pode te dar uma boa aproximação, pois instâncias hospedeiras são marcadas com cinza, e instâncias compostas com roxo:</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(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAIAAADtbgqsAAAACXBIWXMAAAsSAAALEgHS3X78AAABaUlEQVQoz5VSa2/bMAzM//9vBTo08VwvWWw5kmW9n7Ysy/LUNliBtii2A8Uv0pHHow5CCkIJF5wyap1dYkzbtv8bDuu6soGNV1w9nC71haBejNA7Z50LPuS8v0Z+yx/JKaURYPQM/ehy2Lfogx4mr+fZxXne87edy0lb0lYbqx3rJVdoiH0/XS62A+52myjVbXsVQgAAlFLGmNLvnVz0KKk454vXSwjOrcZEKRetojVpCatSMszBWru84q/+w5azZZaeCamxRWbm/qXcXW7JW36J/W32j7JDCGQsfjM+INk1sqsUbht4amjdiWuFjz/x8fH2UI8V4NfiRYpxWYrL6S67gBCChkEQCM8/4PmpfX489U8Nrlv6+xepG1JX49F4MTEoR8CYKSPcyTFGhNCABsZY23Yd6GlxSWkpZPHi84beZZe78k+YYNbbL999Oe2d7JnDZ4wqaKHJKX/Gd3uOU/TEaaA0kPt/4g+zabJ6VKVk0QAAAABJRU5ErkJggg==&apos;); 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=\"React DevTools tree\" 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>Para completar essa refatoração, nós vamos introduzir a função que monta a árvore completa em um nó contêiner, assim como faz <code class=\"gatsby-code-text\">ReactDOM.render()</code>. Ela retorna uma instância pública, também como <code class=\"gatsby-code-text\">ReactDOM.render()</code> faz.</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\">// Create a instância interna de nível superior</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\">// Monta o componente de nível superior no contêiner</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\">// Retorna a instância pública que é provida</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>Desmontando </h3>\n<p>Agora que temos instâncias internas que possuem seus filhos e nós do DOM, podemos implementar a desmontagem. Para um componente composto, desmontar executa um método do ciclo de vida em recursão.</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\">// Chama o método de ciclo de vida se necessário</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\">// Desmonta o componente renderizado</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>Para o <code class=\"gatsby-code-text\">DOMComponent</code>, desmontar pede para que todo filho se desmonte:</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\">// Desmonta todos os filhos</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>Na prática, desmontar componentes DOM também remove os event listeners e limpa alguns caches, mas vamos pular esses detalhes.</p>\n<p>Podemos agora adicionar uma nova função de alto nível chamada <code class=\"gatsby-code-text\">unmountTree(containerNode)</code> que é semelhante a <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\">// Lê a instância interna de um nó do DOM:</span>\n  <span class=\"token comment\">// (Isso ainda não funciona, nós vamos precisar mudar mountTree() para guarda-la)</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\">// Desmonta a árvore e limpa o contêiner</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>Para que isso funcione, nós precisamos ler uma instância interna raiz de um nó do DOM. Nós vamos modificar <code class=\"gatsby-code-text\">mountTree()</code> para adicionar a propriedade <code class=\"gatsby-code-text\">_internalInstance</code> ao nó do DOM raiz. Nós também ensinaremos a <code class=\"gatsby-code-text\">mountTree()</code> como destruir qualquer árvore existente para que ela possa ser chamada múltiplas vezes:</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\">// Destrói qualquer árvore existente</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\">// Cria a instância interna de nível superior</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\">// Monta o componente de nivel superior no contêiner</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\">// Salva uma referência para a instância interna</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\">// Retorna a instância pública que é provida</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>Agora, executando <code class=\"gatsby-code-text\">unmountTree()</code> ou executando <code class=\"gatsby-code-text\">mountTree()</code> repetidamente, removerá a árvore antiga e em seguida executa o método de ciclo de vida <code class=\"gatsby-code-text\">componentWillUnmount()</code> nos componentes.</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>Atualizando </h3>\n<p>Na seção anterior, nós implementamos a desmontagem. Contudo, o React não seria muito útil se cada mudança de prop desmontasse e montasse a árvore toda. O objetivo do reconciliador é reutilizar instâncias existentes quando possível para preservar o DOM e o estado:</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\">// Deve reutilizar o DOM existente:</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>Nós iremos estender esse contrato da instância interna com mais um método. Alem do <code class=\"gatsby-code-text\">mount()</code> e <code class=\"gatsby-code-text\">unmount()</code>, ambos <code class=\"gatsby-code-text\">DOMComponent</code> e <code class=\"gatsby-code-text\">CompositeComponent</code> vão implementar um novo método chamado <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>Sua responsabilidade é fazer o que for necessário para atualizar o componente (e qualquer um de seus filhos) com a descrição dada pelo <code class=\"gatsby-code-text\">nextElement</code>.</p>\n<p>Essa é a parte geralmente descrita como “diff do DOM virtual” embora o que realmente acontece é que andamos pela árvore interna recursivamente e permitimos que cada instância receba uma atualização.</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>Atualizando Componentes Compostos </h3>\n<p>Quando um componente composto recebe um novo elemento, nós executamos o método de ciclo de vida <code class=\"gatsby-code-text\">componentWillUpdate()</code>.</p>\n<p>Então re-renderizamos o componente com as novas props, e capturamos o próximo elemento renderizado:</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\">// Atualiza *o próprio* elemento</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\">// Descobre qual é o próximo resultado do 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\">// Componente de classe</span>\n      <span class=\"token comment\">// Chama o ciclo de vida se necessário</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\">// Atualiza as 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\">// Re-renderiza</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\">// Componente de função</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>Após isso, nós podemos olhar para o <code class=\"gatsby-code-text\">type</code> do elemento renderizado. Se o <code class=\"gatsby-code-text\">type</code> não mudou desde a última renderização, o componente abaixo também pode ser atualizado.</p>\n<p>Por exemplo, se retorna <code class=\"gatsby-code-text\">&lt;Button color=&quot;red&quot; /&gt;</code> na primeira vez, e <code class=\"gatsby-code-text\">&lt;Button color=&quot;blue&quot; /&gt;</code> na segunda vez, nós podemos apenas dizer a instância interna correspondente para receber (<code class=\"gatsby-code-text\">receive()</code>) o segundo elemento:</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\">// Se o tipo do elemento renderizado não mudou</span>\n    <span class=\"token comment\">// reutilize a instância existente do componente e retorne.</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>Contudo, se o próximo elemento renderizado possuir um <code class=\"gatsby-code-text\">type</code> diferente do anterior, não podemos atualizar a instância interna. Um <code class=\"gatsby-code-text\">&lt;button&gt;</code> não pode “se tornar” um <code class=\"gatsby-code-text\">&lt;input&gt;</code>.</p>\n<p>Nesse caso, temos que desmontar a instância interna existente e montar a nova correspondente ao tipo do elemento renderizado. Por exemplo, é isso que acontece quando um componente que previamente renderizava um <code class=\"gatsby-code-text\">&lt;button /&gt;</code> renderiza um <code class=\"gatsby-code-text\">&lt;input /&gt;</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\">// Se chegamos nesse ponto, nós precisamos desmontar o componente</span>\n    <span class=\"token comment\">// montado anteriormente, montar o novo, e trocar seus nós.</span>\n\n    <span class=\"token comment\">// Encontra o nó antigo pois será necessário trocá-lo</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\">// Desmonta o filho antigo e monta o novo</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\">// Substitui a referência ao filho</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\">// Substitui o nó antigo com o novo</span>\n    <span class=\"token comment\">// Nota: isso é código específico do renderizador e</span>\n    <span class=\"token comment\">// idealmente deveria viver fora do 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>Para resumir isso tudo, quando um componente composto recebe um novo elemento, ele pode ou não delegar a atualização a sua instância interna renderizada, ou a desmontar e montar uma nova em seu lugar.</p>\n<p>Existe outra condição na qual um componente vai remontar ao invés de receber um elemento, e isso é quando a chave do elemento mudou. Nós não discutimos sobre como lidar com chaves nesse documento pois adicionaria mais complexidade a um tutorial já complexo.</p>\n<p>Note que nós precisamos adicionar um método chamado <code class=\"gatsby-code-text\">getHostNode()</code> ao contrato de uma instância interna para que ela possa localizar o nó específico da plataforma e o trocar durante a atualização. Sua implementação é bem direta para ambas as 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\">// Peça ao componente renderizado para fornecê-lo.</span>\n    <span class=\"token comment\">// Isso irá acessar recursivamente quaisquer elementos compostos.</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>Atualizando Componentes Hospedeiros </h3>\n<p>Implementações de componentes hospedeiros, como a de <code class=\"gatsby-code-text\">DOMComponent</code>, atualizam de maneira diferente. Quando recebem um elemento, é preciso atualizar a view específica da plataforma subjacente. No caso de React DOM, isso significa atualizar os atributos 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\">// Remove atributos antigos</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\">// Define os próximos atributos.</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>Então, o componente hospedeiro precisa atualizar seus filhos. Diferentemente de componentes compostos, eles podem conter mais de um filho.</p>\n<p>Neste simples exemplo, nós usamos um array de instâncias internas e iteramos sobre ele, atualizando ou trocando as instâncias internas, dependendo se o <code class=\"gatsby-code-text\">type</code> recebido é igual ao <code class=\"gatsby-code-text\">type</code> anterior. O verdadeiro reconciliador também leva a chave do elemento em conta e rastreia movimentos, além de inserções e deletes, mas omitiremos essa lógica.</p>\n<p>Nós coletamos operações DOM feitas em nós filhos em uma lista para que possamos executá-las em lotes:</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\">// Esses são vetores de elementos 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\">// Esses são vetores de instâncias internas:</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\">// À medida que iteramos os filhos, adicionaremos operações ao vetor.</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\">// Nota: a seção abaixo está extremamente simplificada!</span>\n    <span class=\"token comment\">// Ela não lida com re-ordenações, filhos com furos, ou chaves.</span>\n    <span class=\"token comment\">// Ela só existe para ilustrar o fluxo geral, não os detalhes.</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\">// Tenta obter uma instância interna existente para esse filho</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\">// Se não houver instâncias internas nesse índice,</span>\n      <span class=\"token comment\">// um filho foi anexado até o fim. Cria uma nova instância</span>\n      <span class=\"token comment\">// interna, a monta, e usa seu nó.</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\">// Grava que precisamos anexar um nó</span>\n        operationQueue<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>type<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\">// Nós podemos atualizar a instância apenas se o tipo do elemento for compatível.</span>\n      <span class=\"token comment\">// Por exemplo, &lt;Button size=\"small\" /> pode ser atualizado para</span>\n      <span class=\"token comment\">// &lt;Button size=\"large\" /> mas não para um &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\">// Se não podemos atualizar uma instância existente, temos que desmontá-la</span>\n      <span class=\"token comment\">// e montar uma nova no seu lugar.</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\">// Lembre que precisamos trocar os nós.</span>\n        operationQueue<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>type<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\">// Se pudermos atualizar uma instância interna existente,</span>\n      <span class=\"token comment\">// deixe-a receber o próximo elemento e lidar com sua própria atualização.</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\">// Finalmente, desmonte qualquer filho que não exista:</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\">// Grave que precisamos remover o nó</span>\n      operationQueue<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>type<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\">// Aponta a lista de elementos renderizados para a versão atualizada.</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>Como passo final, nós executamos as operações DOM. Novamente, o código do reconciliador real é mais complexo pois também envolve movimentos:</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\">// Processa a fila de operações.</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>E isto é a atualização de componentes hospedeiros.</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>Atualizações de Nível Superior </h3>\n<p>Agora que ambos <code class=\"gatsby-code-text\">CompositeComponent</code> e <code class=\"gatsby-code-text\">DOMComponent</code> implementam o método <code class=\"gatsby-code-text\">receive(nextElement)</code>, podemos mudar a função <code class=\"gatsby-code-text\">mountTree()</code> de nível superior para que seja usada quando o tipo do elemento for o mesmo da última vez:</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\">// Verifica se há uma árvore existente</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\">// Se pudermos, reutilizamos o componente raiz existente</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\">// Do contrário, desmonte a árvore existente.</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>Agora executar mountTree() duas vezes com o mesmo tipo não é destrutivo:</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\">// Reutiliza o DOM existente:</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>Esse é o básico de como o React funciona internamente.</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>O Que Omitimos </h3>\n<p>Esse documento é simples comparado com o código real. Existem alguns aspectos importantes que não abordamos:</p>\n<ul>\n<li>Componentes podem renderizar <code class=\"gatsby-code-text\">null</code>, e o reconciliador pode lidar com “espaços vazios” em arrays e em resultados renderizados.</li>\n<li>O reconciliador também lê a chave de seus elementos, e a usa para estabelecer qual instância interna corresponde a qual elemento em um array. Muita da complexidade da implementação real do React está relacionado a isto.</li>\n<li>Além de classes de instância interna composta e hospedeira, existem também classes para componentes texto e componentes vazios. Eles representam nós textuais e os “espaços vazios” você obtém renderizando <code class=\"gatsby-code-text\">null</code>.</li>\n<li>Renderizadores usam <a href=\"/docs/codebase-overview.html#dynamic-injection\">injeção</a> para passar a classe interna do host ao reconciliador. Por exemplo, o React DOM pede para o reconciliador usar <code class=\"gatsby-code-text\">ReactDOMComponent</code> como a implementação da instância interna hospedeira.</li>\n<li>A lógica para atualizar a lista de filhos é extraído em um mixin chamado <code class=\"gatsby-code-text\">ReactMultiChild</code> que é usada pela implementação da classe de instância interna hospedeira tanto no React DOM quanto no React Native.</li>\n<li>O Reconciliador também implementa suporte para <code class=\"gatsby-code-text\">setState()</code> em elementos compostos. Múltiplas atualizações dentro de manipuladores de eventos são realizadas em uma só atualização.</li>\n<li>O reconciliador também lida com anexar e desanexar refs a componentes compostos e nós hospedeiros.</li>\n<li>Métodos de ciclo de vida são chamados após o DOM estar pronto, como <code class=\"gatsby-code-text\">componentDidMount()</code> e <code class=\"gatsby-code-text\">componentDidUpdate()</code>, são coletados em “filas de callback” e são executadas em um só lote.</li>\n<li>O React coloca informações sobre a atualização atual em um objeto interno chamado de “transação”. Transações são úteis para observar a fila de métodos de ciclo de vida pendentes, o aninhamento do DOM atual para alertas e qualquer outra coisa que seja “global” a uma atualização específica. Transações também garantem que o React “limpe tudo” após atualizações. Por exemplo, a classe de transação provida pelo React DOM restaura a seleção de input após qualquer atualização.</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>Mergulhando no Código </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> é onde o código como <code class=\"gatsby-code-text\">mountTree()</code> e <code class=\"gatsby-code-text\">unmountTree()</code> deste tutorial vive.  Ele cuida da montagem e desmontagem de componentes de nível superior. <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> é o análogo para 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> é o equivalente de <code class=\"gatsby-code-text\">DOMComponent</code> neste tutorial. Ele implementa o componente de classe hospedeira para o renderizador 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> é o análogo para 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> é o equivalente de <code class=\"gatsby-code-text\">CompositeComponent</code> neste tutorial. Ele lida com a chamada de componentes definidos pelo usuário e manter seu estado.</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> contém o comutador que seleciona a correta classe de instância interna para construir um elemento. É equivalente a <code class=\"gatsby-code-text\">instantiateComponent()</code> neste tutorial.</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> é um wrapper com os métodos <code class=\"gatsby-code-text\">mountComponent()</code>, <code class=\"gatsby-code-text\">receiveComponent()</code> e <code class=\"gatsby-code-text\">unmountComponent()</code>. Ele chama as implementações subjacentes nas instâncias internas, mas também inclui código que é compartilhado por todas as implementações de instâncias internas.</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> implementa a lógica para montar, atualizar e desmontar filhos de acordo com a chave de seus elementos.</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> implementa o processamento da fila de operações para inserções, exclusões e movimentações independentemente do renderizador.</li>\n<li><code class=\"gatsby-code-text\">mount()</code>, <code class=\"gatsby-code-text\">receive()</code> e <code class=\"gatsby-code-text\">unmount()</code> são chamados de <code class=\"gatsby-code-text\">mountComponent()</code>, <code class=\"gatsby-code-text\">receiveComponent()</code> e <code class=\"gatsby-code-text\">unmountComponent()</code> na base de código React por razões legadas, mas eles recebem elementos.</li>\n<li>As propriedades nas instâncias internas começam com um sublinhado, e.g. <code class=\"gatsby-code-text\">_currentElement</code>. Elas são consideradas como campos públicos de apenas leitura em toda a base de código.</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>Direções Futuras </h3>\n<p>O reconciliador de pilha tem limitações inerentes, como ser síncrono e incapaz de interromper trabalhos ou dividi-los em partes. Há um projeto em andamento no <a href=\"/docs/codebase-overview.html#fiber-reconciler\">novo Reconciliador Fiber</a> com uma <a href=\"https://github.com/acdlite/react-fiber-architecture\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">arquitetura completamente diferente</a>. No futuro, pretendemos substituir o reconciliador de pilha por ele, mas no momento está longe de estar completo.</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>Próximos Passos </h3>\n<p>Leia a <a href=\"/docs/design-principles.html\">próxima seção</a> para aprender sobre os princípios orientadores que usamos para o desenvolvimento do React.</p>","frontmatter":{"title":"Notas de Implementação","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":[]}