<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[React]]></title><description><![CDATA[A JavaScript library for building user interfaces]]></description><link>https://pt-br.reactjs.org</link><generator>GatsbyJS</generator><lastBuildDate>Thu, 03 Dec 2020 21:14:49 GMT</lastBuildDate><item><title><![CDATA[React v17.0]]></title><description><![CDATA[<p>Hoje, nós estamos lançando o React 17! Escrevemos longamente sobre o papel da versão React 17 e as mudanças que ele contém na <a href="/blog/2020/08/10/react-v17-rc.html">postagem do blog React 17 RC</a>. Este post é um breve resumo dele, então se você já leu o post RC, você pode pular este.</p>
<h2 id="sem-novos-recursos"><a href="#sem-novos-recursos" 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>Sem novos recursos</h2>
<p>A versão React 17 é incomum porque não adiciona nenhum novo recurso voltado para o desenvolvedor. Em vez disso, este lançamento está focado principalmente em <strong>tornar mais fácil atualizar o próprio React</strong>.</p>
<p>Em particular, o React 17 é uma versão de “trampolim” que torna mais seguro incorporar uma árvore gerenciada por uma versão do React dentro de uma árvore gerenciada por uma versão diferente do React.</p>
<p>Também torna mais fácil incorporar o React a aplicativos desenvolvidos com outras tecnologias.</p>
<h2 id="upgrades-graduais"><a href="#upgrades-graduais" 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>Upgrades Graduais</h2>
<p><strong>O React 17 permite atualizações graduais do React.</strong> Quando você atualiza do React 15 para o 16 (ou, desta vez, do React 16 para o 17), normalmente atualiza o aplicativo inteiro de uma vez. Isso funciona bem para muitos aplicativos. Mas pode se tornar cada vez mais desafiador se a base de código foi escrita há alguns anos e não é mantida ativamente. E embora seja possível usar duas versões do React na página, até o React 17 isso era frágil e causava problemas com eventos.</p>
<p>Estamos corrigindo muitos desses problemas com o React 17. Isso significa que <strong>quando React 18 e as próximas versões futuras forem lançadas, você terá mais opções</strong>. A primeira opção será atualizar todo o seu aplicativo de uma vez, como você pode ter feito antes. Mas você também terá a opção de atualizar seu aplicativo peça por peça. Por exemplo, você pode decidir migrar a maior parte do seu aplicativo para o React 18, mas manter algumas caixas de diálogo carregadas lentamente ou um sub-rota no React 17.</p>
<p>Isso não significa você <em>precise</em> fazer atualizações graduais. <strong>Para a maioria dos aplicativos, atualizar tudo de uma vez ainda é a melhor solução.</strong> Carregar duas versões do React - mesmo se uma delas for carregada lentamente sob demanda - ainda não é o ideal. No entanto, para aplicativos maiores que não são mantidos ativamente, faz sentido considerar essa opção, e o React 17 permite que esses aplicativos não sejam deixados para trás.</p>
<p>Nós preparamos um <a href="https://github.com/reactjs/react-gradual-upgrade-demo/" target="_blank" rel="nofollow noopener noreferrer">repositório de exemplo</a> demonstrando como carregar lentamente uma versão anterior do React, se necessário. Esta demonstração usa Create React App, mas deve ser possível seguir uma abordagem semelhante com qualquer outra ferramenta. Aceitamos demonstrações usando outras ferramentas como pull requests.</p>
<blockquote>
<p>Nota</p>
<p><strong>Adiamos outras mudanças</strong> até depois do React 17. O objetivo desta versão é permitir atualizações graduais. Se atualizar para React 17 fosse muito difícil, isso iria contra o seu propósito.</p>
</blockquote>
<h2 id="mudanças-na-delegação-do-evento"><a href="#mudan%C3%A7as-na-delega%C3%A7%C3%A3o-do-evento" 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>Mudanças na Delegação do Evento</h2>
<p>Para permitir atualizações graduais, precisamos fazer algumas mudanças no sistema de eventos React. O React 17 é um grande lançamento porque essas alterações são potencialmente prejudiciais. Você pode conferir nosso <a href="/docs/faq-versioning.html#breaking-changes">FAQ de versionamento</a> para saber mais sobre nosso compromisso com a estabilidade.</p>
<p>No React 17, o React não anexará mais manipuladores de eventos no nível do <code class="gatsby-code-text">documento</code> sob o hood. Em vez disso, ele os anexará ao contêiner root DOM no qual sua árvore React é renderizada:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token keyword">const</span> rootNode <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>
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> rootNode<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>No React 16 e anteriores, o React faria <code class="gatsby-code-text">document.addEventListener()</code> para a maioria dos eventos. React 17 ligará <code class="gatsby-code-text">rootNode.addEventListener()</code> sob o hood em vez disso.</p>
<p>
  <a
    class="gatsby-resp-image-link"
    href="/static/bb4b10114882a50090b8ff61b3c4d0fd/31868/react_17_delegation.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
  
  <span
    class="gatsby-resp-image-wrapper"
    style="position: relative; display: block;  max-width: 840px; margin-left: auto; margin-right: auto;"
  >
    <span
      class="gatsby-resp-image-background-image"
      style="padding-bottom: 77.14285714285715%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsSAAALEgHS3X78AAACcUlEQVQ4y21T2W4TMRTNr0MfgDeEkPgSJF55JarUJSVpm07WaZLZV+/24XomE9LFypEd3zPnrh59nHFcED5MGT7fc/wIBL7OOT7ds+7O21/D878/CXwjfHnov7042kYhs/DYEnbcIpYOB+HwLIGQO7IZDJyBFxIvEh6u+2Z7Zh/htBz9bL8bAbO7AjTDu8u5427fmEaWjN7MtUHBOPKiRB7O0Nz/gkjm0G3a2TseHbS1KIVCUTfI8vxkGzByHbFHXdfYRwni9RSu3MAqBpWvYXhxDKyPjHOO/X7fwS9LTgbbaDhYY8AYQ11VOGQVZJPAippQwTQxZWdOaXnBgjJJkhjyRSVcX0NDHhqpwLQFbxtsSobn7ABIEpQNDMvgjOzSY1KjVQYNE1jscgTMYRm14Kp3OBqUGV0cuMFkFeJxl6AsI5iWhLSkPe0E/VLGIhUGQVrh5zjA9abCrpBYxexlynErcbmOMNnnmEQ15k8TsOrQRdWlfOT56O52KS43CcaLGL9nzyi4QFQqKO3Hhog+2CCr8TcXeGgtVlWLeTBBRBFLxSnl/FSniCncxRVuMoPHFvgTNphFJaLWQJvjHHLjcHsoMU1KzNISD0mKx3CLec5oPAoYrfrGERYFw+W+wXUqcVsajMO6E1xXCi3Vt4vQ0683ByypGUsq8oK6F9QK61ZDklcMo0W8ZdHiZht3L+kqFpjlCstGo1Q971TDgkss8wZPWYGAhNf07ErtXowEjg8gLGpMM4G7RGDF+mdoXs+hV2dEjqiDibRoTT/5/im6swj9f9/pRPRCFTk98/t/bM7uSAhvInuP589aU1mk7ODP/wCR7n8+8QwuZQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
    >
      <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="Um diagrama que mostra como o React 17 anexa eventos aos roots em vez de ao documento"
        title=""
        src="/static/bb4b10114882a50090b8ff61b3c4d0fd/1e088/react_17_delegation.png"
        srcset="/static/bb4b10114882a50090b8ff61b3c4d0fd/65ed1/react_17_delegation.png 210w,
/static/bb4b10114882a50090b8ff61b3c4d0fd/d10fb/react_17_delegation.png 420w,
/static/bb4b10114882a50090b8ff61b3c4d0fd/1e088/react_17_delegation.png 840w,
/static/bb4b10114882a50090b8ff61b3c4d0fd/78612/react_17_delegation.png 1260w,
/static/bb4b10114882a50090b8ff61b3c4d0fd/21cdd/react_17_delegation.png 1680w,
/static/bb4b10114882a50090b8ff61b3c4d0fd/31868/react_17_delegation.png 3496w"
        sizes="(max-width: 840px) 100vw, 840px"
      />
    </span>
  </span>
  
  </a>
    </p>
<p>Nós confirmamos que <a href="https://github.com/facebook/react/issues/7094" target="_blank" rel="nofollow noopener noreferrer">numerosos</a> <a href="https://github.com/facebook/react/issues/8693" target="_blank" rel="nofollow noopener noreferrer">problemas</a> <a href="https://github.com/facebook/react/issues/12518" target="_blank" rel="nofollow noopener noreferrer">relatados</a> <a href="https://github.com/facebook/react/issues/13451" target="_blank" rel="nofollow noopener noreferrer">sobre</a> <a href="https://github.com/facebook/react/issues/4335" target="_blank" rel="nofollow noopener noreferrer">os</a> <a href="https://github.com/facebook/react/issues/1691" target="_blank" rel="nofollow noopener noreferrer">anos</a> <a href="https://github.com/facebook/react/issues/285#issuecomment-253502585" target="_blank" rel="nofollow noopener noreferrer">na</a> <a href="https://github.com/facebook/react/pull/8117" target="_blank" rel="nofollow noopener noreferrer">nossa</a> <a href="https://github.com/facebook/react/issues/11530" target="_blank" rel="nofollow noopener noreferrer">issue</a> <a href="https://github.com/facebook/react/issues/7128" target="_blank" rel="nofollow noopener noreferrer">rastreador</a> relacionadas à integração do React com o código não React foram corrigidas pelo novo comportamento.</p>
<p>Se você tiver problemas com essa mudança, <a href="/blog/2020/08/10/react-v17-rc.html#fixing-potential-issues">aqui está uma maneira comum de resolvê-los</a>.</p>
<h2 id="outras-mudanças-importantes"><a href="#outras-mudan%C3%A7as-importantes" 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>Outras Mudanças Importantes</h2>
<p><a href="/blog/2020/08/10/react-v17-rc.html#other-breaking-changes">O post do blog React 17 RC</a> descreve o resto das mudanças significativas no React 17.</p>
<p>Só tivemos que mudar menos de vinte componentes de mais de 100.000 no código de produto do Facebook para trabalhar com essas mudanças, então <strong>esperamos que a maioria dos aplicativos possa atualizar para React 17 sem muitos problemas</strong>. Por favor <a href="https://github.com/facebook/react/issues" target="_blank" rel="nofollow noopener noreferrer">nos conte</a> se você tiver problemas.</p>
<h2 id="nova-transformação-jsx"><a href="#nova-transforma%C3%A7%C3%A3o-jsx" 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>Nova transformação JSX</h2>
<p>React 17 apoia a <a href="/blog/2020/09/22/introducing-the-new-jsx-transform.html">nova transformação JSX</a>. Também fizemos backport para ele para React 16.14.0, React 15.7.0 e 0.14.10. Observe que é totalmente opcional e você não precisa usá-lo. A transformação JSX clássica continuará funcionando e não há planos de deixar de suportá-la.</p>
<h2 id="react-native"><a href="#react-native" 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>React Native</h2>
<p>O React Native tem uma programação de lançamento separada. Atualmente esperamos que o suporte para React 17 chegue no React Native 0.65, mas a versão exata está sujeita a alterações. Como sempre, você pode acompanhar as discussões de lançamento nos lançamentos da React Native Community <a href="https://github.com/react-native-community/releases" target="_blank" rel="nofollow noopener noreferrer">rastreador de issues</a>.</p>
<h2 id="installation"><a href="#installation" 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>Instalação </h2>
<p>Para instalar React 17 com npm, rode:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token function">npm</span> <span class="token function">install</span> react@17.0.0 react-dom@17.0.0</code></pre></div>
<p>Para instalar React 17 com Yarn, rode:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token function">yarn</span> <span class="token function">add</span> react@17.0.0 react-dom@17.0.0</code></pre></div>
<p>Também fornecemos compilações UMD do React por meio de um CDN:</p>
<div class="gatsby-highlight" data-language="html"><pre class="gatsby-code-html"><code class="gatsby-code-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">crossorigin</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://unpkg.com/react@17.0.0/umd/react.production.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">crossorigin</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://unpkg.com/react-dom@17.0.0/umd/react-dom.production.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre></div>
<p>Consulte a documentação para <a href="/docs/installation.html">instruções de instalação detalhadas</a>.</p>
<h2 id="changelog"><a href="#changelog" 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>Changelog </h2>
<h3 id="react"><a href="#react" 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>React </h3>
<ul>
<li>Adiciona <code class="gatsby-code-text">react/jsx-runtime</code> e <code class="gatsby-code-text">react/jsx-dev-runtime</code> para o <a href="https://babeljs.io/blog/2020/03/16/7.9.0#a-new-jsx-transform-11154-https-githubcom-babel-babel-pull-11154" target="_blank" rel="nofollow noopener noreferrer">new JSX transform</a>. (<a href="https://github.com/lunaruan" target="_blank" rel="nofollow noopener noreferrer">@lunaruan</a> em <a href="https://github.com/facebook/react/pull/18299" target="_blank" rel="nofollow noopener noreferrer">#18299</a>)</li>
<li>Crie pilhas de componentes a partir de frames de erro nativos. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18561" target="_blank" rel="nofollow noopener noreferrer">#18561</a>)</li>
<li>Permite especificar <code class="gatsby-code-text">displayName</code> no contexto para pilhas aprimoradas. (<a href="https://github.com/eps1lon" target="_blank" rel="nofollow noopener noreferrer">@eps1lon</a> em <a href="https://github.com/facebook/react/pull/18224" target="_blank" rel="nofollow noopener noreferrer">#18224</a>)</li>
<li>Evita <code class="gatsby-code-text">&#39;use strict&#39;</code> de vazamento nos pacotes UMD. (<a href="https://github.com/koba04" target="_blank" rel="nofollow noopener noreferrer">@koba04</a> em <a href="https://github.com/facebook/react/pull/19614" target="_blank" rel="nofollow noopener noreferrer">#19614</a>)</li>
<li>Para de usar <code class="gatsby-code-text">fb.me</code> para redirecionamentos. (<a href="https://github.com/cylim" target="_blank" rel="nofollow noopener noreferrer">@cylim</a> em <a href="https://github.com/facebook/react/pull/19598" target="_blank" rel="nofollow noopener noreferrer">#19598</a>)</li>
</ul>
<h3 id="react-dom"><a href="#react-dom" 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>React DOM </h3>
<ul>
<li>Delega eventos aos roots em vez de <code class="gatsby-code-text">document</code>. (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/18195" target="_blank" rel="nofollow noopener noreferrer">#18195</a> e <a href="https://github.com/facebook/react/pulls?q=is%3Apr+author%3Atrueadm+modern+event+is%3Amerged" target="_blank" rel="nofollow noopener noreferrer">others</a>)</li>
<li>Limpa todos os efeitos antes de executar os próximos efeitos. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/17947" target="_blank" rel="nofollow noopener noreferrer">#17947</a>)</li>
<li>Roda <code class="gatsby-code-text">useEffect</code> limpando funções assíncronas. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/17925" target="_blank" rel="nofollow noopener noreferrer">#17925</a>)</li>
<li>Usa o navegador <code class="gatsby-code-text">focusin</code> e <code class="gatsby-code-text">focusout</code> para <code class="gatsby-code-text">onFocus</code> e <code class="gatsby-code-text">onBlur</code>. (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/19186" target="_blank" rel="nofollow noopener noreferrer">#19186</a>)</li>
<li>Faz com que eventos <code class="gatsby-code-text">Capture</code> usem a fase de captura do navegador. (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/19221" target="_blank" rel="nofollow noopener noreferrer">#19221</a>)</li>
<li>Não imita o borbulhar do evento <code class="gatsby-code-text">onScroll</code>. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19464" target="_blank" rel="nofollow noopener noreferrer">#19464</a>)</li>
<li>Lança se o componente <code class="gatsby-code-text">forwardRef</code> ou<code class="gatsby-code-text">memo</code> retornar ʻundefined`. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19550" target="_blank" rel="nofollow noopener noreferrer">#19550</a>)</li>
<li>Remove o pool de eventos. (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/18969" target="_blank" rel="nofollow noopener noreferrer">#18969</a>)</li>
<li>Para de expor detalhes internos que não serão necessários para o React Native Web. (<a href="https://github.com/necolas" target="_blank" rel="nofollow noopener noreferrer">@necolas</a> em <a href="https://github.com/facebook/react/pull/18483" target="_blank" rel="nofollow noopener noreferrer">#18483</a>)</li>
<li>Anexa todos os ouvintes de eventos conhecidos quando o hoot for montado. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19659" target="_blank" rel="nofollow noopener noreferrer">#19659</a>)</li>
<li>Desabilita <code class="gatsby-code-text">console</code> na segunda passagem de renderização do modo DEV, renderização dupla. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18547" target="_blank" rel="nofollow noopener noreferrer">#18547</a>)</li>
<li>Rejeita o não documentado e enganoso API do <code class="gatsby-code-text">ReactTestUtils.SimulateNative</code>. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/13407" target="_blank" rel="nofollow noopener noreferrer">#13407</a>)</li>
<li>Renomeia os nomes dos campos privados usados ​​nos internos. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/18377" target="_blank" rel="nofollow noopener noreferrer">#18377</a>)</li>
<li>Não chama a API User Timing no desenvolvimento. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/18417" target="_blank" rel="nofollow noopener noreferrer">#18417</a>)</li>
<li>Desabilita o console durante a renderização repetida no modo estrito. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18547" target="_blank" rel="nofollow noopener noreferrer">#18547</a>)</li>
<li>No Modo Estrito, os componentes de renderização dupla sem Hooks. (<a href="https://github.com/eps1lon" target="_blank" rel="nofollow noopener noreferrer">@eps1lon</a> em <a href="https://github.com/facebook/react/pull/18430" target="_blank" rel="nofollow noopener noreferrer">#18430</a>)</li>
<li>Permite chamadas <code class="gatsby-code-text">ReactDOM.flushSync</code> durante os métodos de ciclo de vida (com aviso). (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18759" target="_blank" rel="nofollow noopener noreferrer">#18759</a>)</li>
<li>Adiciona a propriedade <code class="gatsby-code-text">code</code> aos objetos de evento do teclado. (<a href="https://github.com/bl00mber" target="_blank" rel="nofollow noopener noreferrer">@bl00mber</a> em <a href="https://github.com/facebook/react/pull/18287" target="_blank" rel="nofollow noopener noreferrer">#18287</a>)</li>
<li>Adiciona a propriedade <code class="gatsby-code-text">disableRemotePlayback</code> para elementos <code class="gatsby-code-text">video</code>. (<a href="https://github.com/tombrowndev" target="_blank" rel="nofollow noopener noreferrer">@tombrowndev</a> em <a href="https://github.com/facebook/react/pull/18619" target="_blank" rel="nofollow noopener noreferrer">#18619</a>)</li>
<li>Adiciona a propriedade <code class="gatsby-code-text">enterKeyHint</code> para elementos <code class="gatsby-code-text">input</code>. (<a href="https://github.com/eps1lon" target="_blank" rel="nofollow noopener noreferrer">@eps1lon</a> em <a href="https://github.com/facebook/react/pull/18634" target="_blank" rel="nofollow noopener noreferrer">#18634</a>)</li>
<li>Avisa quando <code class="gatsby-code-text">value</code> não é fornecido para <code class="gatsby-code-text">&lt;Context.Provider&gt;</code>. (<a href="https://github.com/charlie1404" target="_blank" rel="nofollow noopener noreferrer">@charlie1404</a> em <a href="https://github.com/facebook/react/pull/19054" target="_blank" rel="nofollow noopener noreferrer">#19054</a>)</li>
<li>Avisa quando o componente<code class="gatsby-code-text">memo</code> ou <code class="gatsby-code-text">forwardRef</code> retorna <code class="gatsby-code-text">undefined</code>. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/19550" target="_blank" rel="nofollow noopener noreferrer">#19550</a>)</li>
<li>Melhora a mensagem de erro para atualizações inválidas. (<a href="https://github.com/JoviDeCroock" target="_blank" rel="nofollow noopener noreferrer">@JoviDeCroock</a> em <a href="https://github.com/facebook/react/pull/18316" target="_blank" rel="nofollow noopener noreferrer">#18316</a>)</li>
<li>Exclui forwardRef e memo dos frames da pilha. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18559" target="_blank" rel="nofollow noopener noreferrer">#18559</a>)</li>
<li>Melhora a mensagem de erro ao alternar entre entradas controladas e não controladas. (<a href="https://github.com/vcarl" target="_blank" rel="nofollow noopener noreferrer">@vcarl</a> em <a href="https://github.com/facebook/react/pull/17070" target="_blank" rel="nofollow noopener noreferrer">#17070</a>)</li>
<li>Mantém <code class="gatsby-code-text">onTouchStart</code>, <code class="gatsby-code-text">onTouchMove</code>, e <code class="gatsby-code-text">onWheel</code> passivo. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19654" target="_blank" rel="nofollow noopener noreferrer">#19654</a>)</li>
<li>Conserta <code class="gatsby-code-text">setState</code> em desenvolvimento dentro de um iframe fechado. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19220" target="_blank" rel="nofollow noopener noreferrer">#19220</a>)</li>
<li>Corrige resgate de renderização para componentes lentos com <code class="gatsby-code-text">defaultProps</code>. (<a href="https://github.com/jddxf" target="_blank" rel="nofollow noopener noreferrer">@jddxf</a> em <a href="https://github.com/facebook/react/pull/18539" target="_blank" rel="nofollow noopener noreferrer">#18539</a>)</li>
<li>Corrige um aviso de falso positivo quando <code class="gatsby-code-text">dangerouslySetInnerHTML</code> é <code class="gatsby-code-text">undefined</code>. (<a href="https://github.com/eps1lon" target="_blank" rel="nofollow noopener noreferrer">@eps1lon</a> em <a href="https://github.com/facebook/react/pull/18676" target="_blank" rel="nofollow noopener noreferrer">#18676</a>)</li>
<li>Corrige utilitários de teste fora do padrão de implementação <code class="gatsby-code-text">require</code>. (<a href="https://github.com/just-boris" target="_blank" rel="nofollow noopener noreferrer">@just-boris</a> em <a href="https://github.com/facebook/react/pull/18632" target="_blank" rel="nofollow noopener noreferrer">#18632</a>)</li>
<li>Corrige <code class="gatsby-code-text">onBeforeInput</code> relatando um incorreto <code class="gatsby-code-text">event.type</code>. (<a href="https://github.com/eps1lon" target="_blank" rel="nofollow noopener noreferrer">@eps1lon</a> em <a href="https://github.com/facebook/react/pull/19561" target="_blank" rel="nofollow noopener noreferrer">#19561</a>)</li>
<li>Corrige <code class="gatsby-code-text">event.relatedTarget</code> relatado como <code class="gatsby-code-text">undefined</code> em Firefox. (<a href="https://github.com/claytercek" target="_blank" rel="nofollow noopener noreferrer">@claytercek</a> em <a href="https://github.com/facebook/react/pull/19607" target="_blank" rel="nofollow noopener noreferrer">#19607</a>)</li>
<li>Corrige “erro não especificado” em IE11. (<a href="https://github.com/hemakshis" target="_blank" rel="nofollow noopener noreferrer">@hemakshis</a> em <a href="https://github.com/facebook/react/pull/19664" target="_blank" rel="nofollow noopener noreferrer">#19664</a>)</li>
<li>Corrige a renderização em uma sombra root. (<a href="https://github.com/Jack-Works" target="_blank" rel="nofollow noopener noreferrer">@Jack-Works</a> em <a href="https://github.com/facebook/react/pull/15894" target="_blank" rel="nofollow noopener noreferrer">#15894</a>)</li>
<li>Corrige <code class="gatsby-code-text">movementX/Y</code> polyfill com eventos de captura. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19672" target="_blank" rel="nofollow noopener noreferrer">#19672</a>)</li>
<li>Usa delegação para <code class="gatsby-code-text">onSubmit</code> e <code class="gatsby-code-text">onReset</code> eventos. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19333" target="_blank" rel="nofollow noopener noreferrer">#19333</a>)</li>
<li>Melhora o uso de memória. (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/18970" target="_blank" rel="nofollow noopener noreferrer">#18970</a>)</li>
</ul>
<h3 id="react-dom-server"><a href="#react-dom-server" 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>React DOM Server </h3>
<ul>
<li>Torne o comportamento do <code class="gatsby-code-text">useCallback</code> consistente com ʻuseMemo` para o renderizador do servidor.(<a href="https://github.com/alexmckenley" target="_blank" rel="nofollow noopener noreferrer">@alexmckenley</a> em <a href="https://github.com/facebook/react/pull/18783" target="_blank" rel="nofollow noopener noreferrer">#18783</a>)</li>
<li>Corrige o vazamento de estado quando um componente de função é acionado. (<a href="https://github.com/pmaccart" target="_blank" rel="nofollow noopener noreferrer">@pmaccart</a> em <a href="https://github.com/facebook/react/pull/19212" target="_blank" rel="nofollow noopener noreferrer">#19212</a>)</li>
</ul>
<h3 id="react-test-renderer"><a href="#react-test-renderer" 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>React Test Renderer </h3>
<ul>
<li>Melhora <code class="gatsby-code-text">findByType</code> mensagem de erro. (<a href="https://github.com/henryqdineen" target="_blank" rel="nofollow noopener noreferrer">@henryqdineen</a> em <a href="https://github.com/facebook/react/pull/17439" target="_blank" rel="nofollow noopener noreferrer">#17439</a>)</li>
</ul>
<h3 id="concurrent-mode-experimental"><a href="#concurrent-mode-experimental" 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>Modo Simultâneo (Experimental) </h3>
<ul>
<li>Renova as heurísticas de lote de prioridade. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18796" target="_blank" rel="nofollow noopener noreferrer">#18796</a>)</li>
<li>Adiciona o prefixo <code class="gatsby-code-text">unstable_</code> antes do experimental APIs. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18825" target="_blank" rel="nofollow noopener noreferrer">#18825</a>)</li>
<li>Remove <code class="gatsby-code-text">unstable_discreteUpdates</code> e <code class="gatsby-code-text">unstable_flushDiscreteUpdates</code>. (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/18825" target="_blank" rel="nofollow noopener noreferrer">#18825</a>)</li>
<li>Remove o argumento <code class="gatsby-code-text">timeoutMs</code>. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/19703" target="_blank" rel="nofollow noopener noreferrer">#19703</a>)</li>
<li>Desabilita pré-renderização <code class="gatsby-code-text">&lt;div hidden /&gt;</code> em favor de uma futura API diferente. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18917" target="_blank" rel="nofollow noopener noreferrer">#18917</a>)</li>
<li>Adiciona <code class="gatsby-code-text">unstable_expectedLoadTime</code> ao Suspense para árvores vinculadas à CPU. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> in <a href="https://github.com/facebook/react/pull/19936" target="_blank" rel="nofollow noopener noreferrer">#19936</a>)</li>
<li>Adiciona um Hook experimental <code class="gatsby-code-text">unstable_useOpaqueIdentifier</code>. (<a href="https://github.com/lunaruan" target="_blank" rel="nofollow noopener noreferrer">@lunaruan</a> em <a href="https://github.com/facebook/react/pull/17322" target="_blank" rel="nofollow noopener noreferrer">#17322</a>)</li>
<li>Adiciona uma API experimental <code class="gatsby-code-text">unstable_startTransition</code>. (<a href="https://github.com/rickhanlonii" target="_blank" rel="nofollow noopener noreferrer">@rickhanlonii</a> em <a href="https://github.com/facebook/react/pull/19696" target="_blank" rel="nofollow noopener noreferrer">#19696</a>)</li>
<li>Usando <code class="gatsby-code-text">act</code> no renderizador de teste não libera mais fallbacks do Suspense. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18596" target="_blank" rel="nofollow noopener noreferrer">#18596</a>)</li>
<li>Usa o tempo limite de renderização global para CPU Suspense. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/19643" target="_blank" rel="nofollow noopener noreferrer">#19643</a>)</li>
<li>Limpa o conteúdo hoot existente antes da montagem. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/18730" target="_blank" rel="nofollow noopener noreferrer">#18730</a>)</li>
<li>Corrige um bug com limites de erro. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18265" target="_blank" rel="nofollow noopener noreferrer">#18265</a>)</li>
<li>Corrige um bug que causava atualizações perdidas em uma árvore suspensa. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18384" target="_blank" rel="nofollow noopener noreferrer">#18384</a> e <a href="https://github.com/facebook/react/pull/18457" target="_blank" rel="nofollow noopener noreferrer">#18457</a>)</li>
<li>Corrige um bug que causava atualizações da fase de renderização perdidas (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18537" target="_blank" rel="nofollow noopener noreferrer">#18537</a>)</li>
<li>Corrige um bug em SuspenseList. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18412" target="_blank" rel="nofollow noopener noreferrer">#18412</a>)</li>
<li>Corrige um bug que fazia com que o substituto do Suspense fosse exibido muito cedo. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18411" target="_blank" rel="nofollow noopener noreferrer">#18411</a>)</li>
<li>Corrige um bug com componentes de classe dentro de SuspenseList. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18448" target="_blank" rel="nofollow noopener noreferrer">#18448</a>)</li>
<li>Corrige um bug com inputs que pode fazer com que as atualizações sejam descartadas. (<a href="https://github.com/jddxf" target="_blank" rel="nofollow noopener noreferrer">@jddxf</a> em <a href="https://github.com/facebook/react/pull/18515" target="_blank" rel="nofollow noopener noreferrer">#18515</a> e <a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18535" target="_blank" rel="nofollow noopener noreferrer">#18535</a>)</li>
<li>Corrige um bug que fazia com que o recurso de suspensão do Suspense travasse.  (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18663" target="_blank" rel="nofollow noopener noreferrer">#18663</a>)</li>
<li>Não corta a tail de uma SuspenseList se carregando informações. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18854" target="_blank" rel="nofollow noopener noreferrer">#18854</a>)</li>
<li>Conserta um bug em <code class="gatsby-code-text">useMutableSource</code> isso pode acontecer quando alterações<code class="gatsby-code-text">getSnapshot</code>. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/18297" target="_blank" rel="nofollow noopener noreferrer">#18297</a>)</li>
<li>Corrige um sério bug em <code class="gatsby-code-text">useMutableSource</code>. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/18912" target="_blank" rel="nofollow noopener noreferrer">#18912</a>)</li>
<li>Avisa se chamando setState fora da renderização, mas antes do commit. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18838" target="_blank" rel="nofollow noopener noreferrer">#18838</a>)</li>
</ul>]]></description><link>https://pt-br.reactjs.org/blog/2020/10/20/react-v17.html</link><guid isPermaLink="false">https://pt-br.reactjs.org/blog/2020/10/20/react-v17.html</guid><pubDate>Tue, 20 Oct 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Apresentando o novo JSX Transform]]></title><description><![CDATA[<p>Embora o React 17 <a href="/blog/2020/08/10/react-v17-rc.html">não contenha novos recursos</a>, ele fornecerá suporte para uma nova versão do JSX Transform. Neste post, descreveremos o que é e como experimentá-lo.</p>
<h2 id="whats-a-jsx-transform"><a href="#whats-a-jsx-transform" 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 é um JSX Transform? </h2>
<p>Os navegadores não entendem JSX imediatamente, então a maioria dos usuários do React confia em um compilador como o Babel ou TypeScript para <strong>transformar o código JSX em JavaScript regular</strong>. Muitos toolkits pré-configurados como o Create React App ou Next.js também incluem um JSX Transform por baixo do capô.</p>
<p>Junto com a versão React 17, queríamos fazer algumas melhorias no JSX Transform, mas não queríamos quebrar as configurações existentes. É por isso que <a href="https://babeljs.io/blog/2020/03/16/7.9.0#a-new-jsx-transform-11154httpsgithubcombabelbabelpull11154" target="_blank" rel="nofollow noopener noreferrer">trabalhamos com Babel</a> para <strong>oferecer uma versão nova e reescrita do JSX Transform</strong> para pessoas que gostariam de atualizar.</p>
<p>Atualizar para a nova transformação é totalmente opcional, mas tem alguns benefícios:</p>
<ul>
<li>Com a nova transformação, você pode <strong>usar JSX sem importar o React</strong>.</li>
<li>Dependendo de sua configuração, a saída compilada pode <strong>melhorar ligeiramente o tamanho do pacote</strong>.</li>
<li>Isso permitirá melhorias futuras que <strong>reduzem o número de conceitos</strong> que você precisa para aprender React.</li>
</ul>
<p><strong>Esta atualização não mudará a sintaxe JSX e não é necessária.</strong> O antigo JSX Transform continuará funcionando normalmente e não há planos de remover o suporte para ele.</p>
<p><a href="/blog/2020/08/10/react-v17-rc.html">React 17 RC</a> já inclui suporte para a nova transformação, então experimente! Para facilitar a adoção <strong>também adaptamos seu suporte</strong> para React 16.14.0, React 15.7.0 e React 0.14.10. Você pode encontrar as instruções de atualização para diferentes ferramentas <a href="#how-to-upgrade-to-the-new-jsx-transform">abaixo</a>.</p>
<p>Agora, vamos examinar mais de perto as diferenças entre a velha e a nova transformação.</p>
<h2 id="whats-different-in-the-new-transform"><a href="#whats-different-in-the-new-transform" 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 Há de Diferente na Nova Transformação? </h2>
<p>Quando você usa JSX, o compilador o transforma em chamadas de função React que o navegador pode entender. <strong>A antiga transformação JSX</strong> transforma JSX em chamadas <code class="gatsby-code-text">React.createElement(...)</code>.</p>
<p>Por exemplo, digamos que seu código-fonte tenha a seguinte aparência:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>

<span class="token keyword">function</span> <span class="token function">App</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span><span class="token plain-text">Hello World</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div>
<p>Nos bastidores, a antiga transformação JSX o transforma em JavaScript regular:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>

<span class="token keyword">function</span> <span class="token function">App</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> React<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'h1'</span><span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">,</span> <span class="token string">'Hello world'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div>
<blockquote>
<p>Nota</p>
<p><strong>Seu código-font não precisa ser alterado de forma alguma.</strong> Estamos descrevendo como a transformação JSX transforma seu código-fonte JSX no código JavaScript que um navegador pode entender.</p>
</blockquote>
<p>No entanto, isso não é perfeito:</p>
<ul>
<li>Como JSX foi compilado em <code class="gatsby-code-text">React.createElement</code>, <code class="gatsby-code-text">React</code> precisa estar no escopo se você usasse JSX.</li>
<li>Existe algumas <a href="https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md#motivation" target="_blank" rel="nofollow noopener noreferrer">melhorias e simplificações de desempenho</a> que <code class="gatsby-code-text">React.createElement</code> não permite.</li>
</ul>
<p>Para resolver esses problemas, o React 17 apresenta dois novos pontos de entrada para o pacote React que devem ser usados apenas por compiladores como Babel e TypeScript. Em vez de transformar JSX em <code class="gatsby-code-text">React.createElement</code>, <strong>a nova transformação JSX</strong> importa automaticamente funções especiais desses novos pontos de entrada no pacote React e os chama.</p>
<p>Digamos que seu código-fonte tenha a seguinte aparência:</p>
<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">App</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span><span class="token plain-text">Hello World</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div>
<p>É para isso que a nova transformação JSX o compila:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token comment">// Inserido por um compilador (não importe você mesmo!)</span>
<span class="token keyword">import</span> <span class="token punctuation">{</span>jsx <span class="token keyword">as</span> _jsx<span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react/jsx-runtime'</span><span class="token punctuation">;</span>

<span class="token keyword">function</span> <span class="token function">App</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token function">_jsx</span><span class="token punctuation">(</span><span class="token string">'h1'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> children<span class="token operator">:</span> <span class="token string">'Hello world'</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div>
<p>Observe como nosso código original <strong>não precisava mais importar o React</strong> para usar JSX! (Mas ainda precisaríamos importar o React para usar Hooks ou outras exportações que o React fornece.)</p>
<p><strong>Esta mudança é totalmente compatível com todo o código JSX existente</strong>, assim você não terá que mudar seus componentes. Se estiver curioso, vocÊ pode verificar a <a href="https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md#detailed-design" target="_blank" rel="nofollow noopener noreferrer">RFC técnica</a> para obter mais detalhes sobre como a nova transformação funciona.</p>
<blockquote>
<p>Nota</p>
<p>As funções dentro de <code class="gatsby-code-text">react/jsx-runtime</code> e <code class="gatsby-code-text">react/jsx-dev-runtime</code> devem ser usadas apenas pela transformação do compilador. Se você precisa criar elementos manualmente em seu código, você deve continuar usando <code class="gatsby-code-text">React.createElement</code>. Ele continuará a funcionar e não irá embora.</p>
</blockquote>
<h2 id="how-to-upgrade-to-the-new-jsx-transform"><a href="#how-to-upgrade-to-the-new-jsx-transform" 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>Como Fazer Upgrade para a Nova Transformação JSX </h2>
<p>Se você não estiver pronto para atualizar para a nova transformação JSX ou se estiver usando JSX para outra biblioteca, não se preocupe. A transformação antiga não será removida e continuará a ter suporte.</p>
<p>Se quiser fazer upgrade, você precisará de duas coisas:</p>
<ul>
<li><strong>Uma versão do React que suporta a nova transformação</strong> (<a href="/blog/2020/08/10/react-v17-rc.html">React 17 RC</a> e superior suportam, mas também lançamos React 16.14.0, React 15.7.0 e React 0.14.10 para pessoas que ainda estão nas versões principais mais antigas).</li>
<li><strong>Um compilador compatível</strong> (consulte as instruções para diferentes ferramentas abaixo).</li>
</ul>
<p>Como a nova transformação JSX não exige que o React esteja no escopo, <a href="#removing-unused-react-imports">também preparamos um script automatizado</a> que removerá as importações desnecessárias de sua base de código.</p>
<h3 id="create-react-app"><a href="#create-react-app" 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>Create React App </h3>
<p>Create React App <a href="https://github.com/facebook/create-react-app/releases/tag/v4.0.0" target="_blank" rel="nofollow noopener noreferrer">4.0.0</a>+ usa a nova transformação para versões compatíveis do React.</p>
<h3 id="nextjs"><a href="#nextjs" 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>Next.js </h3>
<p>Next.js <a href="https://github.com/vercel/next.js/releases/tag/v9.5.3" target="_blank" rel="nofollow noopener noreferrer">v9.5.3</a>+ usa a nova transformação para versões compatíveis do React.</p>
<h3 id="gatsby"><a href="#gatsby" 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>Gatsby </h3>
<p>Gatsby <a href="https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby/CHANGELOG.md#22452-2020-08-28" target="_blank" rel="nofollow noopener noreferrer">v2.24.5</a>+ usa a nova transformação para versões compatíveis do React.</p>
<blockquote>
<p>Nota</p>
<p>Se você obtiver <a href="https://github.com/gatsbyjs/gatsby/issues/26979" target="_blank" rel="nofollow noopener noreferrer">este erro de Gatsby</a> após atualizar para React 17 RC, execute <code class="gatsby-code-text">npm update</code> para corrigi-lo.</p>
</blockquote>
<h3 id="manual-babel-setup"><a href="#manual-babel-setup" 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>Configuração Manual do Babel </h3>
<p>O suporte para a nova transformação JSX está disponível no Babel <a href="https://babeljs.io/blog/2020/03/16/7.9.0" target="_blank" rel="nofollow noopener noreferrer">v7.9.0</a> e superior.</p>
<p>Primeiro, você precisará atualizar para a última transformação do Babel e do plugin.</p>
<p>Se você estiver usando <code class="gatsby-code-text">@babel/plugin-transform-react-jsx</code>:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token comment"># para usuários npm</span>
<span class="token function">npm</span> update @babel/core @babel/plugin-transform-react-jsx</code></pre></div>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token comment"># para usuários yarn</span>
<span class="token function">yarn</span> upgrade @babel/core @babel/plugin-transform-react-jsx</code></pre></div>
<p>Se você estiver usando <code class="gatsby-code-text">@babel/preset-react</code>:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token comment"># para usuários npm</span>
<span class="token function">npm</span> update @babel/core @babel/preset-react</code></pre></div>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token comment"># para usuários yarn</span>
<span class="token function">yarn</span> upgrade @babel/core @babel/preset-react</code></pre></div>
<p>Atualmente, a antiga transformação <code class="gatsby-code-text">{&quot;runtime&quot;: &quot;classic&quot;}</code> é a opção padrão. Para habilitar a nova transformação, você pode passar <code class="gatsby-code-text">{&quot;runtime&quot;: &quot;automatic&quot;}</code> como uma opção para <code class="gatsby-code-text">@babel/plugin-transform-react-jsx</code> ou <code class="gatsby-code-text">@babel/preset-react</code>:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token comment">// Se você estiver usando @babel/preset-react</span>
<span class="token punctuation">{</span>
  <span class="token string">"presets"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
    <span class="token punctuation">[</span><span class="token string">"@babel/preset-react"</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>
      <span class="token string">"runtime"</span><span class="token operator">:</span> <span class="token string">"automatic"</span>
    <span class="token punctuation">}</span><span class="token punctuation">]</span>
  <span class="token punctuation">]</span>
<span class="token punctuation">}</span></code></pre></div>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token comment">// Se você estiver usando @babel/plugin-transform-react-jsx</span>
<span class="token punctuation">{</span>
  <span class="token string">"plugins"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
    <span class="token punctuation">[</span><span class="token string">"@babel/plugin-transform-react-jsx"</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>
      <span class="token string">"runtime"</span><span class="token operator">:</span> <span class="token string">"automatic"</span>
    <span class="token punctuation">}</span><span class="token punctuation">]</span>
  <span class="token punctuation">]</span>
<span class="token punctuation">}</span></code></pre></div>
<p>A partir do Babel 8, <code class="gatsby-code-text">&quot;automatic&quot;</code> será o tempo de execução padrão para ambos os plug-ins. Para obter mais informações, verifique a documentação do Babel para <a href="https://babeljs.io/docs/en/babel-plugin-transform-react-jsx" target="_blank" rel="nofollow noopener noreferrer">@babel/plugin-transform-react-jsx</a> e <a href="https://babeljs.io/docs/en/babel-preset-react" target="_blank" rel="nofollow noopener noreferrer">@babel/preset-react</a>.</p>
<blockquote>
<p>Nota</p>
<p>Se você usar JSX com uma biblioteca diferente de React, você pode usar <a href="https://babeljs.io/docs/en/babel-preset-react#importsource" target="_blank" rel="nofollow noopener noreferrer">a opção <code class="gatsby-code-text">importSource</code></a> para importar dessa biblioteca - desde que forneça os pontos de entrada necessários. Como alternativa, você pode continuar usando a transformação clássica, que continuará a ser compatível.</p>
<p>Se você é um autor de biblioteca e está implementando o ponto de entrada <code class="gatsby-code-text">/jsx-runtime</code> para sua biblioteca, tenha em mente que <a href="https://github.com/facebook/react/issues/20031#issuecomment-710346866" target="_blank" rel="nofollow noopener noreferrer">há um caso</a> em que até mesmo a nova transformação tem que voltar para <code class="gatsby-code-text">createElement</code> para compatibilidade de versões anteriores. Nesse caso, ele irá importar automaticamente <code class="gatsby-code-text">createElement</code> diretamente do ponto de entrada <em>root</em> especificado por <code class="gatsby-code-text">importSource</code>.</p>
</blockquote>
<h3 id="eslint"><a href="#eslint" 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>ESLint </h3>
<p>Se você estiver usando <a href="https://github.com/yannickcr/eslint-plugin-react" target="_blank" rel="nofollow noopener noreferrer">eslint-plugin-react</a>, as regas de <code class="gatsby-code-text">react/jsx-uses-react</code> e <code class="gatsby-code-text">react/react-in-jsx-scope</code> não são mais necessárias e podem ser desativadas ou removidas.</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token punctuation">{</span>
  <span class="token comment">// ...</span>
  <span class="token string">"rules"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token comment">// ...</span>
    <span class="token string">"react/jsx-uses-react"</span><span class="token operator">:</span> <span class="token string">"off"</span><span class="token punctuation">,</span>
    <span class="token string">"react/react-in-jsx-scope"</span><span class="token operator">:</span> <span class="token string">"off"</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div>
<h3 id="typescript"><a href="#typescript" 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>TypeScript </h3>
<p>TypeScript suporta a nova transformação JSX em <a href="https://devblogs.microsoft.com/typescript/announcing-typescript-4-1/#jsx-factories" target="_blank" rel="nofollow noopener noreferrer">v4.1</a>.</p>
<h3 id="flow"><a href="#flow" 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>Flow </h3>
<p>Flow suporta a nova transformação JSX em <a href="https://github.com/facebook/flow/releases/tag/v0.126.0" target="_blank" rel="nofollow noopener noreferrer">v0.126.0</a> para cima, adicionando <code class="gatsby-code-text">react.runtime = automatic</code> às opções de configuração do Flow.</p>
<h2 id="removing-unused-react-imports"><a href="#removing-unused-react-imports" 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>Removendo Imports React não Utilizadas </h2>
<p>Como a nova transformação JSX importará automaticamente as funções <code class="gatsby-code-text">react/jsx-runtime</code> necessárias, o React não precisará mais estar no escopo quando você usar JSX. Isso pode levar a importação React não utilizadas em seu código. Não faz mal mantê-los, mas se quiser removê-los, recomendamos a execução de um script <a href="https://medium.com/@cpojer/effective-javascript-codemods-5a6686bb46fb" target="_blank" rel="nofollow noopener noreferrer">“codemod”</a> para removê-los automaticamente:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token builtin class-name">cd</span> your_project
npx react-codemod update-react-imports</code></pre></div>
<blockquote>
<p>Nota</p>
<p>Se você estiver recebendo errors ao executar o codemod, tente especificar um dialeto JavaScript diferente quando <code class="gatsby-code-text">npx react-codemod update-react-imports</code> solicitar que você escolha um. Em particular, neste momento, a configuração “JavaScript com Flow” suporta sintaxe mais recente do que a configuração “JavaScript”, mesmo se você não usar o Flow. <a href="https://github.com/reactjs/react-codemod/issues" target="_blank" rel="nofollow noopener noreferrer">Crie uma issue</a> se você tiver problemas.</p>
<p>Lembre-se de que a saída do codemod nem sempre corresponderá ao estilo de codificação do seu projeto, então você pode querer executar <a href="https://prettier.io/" target="_blank" rel="nofollow noopener noreferrer">Prettier</a> depois que o codemod terminar para uma formatação consistente.</p>
</blockquote>
<p>Executar este codemod irá:</p>
<ul>
<li>Remover todas as importações React não utilizadas como resultado da atualização para a nova transformação JSX.</li>
<li>Alterar todas as importações React padrão (ou seja, <code class="gatsby-code-text">import React from &quot;react&quot;</code>) para importações nomeadas desestruturadas (ex. <code class="gatsby-code-text">import { useState } from &quot;react&quot;</code>), que é o estilo preferido no futuro. Este codemod <strong>não</strong> afetará as importações de namespace existentes (ou seja, <code class="gatsby-code-text">import * as React from &quot;react&quot;</code>), que também é um estilo válido. As importações padrão continuarão funcionando no React 17, mas, a longo prazo, encorajamos nos afastar delas.</li>
</ul>
<p>Por exemplo,</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>

<span class="token keyword">function</span> <span class="token function">App</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span><span class="token plain-text">Olá Mundo</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div>
<p>será substituído por</p>
<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">App</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span><span class="token plain-text">Olá Mundo</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div>
<p>Se você usar alguma outra importação do React - por exemplo, um Hook - então o codemod irá convertê-lo em uma importação nomeada.</p>
<p>Por exemplo,</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>

<span class="token keyword">function</span> <span class="token function">App</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">const</span> <span class="token punctuation">[</span>text<span class="token punctuation">,</span> setText<span class="token punctuation">]</span> <span class="token operator">=</span> React<span class="token punctuation">.</span><span class="token function">useState</span><span class="token punctuation">(</span><span class="token string">'Olá Mundo'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span><span class="token punctuation">{</span>text<span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div>
<p>será substituído por</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token keyword">import</span> <span class="token punctuation">{</span> useState <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>

<span class="token keyword">function</span> <span class="token function">App</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">const</span> <span class="token punctuation">[</span>text<span class="token punctuation">,</span> setText<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token function">useState</span><span class="token punctuation">(</span><span class="token string">'Olá Mundo'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span><span class="token punctuation">{</span>text<span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div>
<p>Além de limpar as importações não utilizadas, isso também o ajudará a se preparar para uma versão principal futura do React (não do React 17), que oferecerá suporte aos Módulos ES e não terá uma exportação padrão.</p>
<h2 id="thanks"><a href="#thanks" 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>Obrigado </h2>
<p>Gostaríamso de agradecer aos mantenedores de Babel, TypeScript, Create React App, Next.js, Gatsby, ESLint e Flow por sua ajuda na implementação e intergação da nova transformação JSX. Também queremos agradecer à comunidade React por seus comentários e discussões sobre a <a href="https://github.com/reactjs/rfcs/pull/107" target="_blank" rel="nofollow noopener noreferrer">RFC técnica</a>.</p>]]></description><link>https://pt-br.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html</link><guid isPermaLink="false">https://pt-br.reactjs.org/blog/2020/09/22/introducing-the-new-jsx-transform.html</guid><pubDate>Tue, 22 Sep 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[React v17.0 Candidato à lançamento: Sem novas funcionalidades]]></title><description><![CDATA[<p>Hoje, estamos publicando o primeiro candidato à lançamento do React 17. Já se passaram dois anos e meio desde <a href="/blog/2017/09/26/react-v16.0.html">o principal lançamento anterior do React</a>, que é muito tempo, mesmo para os nossos padrões! Nesta postagem do blog, descreveremos a função desta versão principal, quais mudanças você pode esperar dela e como você pode experimentar esta versão.</p>
<h2 id="no-new-features"><a href="#no-new-features" 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>Sem novas funcionalidades </h2>
<p>A versão React 17 é incomum porque não adiciona nenhum novo recurso voltado para o desenvolvedor. Em vez disso, esta versão está focada principalmente em <strong>tornar mais fácil atualizar o próprio React</strong>.</p>
<p>Estamos trabalhando ativamente nos novos recursos do React, mas eles não fazem parte desta versão. O lançamento do React 17 é uma parte fundamental de nossa estratégia para implementá-los sem deixar ninguém para trás.</p>
<p>Em particular, o <strong>React 17 é uma versão “passo a passo”</strong> que torna mais seguro incorporar uma árvore gerenciada por uma versão do React dentro de uma árvore gerenciada por uma versão diferente do React.</p>
<h2 id="gradual-upgrades"><a href="#gradual-upgrades" 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 Graduais </h2>
<p>Nos últimos sete anos, as atualizações do React têm sido “tudo ou nada”. Ou você permanece com uma versão antiga ou atualiza todo o seu aplicativo para uma nova versão. Não havia meio-termo.</p>
<p>Isso funcionou até agora, mas estamos atingindo os limites da estratégia de atualização “tudo ou nada”. Algumas mudanças de API, por exemplo, descontinuar a <a href="/docs/legacy-context.html">legada API de contexto</a>, são impossíveis de fazer de forma automatizada. Mesmo que a maioria dos aplicativos escritos hoje nunca os use, ainda oferecemos suporte para eles no React. Temos que escolher entre suportá-los no React indefinidamente ou deixar alguns aplicativos para trás em uma versão antiga do React. Ambas as opções não são boas.</p>
<p>Portanto, queríamos oferecer outra opção.</p>
<p><strong>React 17 permite atualizações graduais do React.</strong> Quando você atualiza do React 15 para o 16 (ou, em breve, do React 16 para o 17), normalmente atualiza todo o seu aplicativo de uma vez. Isso funciona bem para muitos aplicativos. Mas pode ser cada vez mais desafiador se a base de código foi escrita há mais de alguns anos e não é mantida ativamente. E embora seja possível usar duas versões do React na mesma página, até o React 17 isso era frágil e causava problemas com eventos.</p>
<p>Estamos corrigindo muitos desses problemas com o React 17. Isso significa que <strong>quando o React 18 e as próximas versões futuras forem lançadas, você terá mais opções</strong>. A primeira opção será atualizar todo o seu aplicativo de uma vez, como você pode ter feito antes. Mas você também terá a opção de atualizar seu aplicativo peça por peça. Por exemplo, você pode decidir migrar a maior parte do seu aplicativo para o React 18, mas manter algumas caixas de diálogo <em>lazy-loaded</em> ou um sub-rota no React 17.</p>
<p>Isso não significa que você <em>precise</em> fazer atualizações graduais. Para a maioria dos aplicativos, atualizar tudo de uma vez ainda é a melhor solução. Carregar duas versões do React — mesmo se uma delas for carregada lentamente sob demanda — ainda não é o ideal. No entanto, para aplicativos maiores que não são mantidos ativamente, pode fazer sentido considerar essa opção, e o React 17 permite que esses aplicativos não sejam deixados para trás.</p>
<p>Para permitir atualizações graduais, precisamos fazer algumas mudanças no sistema de eventos do React. O React 17 é um grande lançamento porque essas alterações são potencialmente prejudiciais. Na prática, só tivemos que mudar menos de vinte componentes de mais de 100.000, então <strong>esperamos que a maioria dos aplicativos possa atualizar para o React 17 sem muitos problemas</strong>. <a href="https://github.com/facebook/react/issues" target="_blank" rel="nofollow noopener noreferrer">Conte-nos</a> se você tiver problemas.</p>
<h3 id="demo-of-gradual-upgrades"><a href="#demo-of-gradual-upgrades" 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>Demonstração das atualizações graduais </h3>
<p>Preparamos um <a href="https://github.com/reactjs/react-gradual-upgrade-demo/" target="_blank" rel="nofollow noopener noreferrer">repositório de exemplo</a> demonstrando como carregar lentamente uma versão mais antiga do React, se necessário. Esta demonstração usa Create React App, mas deve ser possível seguir uma abordagem semelhante com qualquer outra ferramenta. Aceitamos pull requests com demonstrações usando outras ferramentas.</p>
<blockquote>
<p>Nota</p>
<p><strong>Adiamos outras mudanças</strong> até depois do React 17. O objetivo desta versão é permitir atualizações graduais. Se atualizar para React 17 fosse muito difícil, isso iria contra o seu propósito.</p>
</blockquote>
<h2 id="changes-to-event-delegation"><a href="#changes-to-event-delegation" 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>Alterações na delegação de eventos </h2>
<p>Tecnicamente, sempre foi possível aninhar aplicativos desenvolvidos com diferentes versões do React. No entanto, era bastante frágil por causa de como o sistema de eventos React funcionava.</p>
<p>Nos componentes React, você geralmente escreve manipuladores de eventos (event handler) inline:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token attr-name">onClick</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span>handleClick<span class="token punctuation">}</span></span><span class="token punctuation">></span></span></code></pre></div>
<p>O DOM vanilla equivalente a este código é semelhante à:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx">myButton<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> handleClick<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>No entanto, para a maioria dos eventos, o React não os anexa aos nós DOM nos quais você os declara. Em vez disso, o React anexa um manipulador por tipo de evento diretamente no nó <code class="gatsby-code-text">document</code>. Isso é chamado de <a href="https://davidwalsh.name/event-delegate" target="_blank" rel="nofollow noopener noreferrer">delegação de evento</a>. Além de seus benefícios de desempenho em grandes árvores de aplicativos, também torna mais fácil adicionar novos recursos como <a href="https://twitter.com/dan_abramov/status/1200118229697486849" target="_blank" rel="nofollow noopener noreferrer">eventos de repetição</a>.</p>
<p>O React faz a delegação de eventos automaticamente desde seu primeiro lançamento. Quando um evento DOM é disparado no documento, o React descobre qual componente deve ser chamado e, em seguida, o evento React “propaga” para cima através de seus componentes. Mas, nos bastidores, o evento nativo já atingiu o nível <code class="gatsby-code-text">documento</code>, onde o React instala seus manipuladores de eventos.</p>
<p>No entanto, esse é um problema para atualizações graduais.</p>
<p>Se você tiver várias versões do React na página, todas elas registram manipulador de eventos (event handler) na parte superior. Isso quebra <code class="gatsby-code-text">e.stopPropagation()</code>: se uma árvore aninhada parou a propagação de um evento, a árvore externa ainda o receberia. Isso tornou difícil aninhar diferentes versões do React. Essa preocupação não é hipotética — por exemplo, o editor Atom <a href="https://github.com/facebook/react/pull/8117" target="_blank" rel="nofollow noopener noreferrer">encontrou isso</a> quatro anos atrás.</p>
<p>É por isso que estamos mudando a forma como o React anexa eventos ao DOM nos bastidores.</p>
<p><strong>No React 17, o React não anexará mais manipuladores de eventos no nível do <code class="gatsby-code-text">documento</code>. Em vez disso, ele os anexará ao contêiner DOM raiz no qual sua árvore do React é renderizada:</strong></p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token keyword">const</span> rootNode <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>
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> rootNode<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>No React 16 e anteriores, o React faria <code class="gatsby-code-text">document.addEventListener()</code> para a maioria dos eventos. O React 17 chamará <code class="gatsby-code-text">rootNode.addEventListener()</code> por debaixo dos panos.</p>
<p>
  <a
    class="gatsby-resp-image-link"
    href="/static/bb4b10114882a50090b8ff61b3c4d0fd/31868/react_17_delegation.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
  
  <span
    class="gatsby-resp-image-wrapper"
    style="position: relative; display: block;  max-width: 840px; margin-left: auto; margin-right: auto;"
  >
    <span
      class="gatsby-resp-image-background-image"
      style="padding-bottom: 77.14285714285715%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAPCAYAAADkmO9VAAAACXBIWXMAAAsSAAALEgHS3X78AAACcUlEQVQ4y21T2W4TMRTNr0MfgDeEkPgSJF55JarUJSVpm07WaZLZV+/24XomE9LFypEd3zPnrh59nHFcED5MGT7fc/wIBL7OOT7ds+7O21/D878/CXwjfHnov7042kYhs/DYEnbcIpYOB+HwLIGQO7IZDJyBFxIvEh6u+2Z7Zh/htBz9bL8bAbO7AjTDu8u5427fmEaWjN7MtUHBOPKiRB7O0Nz/gkjm0G3a2TseHbS1KIVCUTfI8vxkGzByHbFHXdfYRwni9RSu3MAqBpWvYXhxDKyPjHOO/X7fwS9LTgbbaDhYY8AYQ11VOGQVZJPAippQwTQxZWdOaXnBgjJJkhjyRSVcX0NDHhqpwLQFbxtsSobn7ABIEpQNDMvgjOzSY1KjVQYNE1jscgTMYRm14Kp3OBqUGV0cuMFkFeJxl6AsI5iWhLSkPe0E/VLGIhUGQVrh5zjA9abCrpBYxexlynErcbmOMNnnmEQ15k8TsOrQRdWlfOT56O52KS43CcaLGL9nzyi4QFQqKO3Hhog+2CCr8TcXeGgtVlWLeTBBRBFLxSnl/FSniCncxRVuMoPHFvgTNphFJaLWQJvjHHLjcHsoMU1KzNISD0mKx3CLec5oPAoYrfrGERYFw+W+wXUqcVsajMO6E1xXCi3Vt4vQ0683ByypGUsq8oK6F9QK61ZDklcMo0W8ZdHiZht3L+kqFpjlCstGo1Q971TDgkss8wZPWYGAhNf07ErtXowEjg8gLGpMM4G7RGDF+mdoXs+hV2dEjqiDibRoTT/5/im6swj9f9/pRPRCFTk98/t/bM7uSAhvInuP589aU1mk7ODP/wCR7n8+8QwuZQAAAABJRU5ErkJggg=='); background-size: cover; display: block;"
    >
      <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="Um diagrama mostrando como o React 17 anexa eventos às raízes em vez de anexar ao documento"
        title=""
        src="/static/bb4b10114882a50090b8ff61b3c4d0fd/1e088/react_17_delegation.png"
        srcset="/static/bb4b10114882a50090b8ff61b3c4d0fd/65ed1/react_17_delegation.png 210w,
/static/bb4b10114882a50090b8ff61b3c4d0fd/d10fb/react_17_delegation.png 420w,
/static/bb4b10114882a50090b8ff61b3c4d0fd/1e088/react_17_delegation.png 840w,
/static/bb4b10114882a50090b8ff61b3c4d0fd/78612/react_17_delegation.png 1260w,
/static/bb4b10114882a50090b8ff61b3c4d0fd/21cdd/react_17_delegation.png 1680w,
/static/bb4b10114882a50090b8ff61b3c4d0fd/31868/react_17_delegation.png 3496w"
        sizes="(max-width: 840px) 100vw, 840px"
      />
    </span>
  </span>
  
  </a>
    </p>
<p>Graças a essa mudança, <strong>agora é mais seguro incorporar uma árvore do React gerenciada por uma versão dentro de uma árvore gerenciada por uma versão diferente do React</strong>. Observe que para que isso funcione, ambas as versões precisam ser 17 ou superior, por isso atualizar para React 17 é importante. De certa forma, o React 17 é um lançamento “trampolim” que torna as próximas atualizações graduais viáveis.</p>
<p>Essa mudança também <strong>torna mais fácil incorporar o React em aplicativos desenvolvidos com outras tecnologias</strong>. Por exemplo, se o “shell” externo de seu aplicativo for escrito em jQuery, mas o código mais recente dentro dele for escrito com React, <code class="gatsby-code-text">e.stopPropagation()</code> dentro do código React agora evitará que ele alcance o código jQuery — como você esperaria. Isso também funciona na outra direção. Se você não gosta mais de React e deseja reescrever seu aplicativo — por exemplo, em jQuery — você pode começar a converter o shell externo de React para jQuery sem interromper a propagação do evento.</p>
<p>Confirmamos que <a href="https://github.com/facebook/react/issues/7094" target="_blank" rel="nofollow noopener noreferrer">vários</a> <a href="https://github.com/facebook/react/issues/8693" target="_blank" rel="nofollow noopener noreferrer">problemas</a> <a href="https://github.com/facebook/react/issues/12518" target="_blank" rel="nofollow noopener noreferrer">relatados</a> <a href="https://github.com/facebook/react/issues/13451" target="_blank" rel="nofollow noopener noreferrer">ao longo</a> <a href="https://github.com/facebook/react/issues/4335" target="_blank" rel="nofollow noopener noreferrer">dos</a> <a href="https://github.com/facebook/react/issues/1691" target="_blank" rel="nofollow noopener noreferrer">anos</a> <a href="https://github.com/facebook/react/issues/285#issuecomment-253502585" target="_blank" rel="nofollow noopener noreferrer">em</a> <a href="https://github.com/facebook/react/pull/8117" target="_blank" rel="nofollow noopener noreferrer">nosso</a> <a href="https://github.com/facebook/react/issues/11530" target="_blank" rel="nofollow noopener noreferrer">rastreador</a> <a href="https://github.com/facebook/react/issues/7128" target="_blank" rel="nofollow noopener noreferrer">de problemas</a> relacionadas à integração do React com o código não React foram corrigidas pelo novo comportamento.</p>
<blockquote>
<p>Nota</p>
<p>Você deve estar se perguntando se isso quebra o <a href="/docs/portals.html">Portals</a> fora do contêiner raiz. A resposta é que o React <em>também</em> ouve eventos nos contêineres do portal, portanto, isso não é um problema.</p>
</blockquote>
<h4 id="fixing-potential-issues"><a href="#fixing-potential-issues" 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>Corrigindo potenciais problemas </h4>
<p>Como acontece com qualquer alteração importante, é provável que algum código precise ser ajustado. No Facebook, tivemos que ajustar cerca de 10 módulos no total (de muitos milhares) para trabalhar com essa mudança.</p>
<p>Por exemplo, se você adicionar manualmente os DOM listners com <code class="gatsby-code-text">document.addEventListener(...)</code>, você pode esperar que eles capturem todos os eventos React. No React 16 e anteriores, mesmo se você chamar <code class="gatsby-code-text">e.stopPropagation()</code> em um manipulador de eventos (event handler) do React, seus listners <code class="gatsby-code-text">document</code> personalizados ainda os receberão porque o evento nativo <em>já</em> está no nível do documento. Com React 17, a propagação <em>iria</em> parar (conforme solicitado!), Então seus manipuladores de <code class="gatsby-code-text">document</code> não disparariam:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx">document<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token comment">// Este manipulador personalizado não receberá mais cliques</span>
  <span class="token comment">// dos componentes React que chamaram e.stopPropagation()</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>Você pode corrigir um código como esse convertendo seu listener para usar a <a href="https://javascript.info/bubbling-and-capturing#capturing" target="_blank" rel="nofollow noopener noreferrer">fase de captura</a>. Para fazer isso, você pode passar <code class="gatsby-code-text">{ capture: true }</code> como o terceiro argumento para <code class="gatsby-code-text">document.addEventListener</code>:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx">document<span class="token punctuation">.</span><span class="token function">addEventListener</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> <span class="token keyword">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token comment">// Agora este event handlers usa a fase de captura</span>
  <span class="token comment">// então ele recebe *todas* os eventos de clique abaixo!</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span> capture<span class="token operator">:</span> <span class="token boolean">true</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>Observe como essa estratégia é mais resiliente no geral — por exemplo, ela provavelmente corrigirá bugs existentes em seu código que acontecem quando <code class="gatsby-code-text">e.stopPropagation()</code> é chamado fora de um manipulador de eventos (event handler) React. Em outras palavras, a <strong>propagação do evento no React 17 funciona mais próxima do DOM regular</strong> .</p>
<h2 id="other-breaking-changes"><a href="#other-breaking-changes" 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>Outras alterações significativas </h2>
<p>Mantivemos as alterações significativas no React 17 ao mínimo. Por exemplo, ele não remove nenhum dos métodos que foram descontinuados nas versões anteriores. No entanto, inclui algumas outras alterações importantes que têm sido relativamente seguras em nossa experiência. No total, tivemos que ajustar menos de 20 de mais de 100.000 nossos componentes por causa deles.</p>
<h3 id="aligning-with-browsers"><a href="#aligning-with-browsers" 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>Alinhando com navegadores </h3>
<p>Fizemos algumas alterações menores relacionadas ao sistema de eventos:</p>
<ul>
<li>O evento <code class="gatsby-code-text">onScroll</code> <strong>não propaga mais</strong> a fim de previnir algumas <a href="https://github.com/facebook/react/issues/15723" target="_blank" rel="nofollow noopener noreferrer">confusões comuns</a>.</li>
<li>Os eventos React <code class="gatsby-code-text">onFocus</code> e <code class="gatsby-code-text">onBlur</code> passaram a usar os eventos nativos <code class="gatsby-code-text">focusin</code> e<code class="gatsby-code-text">focusout</code> por debaixo dos panos, que se aproximam mais do comportamento existente do React e às vezes fornecem informações extras.</li>
<li>Os eventos de fase de captura (por exemplo, <code class="gatsby-code-text">onClickCapture</code>) agora usam ouvintes de fase de captura do navegador real.</li>
</ul>
<p>Essas mudanças alinham o React mais de perto com o comportamento do navegador e melhoram a interoperabilidade.</p>
<blockquote>
<p>Nota</p>
<p>Embora o React 17 tenha mudado de <code class="gatsby-code-text">focus</code> para<code class="gatsby-code-text">focusin</code> <em>por debaixo dos panos</em> para o evento <code class="gatsby-code-text">onFocus</code>, note que isso <strong>não</strong> afetou o comportamento de propagação. No React, o evento <code class="gatsby-code-text">onFocus</code> sempre propagava e continua a ocorrer no React 17 porque geralmente é um padrão mais útil. Consulte <a href="https://codesandbox.io/s/strange-albattani-7tqr7?file=/src/App.js" target="_blank" rel="nofollow noopener noreferrer">este sandbox</a> para as diferentes verificações que você pode adicionar para diferentes casos de uso específicos.</p>
</blockquote>
<h3 id="no-event-pooling"><a href="#no-event-pooling" 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>Sem pool de eventos </h3>
<p>O React 17 remove a otimização de pooling de eventos do React. Ele não melhora o desempenho em navegadores modernos e confunde até mesmo usuários experientes do React:</p>
<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">handleChange</span><span class="token punctuation">(</span><span class="token parameter">e</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token function">setData</span><span class="token punctuation">(</span><span class="token parameter">data</span> <span class="token operator">=></span> <span class="token punctuation">(</span><span class="token punctuation">{</span>
    <span class="token operator">...</span>data<span class="token punctuation">,</span>
    <span class="token comment">// Isso trava no React 16 e anteriores:</span>
    text<span class="token operator">:</span> e<span class="token punctuation">.</span>target<span class="token punctuation">.</span>value
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div>
<p>Isso ocorre porque o React reutilizou os objetos de evento entre diferentes eventos para desempenho em navegadores antigos e definiu todos os campos de evento como <code class="gatsby-code-text">null</code> entre eles. Com o React 16 e anteriores, você deve chamar <code class="gatsby-code-text">e.persist()</code> para usar o evento apropriadamente ou ler a propriedade que você precisa anteriormente.</p>
<p><strong>No React 17, este código funciona conforme o esperado. A antiga otimização do pool de eventos foi totalmente removida, para que você possa ler os campos do evento sempre que precisar.</strong></p>
<p>Esta é uma mudança de comportamento, e é por isso que a estamos marcando como falha, mas na prática não vimos nada quebrar no Facebook. (Talvez até tenha corrigido alguns bugs!) Observe que <code class="gatsby-code-text">e.persist()</code> ainda está disponível no objeto de evento React, mas agora não faz nada.</p>
<h3 id="effect-cleanup-timing"><a href="#effect-cleanup-timing" 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>Tempo de limpeza do Effect </h3>
<p>Estamos tornando o tempo da função de limpeza <code class="gatsby-code-text">useEffect</code> mais consistente.</p>
<div class="gatsby-highlight has-highlighted-lines" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token function">useEffect</span> <span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  <span class="token comment">// Este é o próprio Effect.</span>
<span class="gatsby-highlight-code-line">  <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span></span><span class="gatsby-highlight-code-line">    <span class="token comment">// Esta é sua limpeza.</span></span><span class="gatsby-highlight-code-line">  <span class="token punctuation">}</span><span class="token punctuation">;</span></span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>A maioria dos efeitos não precisa atrasar as atualizações da tela, portanto, o React os executa de forma assíncrona logo após a atualização ser refletida na tela. (Para os raros casos em que você precisa de um efeito para bloquear a pintura, por exemplo, para medir e posicionar uma tooltip, prefira <code class="gatsby-code-text">useLayoutEffect</code>.)</p>
<p>No entanto, quando um componente é desmontado, as funções de <em>limpeza</em> de efeito usadas para serem executadas de maneira síncrona (semelhante a <code class="gatsby-code-text">componentWillUnmount</code> sendo síncrono em classes). Descobrimos que isso não é ideal para aplicativos maiores porque retarda as transições de telas grandes (por exemplo, alternar entre guias).</p>
<p><strong>No React 17, a função de limpeza de efeito sempre é executada de forma assíncrona — por exemplo, se o componente está desmontado, a limpeza é executada <em>após</em> a tela ter sido atualizada.</strong></p>
<p>Isso reflete como os próprios efeitos funcionam mais de perto. Nos raros casos em que você pode querer confiar na execução síncrona, você pode alternar para <code class="gatsby-code-text">useLayoutEffect</code>.</p>
<blockquote>
<p>Nota</p>
<p>Você deve estar se perguntando se isso significa que agora você não conseguirá corrigir avisos sobre <code class="gatsby-code-text">setState</code> em componentes não montados. Não se preocupe — o React verifica especificamente este caso e <em>não</em> dispara avisos de <code class="gatsby-code-text">setState</code> no curto espaço entre a desmontagem e a limpeza.<strong>Portanto, as solicitações ou intervalos de cancelamento de código quase sempre podem permanecer os mesmos.</strong></p>
</blockquote>
<p>Além disso, o React 17 sempre executará todas as funções de limpeza de efeitos (para todos os componentes) antes de executar quaisquer novos efeitos. O React 16 só garantiu essa ordem para efeitos dentro de um componente.</p>
<h4 id="potential-issues"><a href="#potential-issues" 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>Problemas potenciais </h4>
<p>Nós vimos apenas alguns componentes quebrarem com essa mudança, embora as bibliotecas reutilizáveis ​​possam precisar testá-lo mais completamente. Um exemplo de código problemático pode ser assim:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token function">useEffect</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  someRef<span class="token punctuation">.</span>current<span class="token punctuation">.</span><span class="token function">someSetupMethod</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
    someRef<span class="token punctuation">.</span>current<span class="token punctuation">.</span><span class="token function">someCleanupMethod</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>O problema é que <code class="gatsby-code-text">someRef.current</code> é mutável, portanto, no momento em que a função de limpeza é executada, pode ter sido definido como <code class="gatsby-code-text">null</code>. A solução é capturar quaisquer valores mutáveis ​​<em>dentro</em> do efeito:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token function">useEffect</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  <span class="token keyword">const</span> instance <span class="token operator">=</span> someRef<span class="token punctuation">.</span>current<span class="token punctuation">;</span>
  instance<span class="token punctuation">.</span><span class="token function">someSetupMethod</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
    instance<span class="token punctuation">.</span><span class="token function">someCleanupMethod</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>Não esperamos que este seja um problema comum porque <a href="https://github.com/facebook/react/tree/master/packages/eslint-plugin-react-hooks" target="_blank" rel="nofollow noopener noreferrer">nossa regra de lint <code class="gatsby-code-text">eslint-plugin-react-hooks /haustive-deps</code></a> (certifique-se de usá-lo!) sempre alertamos sobre isso.</p>
<h3 id="consistent-errors-for-returning-undefined"><a href="#consistent-errors-for-returning-undefined" 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>Erros consistentes para retornar indefinido </h3>
<p>No React 16 e anteriores, retornar <code class="gatsby-code-text">undefined</code> sempre foi um erro:</p>
<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">Button</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span><span class="token punctuation">;</span> <span class="token comment">// Erro: nada foi retornado da renderização</span>
<span class="token punctuation">}</span></code></pre></div>
<p>Isso ocorre em parte porque é fácil retornar <code class="gatsby-code-text">undefined</code> involuntariamente:</p>
<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">Button</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token comment">// Esquecemos de escrever return, então este componente retorna indefinido.</span>
  <span class="token comment">// React mostra isso como um erro em vez de ignorá-lo.</span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token punctuation">/></span></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre></div>
<p>Anteriormente, o React fazia isso apenas para componentes de classe e função, mas não verificava os valores de retorno dos componentes <code class="gatsby-code-text">forwardRef</code> e <code class="gatsby-code-text">memo</code>. Isso ocorreu devido a um erro de codificação.</p>
<p><strong>No React 17, o comportamento dos componentes <code class="gatsby-code-text">forwardRef</code> e <code class="gatsby-code-text">memo</code> é consistente com funções regulares e componentes de classe. Retornar <code class="gatsby-code-text">undefined</code> deles é um erro.</strong></p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token keyword">let</span> Button <span class="token operator">=</span> <span class="token function">forwardRef</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  <span class="token comment">// Esquecemos de escrever return, então este componente retorna indefinido.</span>
  <span class="token comment">// React 17 mostra isso como um erro em vez de ignorá-lo.</span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token punctuation">/></span></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token keyword">let</span> Button <span class="token operator">=</span> <span class="token function">memo</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  <span class="token comment">// Esquecemos de escrever return, então este componente retorna indefinido.</span>
  <span class="token comment">// React 17 mostra isso como um erro em vez de ignorá-lo.</span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>button</span> <span class="token punctuation">/></span></span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>Para os casos em que você não deseja renderizar nada intencionalmente, retorne <code class="gatsby-code-text">null</code>.</p>
<h3 id="native-component-stacks"><a href="#native-component-stacks" 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>Pilhas de componentes nativos </h3>
<p>Quando você lança um erro no navegador, o navegador fornece um rastreamento de pilha com nomes de função JavaScript e seus locais. No entanto, as pilhas de JavaScript geralmente não são suficientes para diagnosticar um problema porque a hierarquia da árvore React pode ser tão importante. Você quer saber não apenas que um <code class="gatsby-code-text">Button</code> gerou um erro, mas <em>onde na árvore React</em> esse <code class="gatsby-code-text">Button</code> está.</p>
<p>Para resolver isso, o React 16 começou a imprimir “pilhas de componentes” quando você tinha um erro. Ainda assim, eles costumavam ser inferiores às pilhas nativas de JavaScript. Em particular, eles não podiam ser clicados no console porque o React não sabia onde a função foi declarada no código-fonte. Além disso, eles eram <a href="https://github.com/facebook/react/issues/12757" target="_blank" rel="nofollow noopener noreferrer">praticamente inúteis na produção</a>. Ao contrário das pilhas JavaScript reduzidas regulares, que podem ser restauradas automaticamente aos nomes das funções originais com um mapa de origem, com as pilhas de componentes React você tinha que escolher entre as pilhas de produção e o tamanho do pacote.</p>
<p><strong>No React 17, as pilhas de componentes são geradas usando um mecanismo diferente que as une a partir das pilhas JavaScript nativas regulares. Isso permite que você obtenha os rastreamentos de pilha do componente React totalmente simbolizados em um ambiente de produção.</strong></p>
<p>A maneira como o React implementa isso é um tanto heterodoxa. Atualmente, os navegadores não fornecem uma maneira de obter o quadro de pilha de uma função (arquivo de origem e localização). Portanto, quando o React detecta um erro, ele agora <em>reconstrói</em> sua pilha de componentes lançando (e capturando) um erro temporário de dentro de cada um dos componentes acima, quando possível. Isso adiciona uma pequena penalidade de desempenho para travamentos, mas só acontece uma vez por tipo de componente.</p>
<p>Se estiver curioso, você pode ler mais detalhes <a href="https://github.com/facebook/react/pull/18561" target="_blank" rel="nofollow noopener noreferrer">neste pull request</a>, mas na maior parte, este mecanismo exato não deve afetar seu código. De sua perspectiva, o novo recurso é que as pilhas de componentes agora são clicáveis ​​(porque contam com os frames de pilha do navegador nativo) e que você pode decodificá-los em produção como faria com erros regulares de JavaScript.</p>
<p>A parte que constitui uma alteração significativa é que, para que isso funcione, o React executa novamente partes de algumas das funções do React e dos construtores da classe React acima na pilha depois que um erro é capturado. Uma vez que funções de renderização e construtores de classe não devem ter efeitos colaterais (o que também é importante para a renderização de servidor), isso não deve representar nenhum problema prático.</p>
<h3 id="removing-private-exports"><a href="#removing-private-exports" 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>Removendo exportações privadas </h3>
<p>Por fim, a última mudança importante notável é que removemos alguns componentes internos do React que foram previamente expostos a outros projetos. Em particular, <a href="https://github.com/necolas/react-native-web" target="_blank" rel="nofollow noopener noreferrer">React Native for Web</a> costumava depender de alguns componentes internos do sistema de eventos, mas essa dependência era frágil e costumava quebrar.</p>
<p><strong>No React 17, essas exportações privadas foram removidas. Pelo que sabemos, React Native for Web foi o único projeto que os utilizou, e eles já concluíram uma migração para uma abordagem diferente que não depende dessas exportações privadas.</strong></p>
<p>Isso significa que as versões anteriores do React Native for Web não serão compatíveis com o React 17, mas as versões mais recentes funcionarão com ele. Na prática, isso não muda muito porque o React Native for Web teve que lançar novas versões para se adaptar às mudanças internas do React.</p>
<p>Além disso, removemos os métodos auxiliares <code class="gatsby-code-text">ReactTestUtils.SimulateNative</code>. Eles nunca foram documentados, não cumprem exatamente o que seus nomes indicam e não funcionam com as alterações que fizemos no sistema de eventos. Se você deseja uma maneira conveniente de disparar eventos nativos do navegador em testes, verifique a <a href="https://testing-library.com/docs/dom-testing-library/api-events" target="_blank" rel="nofollow noopener noreferrer">Biblioteca de testes do React</a>.</p>
<h2 id="installation"><a href="#installation" 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>Instalação </h2>
<p>Incentivamos você a experimentar o React 17.0 Release Candidate em breve e <a href="https://github.com/facebook/react/issues" target="_blank" rel="nofollow noopener noreferrer">levantar quaisquer problemas</a> para os problemas que você pode encontrar na migração. <strong>Lembre-se de que um candidato a lançamento tem mais probabilidade de conter bugs do que um lançamento estável, portanto, não o implante na produção ainda.</strong></p>
<p>Para instalar o React 17 RC com npm, execute:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token function">npm</span> <span class="token function">install</span> react@17.0.0-rc.3 react-dom@17.0.0-rc.3</code></pre></div>
<p>Para instalar o React 17 RC com Yarn, execute:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token function">yarn</span> <span class="token function">add</span> react@17.0.0-rc.3 react-dom@17.0.0-rc.3</code></pre></div>
<p>Também fornecemos compilações UMD do React por meio de um CDN:</p>
<div class="gatsby-highlight" data-language="html"><pre class="gatsby-code-html"><code class="gatsby-code-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">crossorigin</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://unpkg.com/react@17.0.0-rc.3/umd/react.production.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">crossorigin</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://unpkg.com/react-dom@17.0.0-rc.3/umd/react-dom.production.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre></div>
<p>Consulte a documentação para <a href="/docs/installation.html">instruções de instalação detalhadas</a>.</p>
<h2 id="changelog"><a href="#changelog" 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>Changelog </h2>
<h3 id="react"><a href="#react" 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>React </h3>
<ul>
<li>Adicione <code class="gatsby-code-text">react/jsx-runtime</code> e <code class="gatsby-code-text">react/jsx-dev-runtime</code> para que a <a href="https://babeljs.io/blog/2020/03/16/7.9.0#a-new-jsx-transform-11154-https-githubcom-babel-babel-pull-11154" target="_blank" rel="nofollow noopener noreferrer">nova transformação JSX</a>. (<a href="https://github.com/lunaruan" target="_blank" rel="nofollow noopener noreferrer">@lunaruan</a> em <a href="https://github.com/facebook/react/pull/18299" target="_blank" rel="nofollow noopener noreferrer">#18299</a>)</li>
<li>Construa pilhas de componentes a partir de quadros de erro nativos. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18561" target="_blank" rel="nofollow noopener noreferrer">#18561</a>)</li>
<li>Permite especificar <code class="gatsby-code-text">displayName</code> no contexto para pilhas melhoradas. (<a href="https://github.com/eps1lon" target="_blank" rel="nofollow noopener noreferrer">@eps1lon</a> em <a href="https://github.com/facebook/react/pull/18224" target="_blank" rel="nofollow noopener noreferrer">#18224</a>)</li>
<li>Impedir que <code class="gatsby-code-text">&#39;use strict&#39;</code> vaze nos pacotes UMD. (<a href="https://github.com/koba04" target="_blank" rel="nofollow noopener noreferrer">@koba04</a> em <a href="https://github.com/facebook/react/pull/19614" target="_blank" rel="nofollow noopener noreferrer">#19614</a>)</li>
<li>Pare de usar <code class="gatsby-code-text">fb.me</code> para redirecionamentos. (<a href="https://github.com/cylim" target="_blank" rel="nofollow noopener noreferrer">@cylim</a> em <a href="https://github.com/facebook/react/pull/19598" target="_blank" rel="nofollow noopener noreferrer">#19598</a>)</li>
</ul>
<h3 id="react-dom"><a href="#react-dom" 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>React DOM </h3>
<ul>
<li>Delegar eventos para raízes ao invés de <code class="gatsby-code-text">document</code>. (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/18195" target="_blank" rel="nofollow noopener noreferrer">#18195</a> e <a href="https://github.com/facebook/react/pulls?q=is%3Apr+author%3Atrueadm+modern+event+is%3Amerged" target="_blank" rel="nofollow noopener noreferrer">outros</a>)</li>
<li>Limpe todos os efeitos antes de executar os próximos efeitos. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/17947" target="_blank" rel="nofollow noopener noreferrer">#17947</a>)</li>
<li>Execute as funções de limpeza <code class="gatsby-code-text">useEffect</code> de forma assíncrona. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/17925" target="_blank" rel="nofollow noopener noreferrer">#17925</a>)</li>
<li>Use o navegador <code class="gatsby-code-text">focusin</code> e <code class="gatsby-code-text">focusout</code> para <code class="gatsby-code-text">onFocus</code> e <code class="gatsby-code-text">onBlur</code>. (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/19186" target="_blank" rel="nofollow noopener noreferrer">#19186</a>)</li>
<li>Faça com que todos os eventos <code class="gatsby-code-text">Capture</code> usem a fase de captura do navegador. (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/19221" target="_blank" rel="nofollow noopener noreferrer">#19221</a>)</li>
<li>Não emule o propagação do evento <code class="gatsby-code-text">onScroll</code>. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19464" target="_blank" rel="nofollow noopener noreferrer">#19464</a>)</li>
<li>Lance se o componente <code class="gatsby-code-text">forwardRef</code> ou <code class="gatsby-code-text">memo</code> retornar <code class="gatsby-code-text">undefined</code>. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19550" target="_blank" rel="nofollow noopener noreferrer">#19550</a>)</li>
<li>Remova o pool de eventos. (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/18969" target="_blank" rel="nofollow noopener noreferrer">#18969</a>)</li>
<li>Pare de expor detalhes internos que não serão necessários para o React Native Web. (<a href="https://github.com/necolas" target="_blank" rel="nofollow noopener noreferrer">@necolas</a> em <a href="https://github.com/facebook/react/pull/18483" target="_blank" rel="nofollow noopener noreferrer">#18483</a>)</li>
<li>Anexe todos os event listeners conhecidos quando o root for montado. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19659" target="_blank" rel="nofollow noopener noreferrer">#19659</a>)</li>
<li>Desative o <code class="gatsby-code-text">console</code> na segunda passagem de renderização do modo DEV de renderização dupla. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18547" target="_blank" rel="nofollow noopener noreferrer">#18547</a>)</li>
<li>Descontinue a API <code class="gatsby-code-text">ReactTestUtils.SimulateNative</code> não documentada e confusa. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/13407" target="_blank" rel="nofollow noopener noreferrer">#13407</a>)</li>
<li>Renomeie os nomes dos campos privados usados nos internos. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/18377" target="_blank" rel="nofollow noopener noreferrer">#18377</a>)</li>
<li>Não chame a API User Timing no desenvolvimento. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/18417" target="_blank" rel="nofollow noopener noreferrer">#18417</a>)</li>
<li>Desative o console durante a renderização repetida no modo estrito. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18547" target="_blank" rel="nofollow noopener noreferrer">#18547</a>)</li>
<li>No Modo Estrito, os componentes de renderização dupla sem Hooks também. (<a href="https://github.com/eps1lon" target="_blank" rel="nofollow noopener noreferrer">@eps1lon</a> em <a href="https://github.com/facebook/react/pull/18430" target="_blank" rel="nofollow noopener noreferrer">#18430</a>)</li>
<li>Permitir chamar <code class="gatsby-code-text">ReactDOM.flushSync</code> durante os métodos de ciclo de vida (mas avisar).  (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18759" target="_blank" rel="nofollow noopener noreferrer">#18759</a>)</li>
<li>Adicione a propriedade <code class="gatsby-code-text">code</code> aos objetos de evento do teclado.  (<a href="https://github.com/bl00mber" target="_blank" rel="nofollow noopener noreferrer">@bl00mber</a> em <a href="https://github.com/facebook/react/pull/18287" target="_blank" rel="nofollow noopener noreferrer">#18287</a>)</li>
<li>Adicione a propriedade <code class="gatsby-code-text">disableRemotePlayback</code> para os elementos <code class="gatsby-code-text">video</code>. (<a href="https://github.com/tombrowndev" target="_blank" rel="nofollow noopener noreferrer">@tombrowndev</a> em <a href="https://github.com/facebook/react/pull/18619" target="_blank" rel="nofollow noopener noreferrer">#18619</a>)</li>
<li>Adicione a propriedade <code class="gatsby-code-text">enterKeyHint</code> para elementos <code class="gatsby-code-text">input</code>. (<a href="https://github.com/eps1lon" target="_blank" rel="nofollow noopener noreferrer">@eps1lon</a> em <a href="https://github.com/facebook/react/pull/18634" target="_blank" rel="nofollow noopener noreferrer">#18634</a>)</li>
<li>Avisar quando nenhum <code class="gatsby-code-text">valor</code> é fornecido para <code class="gatsby-code-text">&lt;Context.Provider&gt;</code>. (<a href="https://github.com/charlie1404" target="_blank" rel="nofollow noopener noreferrer">@charlie1404</a> em <a href="https://github.com/facebook/react/pull/19054" target="_blank" rel="nofollow noopener noreferrer">#19054</a>)</li>
<li>Avisa quando os componentes <code class="gatsby-code-text">memo</code> ou <code class="gatsby-code-text">forwardRef</code> retornam <code class="gatsby-code-text">undefined</code>. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/19550" target="_blank" rel="nofollow noopener noreferrer">#19550</a>)</li>
<li>Melhore a mensagem de erro para atualizações inválidas. (<a href="https://github.com/JoviDeCroock" target="_blank" rel="nofollow noopener noreferrer">@JoviDeCroock</a> em <a href="https://github.com/facebook/react/pull/18316" target="_blank" rel="nofollow noopener noreferrer">#18316</a>)</li>
<li>Exclua forwardRef e memo dos frames da pilha.  (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18559" target="_blank" rel="nofollow noopener noreferrer">#18559</a>)</li>
<li>Melhore a mensagem de erro ao alternar entre entradas controladas e não controladas. (<a href="https://github.com/vcarl" target="_blank" rel="nofollow noopener noreferrer">@vcarl</a> em <a href="https://github.com/facebook/react/pull/17070" target="_blank" rel="nofollow noopener noreferrer">#17070</a>)</li>
<li>Mantenha <code class="gatsby-code-text">onTouchStart</code>, <code class="gatsby-code-text">onTouchMove</code> e <code class="gatsby-code-text">onWheel</code> passivos. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19654" target="_blank" rel="nofollow noopener noreferrer">#19654</a>)</li>
<li>Corrigir <code class="gatsby-code-text">setState</code> pendurado em desenvolvimento dentro de um iframe fechado. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19220" target="_blank" rel="nofollow noopener noreferrer">#19220</a>)</li>
<li>Corrigir o resgate de renderização para componentes lazy com <code class="gatsby-code-text">defaultProps</code>. (<a href="https://github.com/jddxf" target="_blank" rel="nofollow noopener noreferrer">@jddxf</a> em <a href="https://github.com/facebook/react/pull/18539" target="_blank" rel="nofollow noopener noreferrer">#18539</a>)</li>
<li>Corrigir um aviso de falso positivo quando <code class="gatsby-code-text">hazouslySetInnerHTML</code> é <code class="gatsby-code-text">undefined</code>. (<a href="https://github.com/eps1lon" target="_blank" rel="nofollow noopener noreferrer">@eps1lon</a> em <a href="https://github.com/facebook/react/pull/18676" target="_blank" rel="nofollow noopener noreferrer">#18676</a>)</li>
<li>Corrigir os utilitários de teste com implementação <code class="gatsby-code-text">require</code> não padrão. (<a href="https://github.com/just-boris" target="_blank" rel="nofollow noopener noreferrer">@just-boris</a> em <a href="https://github.com/facebook/react/pull/18632" target="_blank" rel="nofollow noopener noreferrer">#18632</a>)</li>
<li>Corrigir <code class="gatsby-code-text">onBeforeInput</code> relatando um <code class="gatsby-code-text">event.type</code> incorreto. (<a href="https://github.com/eps1lon" target="_blank" rel="nofollow noopener noreferrer">@eps1lon</a> em <a href="https://github.com/facebook/react/pull/19561" target="_blank" rel="nofollow noopener noreferrer">#19561</a>)</li>
<li>Corrigir o <code class="gatsby-code-text">event.relatedTarget</code> relatado como <code class="gatsby-code-text">undefined</code> no Firefox. (<a href="https://github.com/claytercek" target="_blank" rel="nofollow noopener noreferrer">@claytercek</a> em <a href="https://github.com/facebook/react/pull/19607" target="_blank" rel="nofollow noopener noreferrer">#19607</a></li>
<li>Corrigir “erro não especificado” no IE11. (<a href="https://github.com/hemakshis" target="_blank" rel="nofollow noopener noreferrer">@hemakshis</a> em <a href="https://github.com/facebook/react/pull/19664" target="_blank" rel="nofollow noopener noreferrer">#19664</a>)</li>
<li>Corrigir a renderização em uma root shadow. (<a href="https://github.com/Jack-Works" target="_blank" rel="nofollow noopener noreferrer">@ Jack-Works</a> em <a href="https://github.com/facebook/react/pull/15894" target="_blank" rel="nofollow noopener noreferrer">#15894</a>)</li>
<li>Corrigir polyfill <code class="gatsby-code-text">movementX / Y</code> com eventos de captura. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19672" target="_blank" rel="nofollow noopener noreferrer">#19672</a>)</li>
<li>Use a delegação para eventos <code class="gatsby-code-text">onSubmit</code> e <code class="gatsby-code-text">onReset</code>. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/19333" target="_blank" rel="nofollow noopener noreferrer">#19333</a>)</li>
<li>Melhore o uso de memória. (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/18970" target="_blank" rel="nofollow noopener noreferrer">#18970</a>)</li>
</ul>
<h3 id="react-dom-server"><a href="#react-dom-server" 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>Servidor React DOM </h3>
<ul>
<li>Torne o comportamento <code class="gatsby-code-text">useCallback</code> consistente com <code class="gatsby-code-text">useMemo</code> para o renderizador do servidor. (<a href="https://github.com/alexmckenley" target="_blank" rel="nofollow noopener noreferrer">@alexmckenley</a> em <a href="https://github.com/facebook/react/pull/18783" target="_blank" rel="nofollow noopener noreferrer">#18783</a>)</li>
<li>Fix state leaking when a function component throws. (<a href="https://github.com/pmaccart" target="_blank" rel="nofollow noopener noreferrer">@pmaccart</a> em <a href="https://github.com/facebook/react/pull/19212" target="_blank" rel="nofollow noopener noreferrer">#19212</a>)</li>
</ul>
<h3 id="react-test-renderer"><a href="#react-test-renderer" 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>Teste Renderização React </h3>
<ul>
<li>Melhorar a mensagem de erro <code class="gatsby-code-text">findByType</code>. (<a href="https://github.com/henryqdineen" target="_blank" rel="nofollow noopener noreferrer">@henryqdineen</a> em <a href="https://github.com/facebook/react/pull/17439" target="_blank" rel="nofollow noopener noreferrer">#17439</a>)</li>
</ul>
<h3 id="concurrent-mode-experimental"><a href="#concurrent-mode-experimental" 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>Modo simultâneo (Experimental) </h3>
<ul>
<li>Renovar as heurísticas de lote de prioridade. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18796" target="_blank" rel="nofollow noopener noreferrer">#18796</a>)</li>
<li>Adicione o prefixo <code class="gatsby-code-text">unstable_</code> antes das APIs experimentais. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18825" target="_blank" rel="nofollow noopener noreferrer">#18825</a>)</li>
<li>Remova <code class="gatsby-code-text">unstable_discreteUpdates</code> e <code class="gatsby-code-text">unstable_flushDiscreteUpdates</code>. (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/18825" target="_blank" rel="nofollow noopener noreferrer">#18825</a>)</li>
<li>Remova o argumento <code class="gatsby-code-text">timeoutMs</code>. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/19703" target="_blank" rel="nofollow noopener noreferrer">#19703</a>)</li>
<li>Desabilite <code class="gatsby-code-text">&lt;div hidden /&gt;</code> pré-renderizando em favor de uma API futura diferente. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18917" target="_blank" rel="nofollow noopener noreferrer">#18917</a>)</li>
<li>Adicione <code class="gatsby-code-text">unstable_expectedLoadTime</code> no Suspense para a árvores do CPU-bound. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/19936" target="_blank" rel="nofollow noopener noreferrer">#19936</a>)</li>
<li>Adicione um Hook experimental <code class="gatsby-code-text">unstable_useOpaqueIdentifier</code>. (<a href="https://github.com/lunaruan" target="_blank" rel="nofollow noopener noreferrer">@lunaruan</a> em <a href="https://github.com/facebook/react/pull/17322" target="_blank" rel="nofollow noopener noreferrer">#17322</a>)</li>
<li>Adicione uma API experimental <code class="gatsby-code-text">unstable_startTransition</code>. (<a href="https://github.com/rickhanlonii" target="_blank" rel="nofollow noopener noreferrer">@rickhanlonii</a> em <a href="https://github.com/facebook/react/pull/19696" target="_blank" rel="nofollow noopener noreferrer">#19696</a>)</li>
<li>Usar <code class="gatsby-code-text">act</code> em o renderizador de teste não libera mais os fallbacks do Suspense. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18596" target="_blank" rel="nofollow noopener noreferrer">#18596</a>)</li>
<li>Use o tempo limite de renderização global para CPU Suspense. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/19643" target="_blank" rel="nofollow noopener noreferrer">#19643</a>)</li>
<li>Limpe o conteúdo raiz existente antes de montar. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/18730" target="_blank" rel="nofollow noopener noreferrer">#18730</a>)</li>
<li>Corrija um bug com limites de erro. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18265" target="_blank" rel="nofollow noopener noreferrer">#18265</a>)</li>
<li>Corrigir um bug que causava atualizações perdidas em uma árvore suspensa. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18384" target="_blank" rel="nofollow noopener noreferrer">#18384</a> e <a href="https://github.com/facebook/react/pull/18457" target="_blank" rel="nofollow noopener noreferrer">#18457</a>)</li>
<li>Corrigir um bug que causava a queda das atualizações da fase de renderização. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18537" target="_blank" rel="nofollow noopener noreferrer">#18537</a>)</li>
<li>Corrigir um bug em SuspenseList. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18412" target="_blank" rel="nofollow noopener noreferrer">#18412</a>)</li>
<li>Corrigido um bug que fazia com que o recurso Suspense fosse exibido muito cedo. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18411" target="_blank" rel="nofollow noopener noreferrer">#18411</a>)</li>
<li>Corrigir um bug com componentes de classe dentro de SuspenseList. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18448" target="_blank" rel="nofollow noopener noreferrer">#18448</a>)</li>
<li>Corrigir um bug com entradas que podem fazer com que as atualizações sejam descartadas. (<a href="https://github.com/jddxf" target="_blank" rel="nofollow noopener noreferrer">@jddxf</a> em <a href="https://github.com/facebook/react/pull/18515" target="_blank" rel="nofollow noopener noreferrer">#18515</a> e <a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18535" target="_blank" rel="nofollow noopener noreferrer">#18535</a>)</li>
<li>Corrigir um bug que fazia o fallback do Suspense travar. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18663" target="_blank" rel="nofollow noopener noreferrer">#18663</a>)</li>
<li>Não corte a cauda de um SuspenseList se estiver hidratando. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18854" target="_blank" rel="nofollow noopener noreferrer">#18854</a>)</li>
<li>Corrigir um bug em <code class="gatsby-code-text">useMutableSource</code> que pode acontecer quando<code class="gatsby-code-text">getSnapshot</code> muda. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/18297" target="_blank" rel="nofollow noopener noreferrer">#18297</a>)</li>
<li>Corrigido um bug de tearing em <code class="gatsby-code-text">useMutableSource</code>. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/18912" target="_blank" rel="nofollow noopener noreferrer">#18912</a>)</li>
<li>Avisa se estiver chamando setState fora da renderização, mas antes do commit. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/18838" target="_blank" rel="nofollow noopener noreferrer">#18838</a>)</li>
</ul>]]></description><link>https://pt-br.reactjs.org/blog/2020/08/10/react-v17-rc.html</link><guid isPermaLink="false">https://pt-br.reactjs.org/blog/2020/08/10/react-v17-rc.html</guid><pubDate>Mon, 10 Aug 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[React v16.13.0]]></title><description><![CDATA[<p>Hoje estamos lançando o React 16.13.0. Ele contém correções de bugs e novos avisos de depreciação para ajudar a se preparar para uma futura versão principal.</p>
<h2 id="new-warnings"><a href="#new-warnings" 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>Novos Avisos </h2>
<h3 id="warnings-for-some-updates-during-render"><a href="#warnings-for-some-updates-during-render" 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>Avisos para algumas atualizações durante a renderização </h3>
<p>Um componente React não deve causar efeitos colaterais em outros componentes durante a renderização.</p>
<p>É suportado chamar <code class="gatsby-code-text">setState</code> durante a renderização, mas <a href="/docs/hooks-faq.html#how-do-i-implement-getderivedstatefromprops">somente para <em>o mesmo componente</em></a>. Se você chamar <code class="gatsby-code-text">setState</code> durante uma renderização em um componente diferente, você verá um aviso:</p>
<div class="gatsby-highlight" data-language="text"><pre class="gatsby-code-text"><code class="gatsby-code-text">Warning: Cannot update a component from inside the function body of a different component.</code></pre></div>
<p><strong>Este aviso ajudará a encontrar erros de aplicativos causados ​​por alterações não intencionais do estado.</strong> Nos raros casos em que você deseja alterar intencionalmente o estado de outro componente como resultado da renderização, é possível agrupar a chamada do <code class="gatsby-code-text">setState</code> dentro do <code class="gatsby-code-text">useEffect</code>.</p>
<h3 id="warnings-for-conflicting-style-rules"><a href="#warnings-for-conflicting-style-rules" 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>Avisos para regras de estilo conflitantes </h3>
<p>Ao aplicar dinamicamente um <code class="gatsby-code-text">style</code> que contém versões <em>longhand</em> e <em>shorthand</em> de propriedades CSS, combinações específicas de atualizações podem causar estilos inconsistentes. Por exemplo: </p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>div</span> <span class="token attr-name">style</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span>toggle <span class="token operator">?</span> 
  <span class="token punctuation">{</span> background<span class="token operator">:</span> <span class="token string">'blue'</span><span class="token punctuation">,</span> backgroundColor<span class="token operator">:</span> <span class="token string">'red'</span> <span class="token punctuation">}</span> <span class="token operator">:</span> 
  <span class="token punctuation">{</span> backgroundColor<span class="token operator">:</span> <span class="token string">'red'</span> <span class="token punctuation">}</span>
<span class="token punctuation">}</span></span><span class="token punctuation">></span></span><span class="token plain-text">
  ...
</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>div</span><span class="token punctuation">></span></span> </code></pre></div>
<p>Você pode esperar que essa <code class="gatsby-code-text">&lt;div&gt;</code> tenha sempre um fundo vermelho, não importa o valor de <code class="gatsby-code-text">toggle</code>. No entanto, ao alternar o valor de <code class="gatsby-code-text">toggle</code> entre <code class="gatsby-code-text">true</code> e <code class="gatsby-code-text">false</code>, a cor de fundo começa como <code class="gatsby-code-text">red</code>, então alterna entre <code class="gatsby-code-text">transparent</code> e <code class="gatsby-code-text">blue</code>, <a href="https://codesandbox.io/s/suspicious-sunset-g3jub" target="_blank" rel="nofollow noopener noreferrer">como você pode ver nessa demo</a>.</p>
<p><strong>O React agora detecta regras de estilo conflitantes e registra um aviso.</strong> Para corrigir um problema, não misture versões <em>shorthand</em> e <em>longhand</em> da mesma propriedade CSS na prop <code class="gatsby-code-text">style</code>.</p>
<h3 id="warnings-for-some-deprecated-string-refs"><a href="#warnings-for-some-deprecated-string-refs" 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>Avisos para algumas string refs depreciadas </h3>
<p><a href="/docs/refs-and-the-dom.html#legacy-api-string-refs">String Refs é uma API legada</a> que é desencorajada e será depreciada no futuro:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><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 attr-name">ref</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>myRef<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span></code></pre></div>
<p>(Não confunda String Refs com refs em geral, o que <strong>permanece totalmente suportado</strong>.)</p>
<p>No futuro, forneceremos um script automatizado (um “codemod”) para migrar para longe das referências de string. No entanto, alguns casos raros não podem ser migrados automaticamente. Esta versão adiciona um novo aviso <strong>apenas para esses casos</strong> antes da depreciação.</p>
<p>Por exemplo, ele será acionado se você usar String Refs junto com o padrão Render Prop:</p>
<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">ClassWithRenderProp</span> <span class="token keyword">extends</span> <span class="token class-name">React<span class="token punctuation">.</span>Component</span> <span class="token punctuation">{</span>
  <span class="token function">componentDidMount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">doSomething</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>refs<span class="token punctuation">.</span>myRef<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <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>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>props<span class="token punctuation">.</span><span class="token function">children</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">class</span> <span class="token class-name">ClassParent</span> <span class="token keyword">extends</span> <span class="token class-name">React<span class="token punctuation">.</span>Component</span> <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>
    <span class="token keyword">return</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">ClassWithRenderProp</span></span><span class="token punctuation">></span></span><span class="token plain-text">
        </span><span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">Button</span></span> <span class="token attr-name">ref</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>myRef<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span><span class="token punctuation">}</span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">ClassWithRenderProp</span></span><span class="token punctuation">></span></span>
    <span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div>
<p>Um código como esse geralmente indica bugs. (Você pode esperar que a ref esteja disponível em <code class="gatsby-code-text">ClassParent</code>, mas em vez disso, é colocado em <code class="gatsby-code-text">ClassWithRenderProp</code>).</p>
<p><strong>Você provavelmente não tem código como este</strong>. Se você faz e é intencional, converta-o para <a href="/docs/refs-and-the-dom.html#creating-refs"><code class="gatsby-code-text">React.createRef()</code></a> em vez de:</p>
<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">ClassWithRenderProp</span> <span class="token keyword">extends</span> <span class="token class-name">React<span class="token punctuation">.</span>Component</span> <span class="token punctuation">{</span>
  myRef <span class="token operator">=</span> React<span class="token punctuation">.</span><span class="token function">createRef</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token function">componentDidMount</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
    <span class="token function">doSomething</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>myRef<span class="token punctuation">.</span>current<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <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>
    <span class="token keyword">return</span> <span class="token keyword">this</span><span class="token punctuation">.</span>props<span class="token punctuation">.</span><span class="token function">children</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>myRef<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">class</span> <span class="token class-name">ClassParent</span> <span class="token keyword">extends</span> <span class="token class-name">React<span class="token punctuation">.</span>Component</span> <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>
    <span class="token keyword">return</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">ClassWithRenderProp</span></span><span class="token punctuation">></span></span><span class="token plain-text">
        </span><span class="token punctuation">{</span><span class="token parameter">myRef</span> <span class="token operator">=></span> <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">Button</span></span> <span class="token attr-name">ref</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span>myRef<span class="token punctuation">}</span></span> <span class="token punctuation">/></span></span><span class="token punctuation">}</span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">ClassWithRenderProp</span></span><span class="token punctuation">></span></span>
    <span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div>
<blockquote>
<p>Nota</p>
<p>Para ver este aviso, você precisa ter o <a href="https://babeljs.io/docs/en/babel-plugin-transform-react-jsx-self" target="_blank" rel="nofollow noopener noreferrer">babel-plugin-transform-react-jsx-self</a> instalado nos seus plugins Babel. Ele deve ser ativado <em>apenas</em> no modo de desenvolvimento. </p>
<p>Se você usa o Create React App ou tem a predefinição “react” com o Babel 7+, você já tem esse plug-in instalado por padrão.</p>
</blockquote>
<h3 id="deprecating-reactcreatefactory"><a href="#deprecating-reactcreatefactory" 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>Depreciando <code class="gatsby-code-text">React.createFactory</code> </h3>
<p><a href="/docs/react-api.html#createfactory"><code class="gatsby-code-text">React.createFactory</code></a> é um helper legado para criar elementos React. Esta versão adiciona um aviso de depreciação ao método. Ele será removido em uma versão major futura.</p>
<p>Substitua os usos de <code class="gatsby-code-text">React.createFactory</code> com JSX regular. Como alternativa, você pode copiar e colar esse auxiliar de uma linha ou publicá-lo como uma biblioteca:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token keyword">let</span> <span class="token function-variable function">createFactory</span> <span class="token operator">=</span> <span class="token parameter">type</span> <span class="token operator">=></span> React<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">.</span><span class="token function">bind</span><span class="token punctuation">(</span><span class="token keyword">null</span><span class="token punctuation">,</span> type<span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>Faz exatamente a mesma coisa.</p>
<h3 id="deprecating-reactdomunstable_createportal-in-favor-of-reactdomcreateportal"><a href="#deprecating-reactdomunstable_createportal-in-favor-of-reactdomcreateportal" 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>Depreciando <code class="gatsby-code-text">ReactDOM.unstable_createPortal</code> em favor de <code class="gatsby-code-text">ReactDOM.createPortal</code> </h3>
<p>Quando o React 16 foi lançado,<code class="gatsby-code-text">createPortal</code> tornou-se uma API oficialmente suportada.</p>
<p>No entanto, mantivemos <code class="gatsby-code-text">unstable_createPortal</code> como um alias suportado para manter as poucas bibliotecas que o adotaram funcionando. Agora estamos depreciando o alias instável. Use <code class="gatsby-code-text">createPortal</code> diretamente em vez de <code class="gatsby-code-text">unstable_createPortal</code>. Tem exatamente a mesma assinatura.</p>
<h2 id="other-improvements"><a href="#other-improvements" 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>Outras Melhorias </h2>
<h3 id="component-stacks-in-hydration-warnings"><a href="#component-stacks-in-hydration-warnings" 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>Pilhas de componentes nos avisos de hidratação </h3>
<p>O React adiciona pilhas de componentes a seus avisos de desenvolvimento, permitindo que os desenvolvedores isolem bugs e depurem seus programas. Esta versão adiciona pilhas de componentes a vários avisos de desenvolvimento que não os tinham anteriormente. Como exemplo, considere este aviso de hidratação das versões anteriores:</p>
<p>
  <a
    class="gatsby-resp-image-link"
    href="/static/20bd06e254e7ad32aa007a59a41d1e65/61583/hydration-warning-before.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
  
  <span
    class="gatsby-resp-image-wrapper"
    style="position: relative; display: block;  max-width: 840px; margin-left: auto; margin-right: auto;"
  >
    <span
      class="gatsby-resp-image-background-image"
      style="padding-bottom: 7.142857142857142%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAP0lEQVQI1zWLQQrAIAwE+/+PJhqRYkkOlriNDR6GZQb2msTwUuAcSwSvNV0k2/azrWVXC/RnmUF7xx2fdzz4ABFxTIdyNAG5AAAAAElFTkSuQmCC'); background-size: cover; display: block;"
    >
      <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="Uma captura de tela do aviso do console, simplesmente indicando a natureza da incompatibilidade de hidratação: "Aviso: o HTML do servidor esperado deve conter uma div correspondente em div.""
        title=""
        src="/static/20bd06e254e7ad32aa007a59a41d1e65/1e088/hydration-warning-before.png"
        srcset="/static/20bd06e254e7ad32aa007a59a41d1e65/65ed1/hydration-warning-before.png 210w,
/static/20bd06e254e7ad32aa007a59a41d1e65/d10fb/hydration-warning-before.png 420w,
/static/20bd06e254e7ad32aa007a59a41d1e65/1e088/hydration-warning-before.png 840w,
/static/20bd06e254e7ad32aa007a59a41d1e65/78612/hydration-warning-before.png 1260w,
/static/20bd06e254e7ad32aa007a59a41d1e65/61583/hydration-warning-before.png 1616w"
        sizes="(max-width: 840px) 100vw, 840px"
      />
    </span>
  </span>
  
  </a>
    </p>
<p>Embora esteja apontando um erro no código, não está claro onde o erro existe e o que fazer em seguida. Esta versão adiciona uma pilha de componentes a este aviso, o que faz com que fique assim:</p>
<p>
  <a
    class="gatsby-resp-image-link"
    href="/static/abf3b580867e79d5f377330842bb6522/d3d45/hydration-warning-after.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
  
  <span
    class="gatsby-resp-image-wrapper"
    style="position: relative; display: block;  max-width: 840px; margin-left: auto; margin-right: auto;"
  >
    <span
      class="gatsby-resp-image-background-image"
      style="padding-bottom: 16.19047619047619%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAADCAYAAACTWi8uAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAk0lEQVQI11WOwQ6CMBBE+f/P4k7wLBEOEJEKFSItRmifg17w8LKzm8nOJOu1JdQ1oaoIRcGrrFikt7Yldh3hJqS/09wJ+22eCc8fcXb4fmCU5z1NJFEL+QnSFLIML1yeEy4lKAw9wfRwP2AfB0Y2/Vjli4MlCW6BvU1xJjYNDAqwFtQkGqMGauE90R1xf6Ab8iD9Ab5h5IiPbXX7AAAAAElFTkSuQmCC'); background-size: cover; display: block;"
    >
      <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="Uma captura de tela do aviso do console, informando a natureza da incompatibilidade de hidratação, mas também incluindo uma pilha de componentes: "Aviso: o HTML do servidor esperado deve conter uma div correspondente em div, em div(no pages/index.js:4)...""
        title=""
        src="/static/abf3b580867e79d5f377330842bb6522/1e088/hydration-warning-after.png"
        srcset="/static/abf3b580867e79d5f377330842bb6522/65ed1/hydration-warning-after.png 210w,
/static/abf3b580867e79d5f377330842bb6522/d10fb/hydration-warning-after.png 420w,
/static/abf3b580867e79d5f377330842bb6522/1e088/hydration-warning-after.png 840w,
/static/abf3b580867e79d5f377330842bb6522/78612/hydration-warning-after.png 1260w,
/static/abf3b580867e79d5f377330842bb6522/d3d45/hydration-warning-after.png 1614w"
        sizes="(max-width: 840px) 100vw, 840px"
      />
    </span>
  </span>
  
  </a>
    </p>
<p>Isso deixa claro onde está o problema e permite localizar e corrigir o bug mais rapidamente.</p>
<h3 id="notable-bugfixes"><a href="#notable-bugfixes" 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>Correções de bugs importantes </h3>
<p>Esta versão contém algumas outras melhorias importantes:</p>
<ul>
<li>No Modo Estrito de Desenvolvimento, o React chama os métodos do ciclo de vida duas vezes para eliminar possíveis efeitos colaterais indesejados. Esta versão adiciona esse comportamento a <code class="gatsby-code-text">shouldComponentUpdate</code>. Isso não deve afetar a maioria dos códigos, a menos que você tenha efeitos colaterais em <code class="gatsby-code-text">shouldComponentUpdate</code>. Para corrigir isso, mova o código com efeitos colaterais para <code class="gatsby-code-text">componentDidUpdate</code>.</li>
<li>No Modo Estrito de Desenvolvimento, os avisos para o uso da API de contexto legada não incluíam a pilha do componente que acionou o aviso. Esta versão adiciona a pilha ausente ao aviso.</li>
<li><code class="gatsby-code-text">onMouseEnter</code> agora não é disparado em elementos <code class="gatsby-code-text">&lt;button&gt;</code> desabilitados.</li>
<li>O ReactDOM tinha uma exportação de <code class="gatsby-code-text">version</code> ausente desde que publicamos a v16. Esta versão adiciona de volta. Não recomendamos o uso na lógica do aplicativo, mas é útil ao depurar problemas com incompatibilidade / várias versões do ReactDOM na mesma página.</li>
</ul>
<p>Agradecemos a todos os colaboradores que ajudaram a resolver e solucionar esses e outros problemas. Você pode encontrar o changelog completo <a href="#changelog">abaixo</a>.</p>
<h2 id="installation"><a href="#installation" 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>Instalação </h2>
<h3 id="react"><a href="#react" 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>React </h3>
<p>O React v16.13.0 está disponível no registro npm.</p>
<p>Para instalar o React 16 com o Yarn, execute:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token function">yarn</span> <span class="token function">add</span> react@^16.13.0 react-dom@^16.13.0</code></pre></div>
<p>Para instalar o React 16 com npm, execute:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token function">npm</span> <span class="token function">install</span> --save react@^16.13.0 react-dom@^16.13.0</code></pre></div>
<p>Também fornecemos compilações UMD do React por meio de uma CDN:</p>
<div class="gatsby-highlight" data-language="html"><pre class="gatsby-code-html"><code class="gatsby-code-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">crossorigin</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://unpkg.com/react@16/umd/react.production.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">crossorigin</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://unpkg.com/react-dom@16/umd/react-dom.production.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre></div>
<p>Consulte a documentação para <a href="/docs/installation.html">instruções detalhadas de instalação</a>.</p>
<h2 id="changelog"><a href="#changelog" 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>Changelog </h2>
<h3 id="react"><a href="#react" 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>React </h3>
<ul>
<li>Avisa quando uma string ref é usada de uma maneira que não seja compatível com um futuro codemod (<a href="https://github.com/lunaruan" target="_blank" rel="nofollow noopener noreferrer">@lunaruan</a> in <a href="https://github.com/facebook/react/pull/17864" target="_blank" rel="nofollow noopener noreferrer">#17864</a>)</li>
<li>Deprecia <code class="gatsby-code-text">React.createFactory()</code> (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> in <a href="https://github.com/facebook/react/pull/17878" target="_blank" rel="nofollow noopener noreferrer">#17878</a>)</li>
</ul>
<h3 id="react-dom"><a href="#react-dom" 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>React DOM </h3>
<ul>
<li>Avisa quando houver alterações <code class="gatsby-code-text">style</code> podem causar uma colisão inesperada (<a href="https://github.com/sophiebits" target="_blank" rel="nofollow noopener noreferrer">@sophiebits</a> em <a href="https://github.com/facebook/react/pull/14181" target="_blank" rel="nofollow noopener noreferrer">#14181</a>, <a href="https://github.com/facebook/react/pull/18002" target="_blank" rel="nofollow noopener noreferrer">#18002</a>)</li>
<li>Avisa quando um componente de função é atualizado durante a fase de renderização de outro componente (<a href="(https://github.com/acdlite)">@acdlite</a> em <a href="https://github.com/facebook/react/pull/17099" target="_blank" rel="nofollow noopener noreferrer">#17099</a>)</li>
<li>Depreciado <code class="gatsby-code-text">unstable_createPortal</code> (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/17880" target="_blank" rel="nofollow noopener noreferrer">#17880</a>)</li>
<li>Conserta <code class="gatsby-code-text">onMouseEnter</code> sendo acionado nos botões desativados (<a href="https://github.com/AlfredoGJ" target="_blank" rel="nofollow noopener noreferrer">@AlfredoGJ</a> em <a href="https://github.com/facebook/react/pull/17675" target="_blank" rel="nofollow noopener noreferrer">#17675</a>)</li>
<li>Chama <code class="gatsby-code-text">shouldComponentUpdate</code> duas vezes ao desenvolver em <code class="gatsby-code-text">StrictMode</code> (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/17942" target="_blank" rel="nofollow noopener noreferrer">#17942</a>)</li>
<li>Adiciona propriedade <code class="gatsby-code-text">version</code> para ReactDOM (<a href="https://github.com/ealush" target="_blank" rel="nofollow noopener noreferrer">@ealush</a> em <a href="https://github.com/facebook/react/pull/15780" target="_blank" rel="nofollow noopener noreferrer">#15780</a>)</li>
<li>Não chamar <code class="gatsby-code-text">toString()</code> em <code class="gatsby-code-text">dangerouslySetInnerHTML</code> (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/17773" target="_blank" rel="nofollow noopener noreferrer">#17773</a>)</li>
<li>Mostra pilhas de componentes em mais avisos (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/17922" target="_blank" rel="nofollow noopener noreferrer">#17922</a>, <a href="https://github.com/facebook/react/pull/17586" target="_blank" rel="nofollow noopener noreferrer">#17586</a>)</li>
</ul>
<h3 id="concurrent-mode-experimental"><a href="#concurrent-mode-experimental" 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>Modo Concorrente (Experimental) </h3>
<ul>
<li>Avisa sobre usos problemáticos de <code class="gatsby-code-text">ReactDOM.createRoot()</code> (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/17937" target="_blank" rel="nofollow noopener noreferrer">#17937</a>)</li>
<li>Retira <code class="gatsby-code-text">ReactDOM.createRoot()</code> parâmetros de retorno de chamada e avisos adicionais sobre o uso (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/17916" target="_blank" rel="nofollow noopener noreferrer">#17916</a>)</li>
<li>Não agrupe o trabalho ocioso / fora da tela com outro trabalho (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/17456" target="_blank" rel="nofollow noopener noreferrer">#17456</a>)</li>
<li>Ajusta heurística de limite de processamento do <code class="gatsby-code-text">SuspenseList</code> (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/17455" target="_blank" rel="nofollow noopener noreferrer">#17455</a>)</li>
<li>Adiciona prioridades de plugins de eventos ausentes (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/17914" target="_blank" rel="nofollow noopener noreferrer">#17914</a>)</li>
<li>Conserta <code class="gatsby-code-text">isPending</code> somente sendo verdadeiro ao fazer a transição de dentro de um evento de input (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/17382" target="_blank" rel="nofollow noopener noreferrer">#17382</a>)</li>
<li>Conserta componentes <code class="gatsby-code-text">React.memo</code> que descartam atualizações quando interrompidos por uma atualização de prioridade mais alta (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/18091" target="_blank" rel="nofollow noopener noreferrer">#18091</a>)</li>
<li>Não avise ao suspender com a prioridade errada (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/17971" target="_blank" rel="nofollow noopener noreferrer">#17971</a>)</li>
<li>Corrige um bug com atualizações de rebasing (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> e <a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/17560" target="_blank" rel="nofollow noopener noreferrer">#17560</a>, <a href="https://github.com/facebook/react/pull/17510" target="_blank" rel="nofollow noopener noreferrer">#17510</a>, <a href="https://github.com/facebook/react/pull/17483" target="_blank" rel="nofollow noopener noreferrer">#17483</a>, <a href="https://github.com/facebook/react/pull/17480" target="_blank" rel="nofollow noopener noreferrer">#17480</a>)</li>
</ul>]]></description><link>https://pt-br.reactjs.org/blog/2020/02/26/react-v16.13.0.html</link><guid isPermaLink="false">https://pt-br.reactjs.org/blog/2020/02/26/react-v16.13.0.html</guid><pubDate>Wed, 26 Feb 2020 00:00:00 GMT</pubDate></item><item><title><![CDATA[Construindo Ótimas Experiências de Usuário com Modo Concorrente e Suspense]]></title><description><![CDATA[<p>Na React Conf 2019 nós anunciamos uma <a href="/docs/concurrent-mode-adoption.html#installation">versão experimental</a> do React que acrescenta suporte ao Modo Concorrente e Suspense. Nesse artigo nós vamos introduzir as melhores práticas para seu uso que nós identificamos durante o processo de construção <a href="https://twitter.com/facebook/status/1123322299418124289" target="_blank" rel="nofollow noopener noreferrer">do novo facebook.com</a>.</p>
<blockquote>
<p>Esse artigo será mais relevante para pessoas que trabalham com as <em>bibliotecas de obtenção de dados (data fetching)</em> para React. </p>
<p>Mostramos como integrar melhor elas com o Modo Concorrente e o Suspense. Os padrões introduzidos aqui são baseados no <a href="https://relay.dev/docs/en/experimental/step-by-step" target="_blank" rel="nofollow noopener noreferrer">Relay</a> — nossa biblioteca para construir interfaces de usuário orientadas a dados com GraphQL. De qualquer forma, as ideias desse artigo <strong>se aplicam a outros clientes GraphQL também assim como bibliotecas que usam REST</strong> ou outras abordagens.</p>
</blockquote>
<p>Esse artigo é <strong>dedicado aos autores de bibliotecas</strong>. Se você for principalmente desenvolvedor de aplicações, você ainda pode encontrar ideias interessantes aqui, mas não se sinta obrigado a lê-lo inteiramente.</p>
<h2 id="talk-videos"><a href="#talk-videos" 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ídeos de Talks </h2>
<p>Se você preferir assistir vídeos, algumas das ideias desse artigo foram abordadas em diversas apresentações da React Conf 2019:</p>
<ul>
<li><a href="https://www.youtube.com/watch?v=Tl0S7QkxFE4&#x26;list=PLPxbbTqCLbGHPxZpw4xj_Wwg8-fdNxJRh&#x26;index=15&#x26;t=0s" target="_blank" rel="nofollow noopener noreferrer">Obtenção de Dados com Suspense no Relay</a> por <a href="https://twitter.com/en_JS" target="_blank" rel="nofollow noopener noreferrer">Joe Savona</a></li>
<li><a href="https://www.youtube.com/watch?v=KT3XKDBZW7M&#x26;list=PLPxbbTqCLbGHPxZpw4xj_Wwg8-fdNxJRh&#x26;index=4" target="_blank" rel="nofollow noopener noreferrer">Contruindo o Novo Facebook com React e Relay</a> por <a href="https://twitter.com/catchingash" target="_blank" rel="nofollow noopener noreferrer">Ashley Watkins</a></li>
<li><a href="https://www.youtube.com/watch?v=uXEEL9mrkAQ&#x26;list=PLPxbbTqCLbGHPxZpw4xj_Wwg8-fdNxJRh&#x26;index=2" target="_blank" rel="nofollow noopener noreferrer">React Conf Keynote</a> por <a href="https://twitter.com/yuzhiz" target="_blank" rel="nofollow noopener noreferrer">Yuzhi Zheng</a></li>
</ul>
<p>Esse artigo apresenta um mergulho na implentação de uma biblioteca de obtenção de dados com Suspense.</p>
<h2 id="putting-user-experience-first"><a href="#putting-user-experience-first" 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>Colocando a Experiência de Usuário como Prioridade </h2>
<p>A equipe do React e a comunidade tem constantemente enfatizado a experiência do desenvolvedor: garantindo que o React tenha boas mensagens de erro, focando em componentes como uma maneira de pensar localmente no comportamento do app, desenvolvendo APIs que são previsíveis e encorajando o correto uso via design, etc. Mas nós não temos difundido o suficiente as melhores práticas para garantir uma ótima experiência de <em>usuário</em> em grandes aplicações.</p>
<p>Por exemplo, a equipe do React tem focado na performance da <em>biblioteca</em> e provido ferramentas para desenvolvedores debugarem e refinarem a performance da aplicação (ex. <code class="gatsby-code-text">React.memo</code>). Mas nós não temos opinado sobre <em>padrões de alto nível</em> que fazem a diferença entre aplicativos rápidos e fluídos e aplicativos lentos e travados. Nós sempre queremos garantir que o React se mantenha acessível a novos usuários e suporte vários de casos uso — nem todo app tem que ser “super” rápido. Mas como uma comunidade nós podemos e devemos sonhar alto. <strong>Nós devemos fazer ser tão fácil quanto possível construir aplicativos que iniciam rápido e continuam rápidos,</strong> mesmo quando eles crescem em complexidade, para usuários utilizando uma variedade de dispositivos e redes no mundo todo. </p>
<p><a href="/docs/concurrent-mode-intro.html">Modo Concorrente</a> e <a href="/docs/concurrent-mode-suspense.html">Suspense</a> são funcionalidades experimentais que podem ajudar os desenvolvedores a alcançarem esse objetivo. Nós inicialmente apresentamos eles na <a href="/blog/2018/03/01/sneak-peek-beyond-react-16.html">JSConf Iceland em 2018</a>, intencionalmente compartilhando detalhes muito antecipadamente para dar a comunidade tempo para digerir os novos conceitos e para se prepararem para as alterações seguintes. Desde então nós completamos trabalhos correlacionados, como a nova API de Contexto e a introdução do Hooks, que foram desenhados em parte para ajudar os desenvolvedores a escreverem código que seja naturalmente mais compatível com o Modo Concorrente. Mas nós não queremos implementar essas funcionalidades e liberá-las sem garantir que funcionam. Então ao longo do ano passado, as equipes do React, Relay, infraestrutura web, e produto do Facebook têm todas colaborado fortemente para construir uma nova versão do facebook.com que integre profundamente o Modo Concorrente e o Suspense para criar uma experiência com uma sensação mais fluída e similar a de um app. </p>
<p>Graças a esse projeto, nós estamos mais confiantes do que nunca de que o Modo Concorrente e o Suspense podem tornar mais fácil entregar uma experiência de usuário ótima e <em>rápida</em>. Mas fazer isso requer repensar como nós abordamos o carregamento do código e dos dados em nossos apps. Efetivamente toda a obtenção de dados no novo facebook.com é realizada pelo <a href="https://relay.dev/docs/en/experimental/step-by-step" target="_blank" rel="nofollow noopener noreferrer">Relay Hooks</a> — novas APIs do Relay baseadas em Hooks que integram com o Modo Concorrente e o Suspense sem configurações adicionais.</p>
<p>Relay Hooks — e GraphQL — não são para todos, e tudo bem com isso! Através do nosso trabalho nessas APIs nós identificamos um conjunto de padrões em geral para utilizar com Suspense. <strong>Mesmo que o Relay não se encaixe para você, nós acreditamos que os padrões chave que nós introduzimos com o Relay Hooks podem ser adaptados para outras bibliotecas</strong></p>
<h2 id="best-practices-for-suspense"><a href="#best-practices-for-suspense" 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>Melhores Práticas com Suspense </h2>
<p>É tentador focar apenas no tempo total de inicialização de um app — mas ocorre que a percepção de performance pelo usuário é determinada por mais do que o tempo absoluto de carregamento. Por exemplo, quando comparados dois aplicativos com o mesmo tempo absoluto de inicialização, nossos estudos mostram que os usuários geralmente irão perceber aquele que tiver menos estados de carregamento intermediários e menos alterações de layout como o que carrega mais rápido. Suspense é uma ferramenta poderosa por orquestrar cuidadosamente uma elegante sequência de carregamento com poucos, e bem definidos, estados que revelam progressivamente o conteúdo. Mas melhorar a performance percebida vai além disso — nossos apps não deveriam demorar uma eternidade para obter todo o código, dados, imagens, e outros artefatos.</p>
<p>A abordagem tradicional para carregar dados nos apps React envolvem o que nos referimos como <a href="/docs/concurrent-mode-suspense.html#approach-1-fetch-on-render-not-using-suspense">“renderização-conforme-você-busca”</a>. Primeiro nós renderizamos um componente com um spinner, então carregamos dados na montagem (<code class="gatsby-code-text">componentDidMount</code> ou <code class="gatsby-code-text">useEffect</code>), e finalmente atualizamos para renderizar os dados resultantes. É certamente <em>possível</em> usar esse padrão com Suspense: ao invés de inicialmente renderizar um placeholder por si mesmo, um componente pode “suspender” — indicar ao React que ele não está pronto ainda. Isso irá dizer ao React para buscar o ancestral mais próximo <code class="gatsby-code-text">&lt;Suspense fallback={&lt;Placeholder/&gt;}&gt;</code>, e renderizar o seu fallback no lugar. Se você viu os demos do Suspense anteriormente este exemplo pode parecer familiar — é como nós originalmente imaginamos usar o Suspense para obtenção de dados.</p>
<p>Ocorre que esta abordagem tem algumas limitações. Considere uma página que mostra uma postagem de mídia social feita por um usuário, com comentários nessa postagem. Ela pode ser estruturada como um componente <code class="gatsby-code-text">&lt;Post&gt;</code> que renderiza tanto o corpo da postagem como a <code class="gatsby-code-text">&lt;CommentList&gt;</code> para mostrar os comentários. Usando a abordagem de renderização-conforme-você-busca descrita acima para implementar isso pode causar idas e voltas sequenciais (muitas vezes conhecido como uma “cachoeira”). Primeiro os dados para o componente <code class="gatsby-code-text">&lt;Post&gt;</code> seriam obtidos e então os dados para a <code class="gatsby-code-text">&lt;CommentList&gt;</code>, aumentando o tempo que para mostrar a página completamente.</p>
<p>Há também outra desvantagem muitas vezes esquecida nessa abordagem. Se o <code class="gatsby-code-text">&lt;Post&gt;</code> requisita (ou importa) o componente <code class="gatsby-code-text">&lt;CommentList&gt;</code> de maneira completa, nosso app terá de esperar para mostrar o <em>corpo</em> da postagem enquanto o código para os <em>comentários</em> é baixado. Nós poderíamos carregar a <code class="gatsby-code-text">&lt;CommentList&gt;</code> de maneira preguiçosa, mas dessa forma nós iríamos atrasar a obtenção dos dados dos comentários e aumentar o tempo para exibir a página inteira. Como nós resolvemos esse problema sem comprometer a experiência do usuário?</p>
<h2 id="render-as-you-fetch"><a href="#render-as-you-fetch" 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>Renderização Conforme Você Busca </h2>
<p>A abordagem de renderização-conforme-você-busca é amplamente utilizada pelos apps React atualmente e pode certamente ser usada para criar ótimos apps. Mas nós conseguiríamos fazer ainda melhor? Vamos voltar um passo atrás e considerar nosso objetivo.</p>
<p>No exemplo acima do <code class="gatsby-code-text">&lt;Post&gt;</code>, nós idealmente deveríamos mostrar o conteudo mais importante — o corpo da postagem — o mais rápido possível, <em>sem</em> impactar negativamente o tempo para mostrar a página completamente (incluindo comentários). Vamos considerar as restrições em qualquer solução e observar como nós podemos atendê-las:</p>
<ul>
<li>Mostrar o conteúdo mais importante (o corpo da postagem) o mais rápido possíve significa que nós precisamos carregar o código e os dados para a visualização de forma incremental. Nós <em>não queremos bloquear a visualização do corpo da postagem</em> enquanto o código da <code class="gatsby-code-text">&lt;CommentList&gt;</code> é baixado, por exemplo.</li>
<li>Ao mesmo tempo nós não queremos aumentar o tempo para exibição da página completa incluindo comentários. Então nós precisamos <em>começar a carregar o código e os dados para os comentários</em> o mais rápido possível, idealmente <em>em paralelo</em> ao carregamento do corpo da postagem.</li>
</ul>
<p>Isso pode soar difícil de alcançar — mas essas restrições são na verdade incrivelmente facilitadoras. Elas descartam uma série de abordagens e nos desenham um rascunho da solução. Isso nós leva aos padrões chave que nós implementamos no Relay Hooks, e que podem ser adaptados para outras biblotecas de obtenção de dados. Veremos cada desses padrões de maneira a entender como podem nos ajudar a alcançar nosso objetivo de experiências de carregamento rápidas e encatadoras:</p>
<ol>
<li>Dados em paralelo e árvores de visualização</li>
<li>Obtenção de dados em manipuladores de evento</li>
<li>Carregar dados incrementalmente</li>
<li>Tratar código como dado</li>
</ol>
<h3 id="parallel-data-and-view-trees"><a href="#parallel-data-and-view-trees" 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>Dados em Paralelo e Árvores de Visualização </h3>
<p>Uma das coisas mais atraentes no padrão de renderização-conforme-você-busca é que ele combina <em>quais</em> dados o componente precisa com <em>como</em> renderizar esses dados. Essa combinação é ótima — um exemplo de como faz sentido agrupar código por responsabilidades e não por tecnologias. Todos os problemas que nós vimos acima foram sobre <em>quando</em> nós obtemos os dados nessa abordagem: após a renderização. Nós precisamos precisamos ser capazes de obter dados <em>antes</em> de renderizar o componente. A única forma de alcançar isso é extraindo as dependências de dados em dados em paralelo e árvores de visualização.</p>
<p>Aqui mostramos como isso funciona no Relay Hooks. Continuando nosso exemplo de uma postagem de mídia social com corpo e comentários, aqui está como definimos isso no Relay Hooks:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token comment">// Post.js</span>
<span class="token keyword">function</span> <span class="token function">Post</span><span class="token punctuation">(</span><span class="token parameter">props</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token comment">// Dado uma referência para alguma postagem - `props.post` - *de quais* dados</span>
  <span class="token comment">// nós precisamos sobre essa postagem?</span>
  <span class="token keyword">const</span> postData <span class="token operator">=</span> <span class="token function">useFragment</span><span class="token punctuation">(</span>graphql<span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">
    fragment PostData on Post @refetchable(queryName: "PostQuery") {
      author
      title
      # ...  mais campos ...
    }
  </span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span> props<span class="token punctuation">.</span>post<span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token comment">// Agora que nós temos os dados, como renderizá-lo?</span>
  <span class="token keyword">return</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 plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span><span class="token punctuation">{</span>postData<span class="token punctuation">.</span>title<span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h2</span><span class="token punctuation">></span></span><span class="token plain-text">by </span><span class="token punctuation">{</span>postData<span class="token punctuation">.</span>author<span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h2</span><span class="token punctuation">></span></span><span class="token plain-text">
      </span><span class="token punctuation">{</span><span class="token comment">/* mais campos  */</span><span class="token punctuation">}</span><span class="token plain-text">
    </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>
<span class="token punctuation">}</span></code></pre></div>
<p>Embora o GraphQL esteja escrito junto ao componente, Relay tem um passo de build (Compilador do Relay) que extrai essas dependências-de-dados em arquivos separados e agrega o GraphQL para cada visualização em uma única consulta. Então nós obtemos os benefícios de combinar responsabilidades, enquanto no tempo de execução temos dados em paralelo e árvores de visualização. Outras bibliotecas poderiam alcançar resultados similares ao permitir que os desenvolvedores definam lógica de obtenção de dados em um arquivo irmão (talvez <code class="gatsby-code-text">Post.data.js</code>), ou então integrar com um bundler para permitir definição de dependência de dados com código de interface de usuário e automaticamente extraí-lo, de maneira semelhante ao Compilador do Relay.</p>
<p>O segredo é que independente da tecnologia que estamos usando para carregar nossos dados — GraphQL, REST, etc — nós podemos separar <em>quais</em> dados carregar de como e quando fazê-lo. Mas uma vez feito isso, <em>como e quando</em> nós carregamos nossos dados?</p>
<h3 id="fetch-in-event-handlers"><a href="#fetch-in-event-handlers" 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>Obtenção de Dados em Manipuladores de Evento </h3>
<p>Imagine que nós estamos para navegar da listagem de postagens de um usuário para a página de uma postagem específica. Nós vamos precisar baixar o código para aquela página — <code class="gatsby-code-text">Post.js</code> — e também obter seus dados.</p>
<p>Aguardar até que a gente renderize os dados gera os problemas que nós vimos acima. O segredo é começar a obter o código e os dados para a nova visualização <em>no mesmo manipulador de evento que dispara a visualização</em>. Nós ainda podemos obter os dados com nosso roteador — se nosso roteador suporta pré-carregamento de dados para as rotas — ou no evento de clique no link que disparou a navegação. Vale lembrar que os colegas do React Router já trabalharam arduamente para construir APIs para suportarem pré-carregamento de dados para rotas. Mas outras bibliotecas de roteamento podem implementar essa ideia também.</p>
<p>Conceitualmente, nós queremos que a definição de cada rota inclua duas coisas: qual componente renderizar e que dados pré-carregar, como uma função de rota/parâmetros de url. Aqui está o que esta definição de rota <em>pode</em> parecer. Este exemplo é um pouco inspirado pelas definições de rota do React Router e <em>principalmente se dedica a demonstrar o conceito, não uma API específica</em>:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token comment">// PostRoute.js (GraphQL version)</span>

<span class="token comment">// Consulta do Relay para carregamento dos dados do Post</span>
<span class="token keyword">import</span> PostQuery <span class="token keyword">from</span> <span class="token string">'./__generated__/PostQuery.graphql'</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> PostRoute <span class="token operator">=</span> <span class="token punctuation">{</span>
  <span class="token comment">// uma expressão que associa qual rota tratar</span>
  path<span class="token operator">:</span> <span class="token string">'/post/:id'</span><span class="token punctuation">,</span>

  <span class="token comment">// que componente renderizar para essa rota</span>
  component<span class="token operator">:</span> React<span class="token punctuation">.</span><span class="token function">lazy</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./Post'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>

  <span class="token comment">// dados a serem carregados para essa rota, como uma função dos parâmetros</span>
  <span class="token comment">// da rota</span>
  <span class="token function-variable function">prepare</span><span class="token operator">:</span> <span class="token parameter">routeParams</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
    <span class="token comment">// Relay extrai consultas de componentes, nos permitindo referenciar</span>
    <span class="token comment">// as dependências de dados -- árvore de dados -- de fora.</span>
    <span class="token keyword">const</span> postData <span class="token operator">=</span> <span class="token function">preloadQuery</span><span class="token punctuation">(</span>PostQuery<span class="token punctuation">,</span> <span class="token punctuation">{</span>
      postId<span class="token operator">:</span> routeParams<span class="token punctuation">.</span>id<span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">return</span> <span class="token punctuation">{</span> postData <span class="token punctuation">}</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">export</span> <span class="token keyword">default</span> PostRoute<span class="token punctuation">;</span></code></pre></div>
<p>Por definição, um roteador pode:</p>
<ul>
<li>Associar uma URL a uma definição de rota.</li>
<li>Chamar a função <code class="gatsby-code-text">prepare()</code> para iniciar o carregamento dos dados da rota. Note que <code class="gatsby-code-text">prepare()</code> é síncrona — <em>nós não queremos esperar pelos dados</em>, dado que nós queremos começar a renderizar as partes mais importantes da visualização (como o corpo da postagem) o mais rápido que possível.</li>
<li>Passar os dados pré-carregados para o componente. Se o componente estiver pronto — a importação dinâmica do <code class="gatsby-code-text">React.lazy</code> terminou — o componente irá renderizar e tentar acessar os seus dados. Do contrário, o <code class="gatsby-code-text">React.lazy</code> irá suspender até que o código esteja pronto.</li>
</ul>
<p>Esta abordagem pode ser generalizada para outras soluções de obtenção de dados. Um app que usa REST poderia definir uma rota dessa forma:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token comment">// PostRoute.js (versão em REST)</span>

<span class="token comment">// Lógica escrita manualmente para carregamento dos dados para o componente</span>
<span class="token keyword">import</span> PostData <span class="token keyword">from</span> <span class="token string">'./Post.data'</span><span class="token punctuation">;</span>

<span class="token keyword">const</span> PostRoute <span class="token operator">=</span> <span class="token punctuation">{</span>
  <span class="token comment">// uma expressão que associa qual rota tratar</span>
  path<span class="token operator">:</span> <span class="token string">'/post/:id'</span><span class="token punctuation">,</span>

  <span class="token comment">// que componente renderizar para essa rota</span>
  component<span class="token operator">:</span> React<span class="token punctuation">.</span><span class="token function">lazy</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token keyword">import</span><span class="token punctuation">(</span><span class="token string">'./Post'</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>

  <span class="token comment">// dados a serem carregados para essa rota, como uma função dos parâmetros</span>
  <span class="token comment">// da rota</span>
  <span class="token function-variable function">prepare</span><span class="token operator">:</span> <span class="token parameter">routeParams</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
    <span class="token keyword">const</span> postData <span class="token operator">=</span> <span class="token function">preloadRestEndpoint</span><span class="token punctuation">(</span>
      PostData<span class="token punctuation">.</span>endpointUrl<span class="token punctuation">,</span> 
      <span class="token punctuation">{</span>
        postId<span class="token operator">:</span> routeParams<span class="token punctuation">.</span>id<span class="token punctuation">,</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token punctuation">{</span> postData <span class="token punctuation">}</span><span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>

<span class="token keyword">export</span> <span class="token keyword">default</span> PostRoute<span class="token punctuation">;</span></code></pre></div>
<p>Esta mesma abordagem pode ser empregada não apenas para roteamento, mas em outros lugares onde nós queiramos mostrar conteúdo de maneira preguiçosa ou baseada na interação do usuário. Por exemplo, um componente de aba poderia carregar completamente os dados e o código para a primeira aba, e então usar o mesmo padrão acima para carregar o código e os dados para as outras abas que estão no manipulador de evento de troca de aba. Um componente que mostra um modal poderia pré-carregar o código e os dados para o modal no manipulador de clique que dispara a abertura do modal, e assim por diante.</p>
<p>Uma vez que implementamos a habilidade de começar a carregar código e dados de uma visualização de maneira independente, nós temos a opção de ir um passo além. Considere um componente <code class="gatsby-code-text">&lt;Link to={path} /&gt;</code> que faz o link para uma rota. Se o usuário passa sobre este link, existe uma chance razoável de que ele irá clicá-lo. E se ele pressionar o mouse, existe uma chance ainda maior de que ele irá completar o clique. Se nós podemos carregar o código e os dados para uma visualização <em>depois</em> de o usuário clicar, nós também podemos iniciar o trabalho <em>antes</em> deles clicarem, começando a preparar a visualização.</p>
<p>O melhor de tudo, nós podemos centralizar essa lógica em poucos lugares chave — um roteador ou em componentes centralizadores de interação com o usuário — e obter quaisquer benefícios de performance automaticamente em todo nosso app. Claro que pré-carregar nem sempre é benéfico. É algo que um aplicativo pode otimizar baseado no dispositivo do usuário ou velocidade de rede para evitar consumir os planos de dados do usuário. Mas este padrão torna mais fácil centralizar a implementação do pré-carregamento e a decisão de quando habilitá-lo ou não.</p>
<h3 id="load-data-incrementally"><a href="#load-data-incrementally" 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>Carregar Dados Incrementalmente </h3>
<p>Os padrões acima — dados em paralelo/árvores de visualização e obtenção em manipuladores de evento — nos permitem iniciar o carregamento dos dados de uma visualização antecipadamente. Mas nós ainda queremos poder mostrar as partes mais importantes da visualização sem ter que esperar por <em>todos</em> os nossos dados. No Facebook nós implementamos o suporte para isso no GraphQL e Relay na forma de algumas novas diretivas de GraphQL (anotações que afetam quando/como os dados são entregues, mas não quais dados). Essas novas diretivas, chamadas <code class="gatsby-code-text">@defer</code> e <code class="gatsby-code-text">@stream</code>, nos permitem recuperar dados de maneira incremental. Por exemplo, considere nosso componente <code class="gatsby-code-text">&lt;Post&gt;</code> acima. Nós queremos mostrar o corpo sem ter que esperar que os comentários estejam prontos. Nós podemos alcançar isso com <code class="gatsby-code-text">@defer</code> e <code class="gatsby-code-text">&lt;Suspense&gt;</code>:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token comment">// Post.js</span>
<span class="token keyword">function</span> <span class="token function">Post</span><span class="token punctuation">(</span><span class="token parameter">props</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">const</span> postData <span class="token operator">=</span> <span class="token function">useFragment</span><span class="token punctuation">(</span>graphql<span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">
    fragment PostData on Post {
      author
      title

      # obter dados para os comentários, mas sem bloquear até que estejam carregados
      ...CommentList @defer
    }
  </span><span class="token template-punctuation string">`</span></span><span class="token punctuation">,</span> props<span class="token punctuation">.</span>post<span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">return</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 plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span><span class="token punctuation">{</span>postData<span class="token punctuation">.</span>title<span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h2</span><span class="token punctuation">></span></span><span class="token plain-text">by </span><span class="token punctuation">{</span>postData<span class="token punctuation">.</span>author<span class="token punctuation">}</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h2</span><span class="token punctuation">></span></span><span class="token plain-text">
      </span><span class="token punctuation">{</span><span class="token comment">/* @defer trabalha naturalmente com &lt;Suspense> para criar uma interface de usuário não bloqueada também */</span><span class="token punctuation">}</span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">Suspense</span></span> <span class="token attr-name">fallback</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</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">Spinner</span></span><span class="token punctuation">/></span></span><span class="token punctuation">}</span></span><span class="token punctuation">></span></span><span class="token plain-text">
        </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">CommentList</span></span> <span class="token attr-name">post</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span>postData<span class="token punctuation">}</span></span> <span class="token punctuation">/></span></span><span class="token plain-text">
      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">Suspense</span></span><span class="token punctuation">></span></span><span class="token plain-text">
    </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>
<span class="token punctuation">}</span></code></pre></div>
<p>Aqui, nosso servidor GraphQL devolve os resultados por stream, primeiro retornando os campos <code class="gatsby-code-text">author</code> e <code class="gatsby-code-text">title</code> e então retornando os dados de comentário quando estiver pronto. Nós envolvemos a <code class="gatsby-code-text">&lt;CommentList&gt;</code> em uma tag <code class="gatsby-code-text">&lt;Suspense&gt;</code> então nós podemos renderizar o corpo da postagem antes da <code class="gatsby-code-text">&lt;CommentList&gt;</code> e seus dados estarem prontos. Esse padrão pode ser aplicado a outras biblotecas. Por exemplo, apps que chamam uma API REST podem fazer requisições em paralelo para obter os dados para o corpo e comentários para uma postagem evitando bloquear até que todos os dados estejam prontos.</p>
<h3 id="treat-code-like-data"><a href="#treat-code-like-data" 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>Tratar Código Como Dados </h3>
<p>Mas ainda tem uma coisa faltando. Nós mostramos como pré-carregar <em>dados</em> para uma rota — mas e o código? O exemplo acima nos enganou um pouco e usou <code class="gatsby-code-text">React.lazy</code>. De qualquer forma, <code class="gatsby-code-text">React.lazy</code> é, como o nome indica, <em>preguiçoso</em>. Ele não irá começar a baixar o código até que o componente preguiçoso esteja renderizado — é uma “obtenção-de-dados-na-renderização” para código!</p>
<p>Para resolver isso, a equipe do React está considerando APIs que nos permitiriam dividir o bundle e pré-carregar completamente o código também. Isso permitiria um usuário passar de alguma forma um componente preguiçoso para uma rota, e a rota disparar o carregamento do código e dos seus dados o mais antecipadamente possível.</p>
<h2 id="putting-it-all-together"><a href="#putting-it-all-together" 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>Resumindo </h2>
<p>Para recaptular, atingir uma ótima experiência de usuário significa que nós precisamos <strong>começar a carregar código e dados o mais antecipadamente possível, mas sem esperar que tudo seja completado</strong>. Dados em paralelo e árvores de visualização nos permitem carregar os dados para uma visualização em paralelo com o carregamento da própria visualização (código). Obtenção de dados em um manipulador de eventos significa que nós podemos começar a carregar os dados o mais antecipadamente possível, e otimamente até mesmo pré-carregar uma visualização quando nós tivermos confiança suficiente de que o usuário irá navegar para ela. Carregar dados de maneira incremental nos permite carregar os dados mais importantes antecipadamente sem atrasar a obtenção de dados de menos importância. E tratar código como dados — e pré-carregar esse código com APIs similares — nos permite carregá-lo de maneira antecipada também.</p>
<h2 id="using-these-patterns"><a href="#using-these-patterns" 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>Utilizando Esses Padrões </h2>
<p>Esses padrões não são apenas ideias — nós os implementamos no React Hooks e estamos usando eles em produção ao longo do novo facebook.com (o que está atualmente em teste beta). Se você estiver interessado em utilizá-lo ou aprender mais sobre esses padrões, aqui estão algumas referências:</p>
<ul>
<li>A <a href="/docs/concurrent-mode-intro.html">documentação do Modo Concorrente do React</a> aborda como utilizar o Modo Concorrente e o Suspense e detalha melhor vários desses padrões. É uma ótima referência para aprender mais sobre as APIs e casos de uso que elas suportam.</li>
<li>A <a href="https://relay.dev/docs/en/experimental/step-by-step" target="_blank" rel="nofollow noopener noreferrer">versão experimental do Relay Hooks</a> implementa os padrões descritos aqui. </li>
<li>
<p>Nós implementamos dois aplicativos de exemplo que demonstram esses conceitos:</p>
<ul>
<li>O <a href="https://github.com/relayjs/relay-examples/tree/master/issue-tracker" target="_blank" rel="nofollow noopener noreferrer">aplicativo exemplo do Relay Hooks</a> utiliza a API GraphQL pública do GitHub para implementar um aplicativo simples de rastreamento de issues. Ele inclui suporte a rotas aninhadas com pré-carregamento de dados e código. O código está totalmente comentado — nós encorajamos clonar o repositório, executar o aplicativo localmente, e explorar como ele funciona.</li>
<li>Nós também temos uma <a href="https://github.com/gaearon/suspense-experimental-github-demo" target="_blank" rel="nofollow noopener noreferrer">versão de aplicativo não-GraphQL</a> que demonstra como esses conceitos podem ser aplicados para outras bibliotecas de obtenção de dados.</li>
</ul>
</li>
</ul>
<p>Mesmo que as APIs do Modo Concorrente e Suspense <a href="/docs/concurrent-mode-adoption.html#who-is-this-experimental-release-for">ainda sejam experimentais</a>, nós estamos confiantes que as ideias desse artigo são comprovadas na prática. De qualquer forma, nós entendemos que o Relay e GraphQL não são aplicáveis a todos. E tudo bem! <strong>Nós estamos explorando como generalizar esses padrões para abordagens como REST,</strong> e também explorando ideias para uma API mais genérica (isto é, não-GraphQL) para composição de árvores de dependência de dados. Enquanto isso, estamos animados por ver que novas bibliotecas irão surgir implementando os padrões descritos nesse artigo para criar de maneira mais fácil, experiências de usuário <em>rápidas</em>.</p>]]></description><link>https://pt-br.reactjs.org/blog/2019/11/06/building-great-user-experiences-with-concurrent-mode-and-suspense.html</link><guid isPermaLink="false">https://pt-br.reactjs.org/blog/2019/11/06/building-great-user-experiences-with-concurrent-mode-and-suspense.html</guid><pubDate>Wed, 06 Nov 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Preparando para o Futuro com as Prereleases React]]></title><description><![CDATA[<p>Para compartilhar mudanças que estão por vir com nossos parceiros do ecossistema React, nós estamos criando canais oficiais de prerelease. Nós esperamos que este processo nos ajude a fazer mudanças no React com confiança, e dar aos desenvolvedores a oportunidade de testar recursos experimentais.</p>
<blockquote>
<p>Este documento será mais relevante para desenvolvedores que trabalham em frameworks, bibliotecas, ou ferramentas de desenvolvedor. Os desenvolvedores que usam React principalmente para criar aplicações voltadas para o usuário final não precisam se preocupar com nossos canais de prerelease.</p>
</blockquote>
<p>React conta com uma próspera comunidade de código aberto para registrar relatórios de bugs, abrir pull requests e <a href="https://github.com/reactjs/rfcs" target="_blank" rel="nofollow noopener noreferrer">enviar RFCs</a>. Para incentivar feedback, às vezes compartilhamos builds especiais do React que incluem recursos não lançados.</p>
<p>Como a fonte de verdade para o React é nosso <a href="https://github.com/facebook/react" target="_blank" rel="nofollow noopener noreferrer">repositório público no GitHub</a>, é sempre possível construir uma cópia do React que possua as últimas alterações. Entretanto é muito mais fácil para os desenvolvedores instalarem elas no npm, então nós ocasionalmente publicamos prereleases para o registro do npm. Um exemplo recente é a 16.7 alpha, que inclui uma versão antecipada da API Hooks.</p>
<p>Nós gostaríamos de tornar ainda mais fácil para os desenvolvedores testarem prereleases do React, então nós estamos formalizando nosso processo com 3 canais de release separados.</p>
<h2 id="release-channels"><a href="#release-channels" 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>Canais de Release </h2>
<blockquote>
<p>A informação desse artigo também está disponível em nossa página dos <a href="/docs/release-channels.html">Canais de Release</a>. Nós iremos atualizar esse documento sempre que fizermos alterações no processo de release.</p>
</blockquote>
<p>Cada um dos canais de release do React foram projetados para um caso de uso distinto:</p>
<ul>
<li><a href="#latest-channel"><strong>Latest</strong></a> é para estável, releases semver do React. É o que você recebe ao instalar o React a partir do npm. Este é o canal que você já está usando hoje. <strong>Use isso para todos as aplicações React voltadas para o usuário final.</strong></li>
<li><a href="#next-channel"><strong>Next</strong></a> acompanha a branch master do repositório de código fonte do React. Pense nisso como candidatos a release para o próximo minor semver release. Use isso para teste de integração entre React e projetos de terceiros.</li>
<li><a href="#experimental-channel"><strong>Experimental</strong></a> inclui APIs experimentais e recursos que não estão disponíveis nas releases estáveis. Eles também acompanham a branch master, mas com flags de recursos adicionais ativadas. Use isso para experimentar os próximos recursos antes de serem lançados.</li>
</ul>
<p>Todos os releases são publicados no npm, mas apenas os Latest usam <a href="/docs/faq-versioning.html">versionamento semântico</a>. Os prereleases (aqueles nos canais Next e Experimental) têm versões geradas a partir de um hash de seu conteúdo, por exemplo <code class="gatsby-code-text">0.0.0-1022ee0ec</code> para Next e <code class="gatsby-code-text">0.0.0-experimental-1022ee0ec</code> para Experimental.</p>
<p><strong>O único canal de release oficialmente suportado para aplicações voltadas para o usuário final é o Latest</strong>. Next e Experimental releases são fornecidos apenas para fins de teste e não fornecemos garantias de que o comportamento não seja alterado entre as versões. Eles não seguem o protocolo semver que usamos para releases no Latest.</p>
<p>Por publicar prereleases no mesmo registro que usamos para releases estáveis, podemos tirar proveito das muitas ferramentas que suportam o fluxo de trabalho no npm, como <a href="https://unpkg.com" target="_blank" rel="nofollow noopener noreferrer">unpkg</a> e <a href="https://codesandbox.io" target="_blank" rel="nofollow noopener noreferrer">CodeSandbox</a>.</p>
<h3 id="latest-channel"><a href="#latest-channel" 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>Canal Latest </h3>
<p>Latest é o canal usado para releases estáveis do React. Corresponde à tag <code class="gatsby-code-text">latest</code> no npm. É o canal recomendado para todos os apps React que são enviados para usuários reais.</p>
<p><strong>Se você não tem certeza de qual canal deve usar, é o Latest.</strong> Se você é um desenvolvedor React, é isso que você já está usando.</p>
<p>Você pode esperar que as atualizações do Latest sejam extremamente estáveis. As versões seguem o esquema de versão semântica. Saiba mais sobre nosso compromisso com a estabilidade e a migração incremental em nossa <a href="/docs/faq-versioning.html">política de versão</a>.</p>
<h3 id="next-channel"><a href="#next-channel" 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>Canal Next </h3>
<p>O canal Next é um canal de prerelease que acompanha a branch master do repositório React. Usamos as prereleases no canal Next como release candidates para o canal Latest. Você pode pensar em Next como um superconjunto de Latest que é atualizado com mais frequência.</p>
<p>O grau de alteração entre o release mais recente do Next e a versão mais recente do Latest é aproximadamente o mesmo que você encontraria entre dois releases de minor semver. No entanto, <strong>o canal Next não está de acordo com o controle de versão semântico.</strong> Você deve esperar breaking changes ocasionais durante sucessivos releases no canal Next.</p>
<p><strong>Não use prereleases em aplicações voltadas para o usuário final.</strong></p>
<p>Releases no Next são publicadas com a tag <code class="gatsby-code-text">next</code> no npm. As versões são geradas a partir de um hash do conteúdo do build, por exemplo <code class="gatsby-code-text">0.0.0-1022ee0ec</code>.</p>
<h4 id="using-the-next-channel-for-integration-testing"><a href="#using-the-next-channel-for-integration-testing" 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>Usando o Canal Next para Testes de Integração </h4>
<p>O canal Next foi projetado para dar suporte aos testes de integração entre React e outros projetos.</p>
<p>Todas as alterações no React passam por extensos testes internos antes de serem lançadas para o público. No entanto, existem inúmeros ambientes e configurações usados em todo o ecossistema React, e não é possível testar cada um deles.</p>
<p>Se você é o autor de um projeto de terceiros como um framework, biblioteca, ferramenta de desenvolvedor, ou qualquer tipo de infraestrutura semelhante, você pode nos ajudar a manter o React estável para seus usuários e para toda a comunidade React executando periodicamente sua suíte de testes nas alterações mais recentes. Se você estiver interessado, siga estas etapas:</p>
<ul>
<li>Configure um cron job usando sua plataforma de integração contínua preferida. Cron jobs são suportados ambos pelo <a href="https://circleci.com/docs/2.0/triggers/#scheduled-builds" target="_blank" rel="nofollow noopener noreferrer">CircleCI</a> e pelo <a href="https://docs.travis-ci.com/user/cron-jobs/" target="_blank" rel="nofollow noopener noreferrer">Travis CI</a>.</li>
<li>
<p>No cron job, atualize seus pacotes React para o release mais recente do React no canal Next, usando a tag <code class="gatsby-code-text">next</code> no npm. Usando o npm cli:</p>
<div class="gatsby-highlight" data-language="text"><pre class="gatsby-code-text"><code class="gatsby-code-text">npm update react@next react-dom@next</code></pre></div>
<p>Ou yarn:</p>
<div class="gatsby-highlight" data-language="text"><pre class="gatsby-code-text"><code class="gatsby-code-text">yarn upgrade react@next react-dom@next</code></pre></div>
</li>
<li>Execute sua suíte de testes nos pacotes atualizados.</li>
<li>Se tudo passar, ótimo! Você pode esperar que seu projeto funcione com o próximo minor release do React.</li>
<li>Se algo quebrar inesperadamente, por favor avise-nos <a href="https://github.com/facebook/react/issues" target="_blank" rel="nofollow noopener noreferrer">criando uma issue</a>.</li>
</ul>
<p>Um projeto que usa esse fluxo de trabalho é Next.js. (Sem trocadilhos! Sério!) Você pode consultar a sua <a href="https://github.com/zeit/next.js/blob/c0a1c0f93966fe33edd93fb53e5fafb0dcd80a9e/.circleci/config.yml" target="_blank" rel="nofollow noopener noreferrer">configuração do CircleCI</a> como exemplo.</p>
<h3 id="experimental-channel"><a href="#experimental-channel" 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>Canal Experimental </h3>
<p>Como o Next, o canal Experimental é um canal de prerelease que acompanha a branch master do repositório React. Ao contrário do Next, os releases Experimental incluem recursos e APIs adicionais que não estão prontas para release maior.</p>
<p>Geralmente, uma atualização para Next é acompanhada por uma atualização correspondente para Experimental. Eles são baseados na mesma revisão de origem, mas são criados usando um conjunto diferente de flags de recursos.</p>
<p>Os releases Experimental podem ser significativamente diferentes dos releases Next e Latest. <strong>Não use releases Experimental em aplicações voltadas para o usuário final.</strong> Você deve esperar breaking changes frequentes entre releases no canal Experimental.</p>
<p>Releases no Experimental são publicados com a tag <code class="gatsby-code-text">experimental</code> no npm. As versões são geradas a partir de um hash do conteúdo do build, por exemplo <code class="gatsby-code-text">0.0.0-experimental-1022ee0ec</code>.</p>
<h4 id="what-goes-into-an-experimental-release"><a href="#what-goes-into-an-experimental-release" 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 Entra em um Release Experimental? </h4>
<p>Recursos experimentais são aqueles que não estão prontos para serem liberados ao público em geral e podem sofrer alterações drásticas antes de serem finalizados. Alguns experimentos podem nunca ser finalizados - a razão pela qual temos experimentos é testar a viabilidade das alterações propostas.</p>
<p>Por exemplo, se o canal Experimental existisse quando anunciamos Hooks, teríamos lançado Hooks no canal Experimental semanas antes de estarem disponíveis no Latest.</p>
<p>Você pode achar valioso executar testes de integração no Experimental. Isso é com você. No entanto, saiba que o Experimental é ainda menos estável que o Next. <strong>Não garantimos estabilidade entre releases Experimental.</strong></p>
<h4 id="how-can-i-learn-more-about-experimental-features"><a href="#how-can-i-learn-more-about-experimental-features" 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>Como Posso Aprender Mais Sobre os Recursos Experimentais? </h4>
<p>Recursos Experimentais podem ou não ser documentados. Geralmente, os experimentos não são documentados até que estejam perto de serem lançados no Next ou no Stable.</p>
<p>Se um recurso não estiver documentado, ele poderá ser acompanhado por um <a href="https://github.com/reactjs/rfcs" target="_blank" rel="nofollow noopener noreferrer">RFC</a>.</p>
<p>Publicaremos no blog do React quando estivermos prontos para anunciar novos experimentos, mas isso não significa que divulgaremos cada experimento.</p>
<p>Você sempre pode consultar o <a href="https://github.com/facebook/react/commits/master" target="_blank" rel="nofollow noopener noreferrer">histórico</a> do repositório público do GitHub para obter uma lista abrangente de alterações.</p>]]></description><link>https://pt-br.reactjs.org/blog/2019/10/22/react-release-channels.html</link><guid isPermaLink="false">https://pt-br.reactjs.org/blog/2019/10/22/react-release-channels.html</guid><pubDate>Tue, 22 Oct 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[Apresentando o novo React DevTools]]></title><description><![CDATA[<p>Nós estamos animados em anunciar uma nova versão do React Developer Tools, disponível hoje para Chrome, Firefox e (Chromium) Edge!</p>
<h2 id="whats-changed"><a href="#whats-changed" 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 mudou? </h2>
<p>Muito mudou na versão 4!
Resumidamente, esta nova versão deve oferecer ganhos significantes de performance e uma experiência de navegação melhorada.
Ela também oferece suporte completo para React Hooks, incluindo a possibilidade de inspecionar objetos aninhados.</p>
<p>
  <a
    class="gatsby-resp-image-link"
    href="/static/9552e88d7605ef4e547af89096a9225d/cd138/devtools-v4-screenshot.png"
    style="display: block"
    target="_blank"
    rel="noopener"
  >
  
  <span
    class="gatsby-resp-image-wrapper"
    style="position: relative; display: block;  max-width: 840px; margin-left: auto; margin-right: auto;"
  >
    <span
      class="gatsby-resp-image-background-image"
      style="padding-bottom: 46.19047619047619%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAABYlAAAWJQFJUiTwAAABlElEQVQoz22SSU/DMBCF+0vYpGa3szhpFpqmSRegQFlEe0ZAEeIKBw5Q4Jc/xm5aQsXhaTz2+NObsVvc7cCyAzhOAMZDMCZg09p1I5iWB91wYZgeDIpyX4gMupdC5x1oVgDbSxCmJUTSh+OnaGmLJbSnb+w+fGKPdPD4pbT7sMTO3Qfp/TfK89s3iN4xbDeGZgsYLFJQi3IF1IczsPkT+PwZ/Owe48UrJosX7JfX0EYzaHTebqq8ghcXCqg7oZIEt8ktJ/cts1PCLk7B+udg3QnyyQ2KY4L5XRii949yBHGfgKmCSIdrqGy7ZfkZ+GAKd3QJXp7BFF06DKDVRU2tL7LgEFEyQNobwYtW9RK+apmKGM1EAllxAqOejbpct7RprY7SlR/1CDikvAOdxQq6AdoJtZ1WsKhIp2LN9BuOwj+zWkeLZ/CCHF6YwsmmWw67R+DVFM7hmDRSUt+iAWhGg4UQcYm8OoEb0h7lbUvU30ZaTSo1R17RwxQTuMMLGDRb+c/07bYJKh9ExBXCLKe9aPPKjIA/TNYlV65TlpIAAAAASUVORK5CYII='); background-size: cover; display: block;"
    >
      <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="Screenshot da DevTools versão 4"
        title=""
        src="/static/9552e88d7605ef4e547af89096a9225d/1e088/devtools-v4-screenshot.png"
        srcset="/static/9552e88d7605ef4e547af89096a9225d/65ed1/devtools-v4-screenshot.png 210w,
/static/9552e88d7605ef4e547af89096a9225d/d10fb/devtools-v4-screenshot.png 420w,
/static/9552e88d7605ef4e547af89096a9225d/1e088/devtools-v4-screenshot.png 840w,
/static/9552e88d7605ef4e547af89096a9225d/cd138/devtools-v4-screenshot.png 1220w"
        sizes="(max-width: 840px) 100vw, 840px"
      />
    </span>
  </span>
  
  </a>
    </p>
<p><a href="https://react-devtools-tutorial.now.sh/" target="_blank" rel="nofollow noopener noreferrer">Visite o tutorial interativo</a> para testar a nova versão ou <a href="https://github.com/facebook/react/blob/master/packages/react-devtools/CHANGELOG.md#400-august-15-2019" target="_blank" rel="nofollow noopener noreferrer">veja o changelog</a> para vídeos de demonstração e mais detalhes.</p>
<h2 id="which-versions-of-react-are-supported"><a href="#which-versions-of-react-are-supported" 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>Quais versões do React são suportadas? </h2>
<p><strong><code class="gatsby-code-text">react-dom</code></strong></p>
<ul>
<li><code class="gatsby-code-text">0</code>-<code class="gatsby-code-text">14.x</code>: Não suportada</li>
<li><code class="gatsby-code-text">15.x</code>: Suportada (exceto para a nova funcionalidade de filtro de componentes)</li>
<li><code class="gatsby-code-text">16.x</code>: Suportada</li>
</ul>
<p><strong><code class="gatsby-code-text">react-native</code></strong></p>
<ul>
<li><code class="gatsby-code-text">0</code>-<code class="gatsby-code-text">0.61.x</code>: Não suportada</li>
<li><code class="gatsby-code-text">0.62</code>: Suportada</li>
</ul>
<h2 id="how-do-i-get-the-new-devtools"><a href="#how-do-i-get-the-new-devtools" 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>Como eu consigo o novo DevTools? </h2>
<p>O React DevTools está disponível como uma extensão para <a href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi?hl=en" target="_blank" rel="nofollow noopener noreferrer">Chrome</a> e <a href="https://addons.mozilla.org/en-US/firefox/addon/react-devtools/" target="_blank" rel="nofollow noopener noreferrer">Firefox</a>.
Se você já instalou a extensão, ela deve atualizar automaticamente nas próximas horas.</p>
<p>Se você usa a versão independente (por exemplo, no React Native ou Safari), você pode instalar a nova versão <a href="https://www.npmjs.com/package/react-devtools" target="_blank" rel="nofollow noopener noreferrer">a partir do NPM</a>:</p>
<div class="gatsby-highlight" data-language="shell"><pre class="gatsby-code-shell"><code class="gatsby-code-shell"><span class="token function">npm</span> <span class="token function">install</span> -g react-devtools@^4</code></pre></div>
<h2 id="where-did-all-of-the-dom-elements-go"><a href="#where-did-all-of-the-dom-elements-go" 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>Para onde foram todos os elementos do DOM? </h2>
<p>O novo DevTools provê uma maneira de filtrar os componentes da árvore para facilitar a navegação de hierarquias profundamente aninhadas.
Host nodes (por exemplo, HTML <code class="gatsby-code-text">&lt;div&gt;</code>, React Native <code class="gatsby-code-text">&lt;View&gt;</code>) são <em>escondidos por padrão</em>, mas este filtro pode ser desabilitado:</p>
<p><img src="/758ea5ee734afdda4cd0f6b43c74fbb4/devtools-component-filters.gif" alt="Filtros de component do DevTools"></p>
<h2 id="how-do-i-get-the-old-version-back"><a href="#how-do-i-get-the-old-version-back" 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>Como eu volto para a versão antiga? </h2>
<p>Se você está trabalhando com React Native na versão 60 (ou anterior), você pode instalar a versão anterior do DevTools a partir do NPM:</p>
<div class="gatsby-highlight" data-language="shell"><pre class="gatsby-code-shell"><code class="gatsby-code-shell"><span class="token function">npm</span> <span class="token function">install</span> --dev react-devtools@^3</code></pre></div>
<p>Para versões anteriores do React DOM (v0.14 ou anterior) você precisará fazer o build da extensão a partir do código fonte:</p>
<div class="gatsby-highlight" data-language="shell"><pre class="gatsby-code-shell"><code class="gatsby-code-shell"><span class="token comment"># Faça checkout do código da extensão</span>
<span class="token function">git</span> clone https://github.com/facebook/react-devtools

<span class="token builtin class-name">cd</span> react-devtools

<span class="token comment"># Faça checkout do branch da versão anterior</span>
<span class="token function">git</span> checkout v3

<span class="token comment"># Instale as dependências e faça o build da extensão descompactada</span>
<span class="token function">yarn</span> <span class="token function">install</span>
<span class="token function">yarn</span> build:extension

<span class="token comment"># Siga as instruções da tela para finalizar a instalação</span></code></pre></div>
<h2 id="thank-you"><a href="#thank-you" 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>Muito obrigado! </h2>
<p>Nós gostaríamos de agradecer quem testou a versão antecipada do DevTools versão 4.
Seus feedbacks ajudaram a melhorar significativamente a versão inicial.</p>
<p>Nós ainda temos muitas funcionalidades excitantes planejadas e feedbacks são muito bem-vindos!
Sinta-se a vontada para abrir uma <a href="https://github.com/facebook/react/issues/new?labels=Component:%20Developer%20Tools" target="_blank" rel="nofollow noopener noreferrer">issue no GitHub</a> ou marcar <a href="https://twitter.com/reactjs" target="_blank" rel="nofollow noopener noreferrer">@reactjs no Twitter</a>.</p>]]></description><link>https://pt-br.reactjs.org/blog/2019/08/15/new-react-devtools.html</link><guid isPermaLink="false">https://pt-br.reactjs.org/blog/2019/08/15/new-react-devtools.html</guid><pubDate>Thu, 15 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[React v16.9.0 e a atualização do Roadmap]]></title><description><![CDATA[<p>Hoje estamos lançando o React 16.9. Ele contém vários novos recursos, correções de bugs e novos avisos de depreciação para ajudar a se preparar para uma futura versão principal.</p>
<h2 id="new-deprecations"><a href="#new-deprecations" 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>Novas Depreciações </h2>
<h3 id="renaming-unsafe-lifecycle-methods"><a href="#renaming-unsafe-lifecycle-methods" 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>Renomeando Métodos de Ciclo de Vida Inseguros </h3>
<p><a href="/blog/2018/03/27/update-on-async-rendering.html">Há mais de um ano</a>, anunciamos que os métodos de ciclo de vida inseguros estão sendo renomeados:</p>
<ul>
<li><code class="gatsby-code-text">componentWillMount</code> → <code class="gatsby-code-text">UNSAFE_componentWillMount</code></li>
<li><code class="gatsby-code-text">componentWillReceiveProps</code> → <code class="gatsby-code-text">UNSAFE_componentWillReceiveProps</code></li>
<li><code class="gatsby-code-text">componentWillUpdate</code> → <code class="gatsby-code-text">UNSAFE_componentWillUpdate</code></li>
</ul>
<p><strong>O React 16.9 não contém alterações significativas e os nomes antigos continuam funcionando nesta versão.</strong> Mas agora você verá um aviso ao usar qualquer um dos nomes antigos:</p>
<p><img src="https://i.imgur.com/sngxSML.png" alt="Warning: componentWillMount foi renomeado e não é recomendado para uso."></p>
<p>Como o aviso sugere, geralmente há <a href="/blog/2018/03/27/update-on-async-rendering.html#migrating-from-legacy-lifecycles">abordagens melhores</a> para cada um dos métodos inseguros. No entanto, talvez você não tenha tempo para migrar ou testar esses componentes. Nesse caso, recomendamos a execução de um script <a href="https://medium.com/@cpojer/effective-javascript-codemods-5a6686bb46fb" target="_blank" rel="nofollow noopener noreferrer">“codemod”</a> que os renomeia automaticamente:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token builtin class-name">cd</span> seu_projeto
npx react-codemod rename-unsafe-lifecycles</code></pre></div>
<p><em>(Note que ele diz <code class="gatsby-code-text">npx</code>, não <code class="gatsby-code-text">npm</code>. <code class="gatsby-code-text">npx</code> é um utilitário que vem com  Node 6+ por padrão.)</em></p>
<p>A execução deste codemod substituirá os nomes antigos como <code class="gatsby-code-text">componentWillMount</code> pelos novos nomes como <code class="gatsby-code-text">UNSAFE_componentWillMount</code>:</p>
<p><img src="https://i.imgur.com/Heyvcyi.gif" alt="Codemod em ação"></p>
<p>Os novos nomes como <code class="gatsby-code-text">UNSAFE_componentWillMount</code> <strong>irão continuar a funcionar em ambos React 16.9 e em React 17.x</strong>. No entanto, o novo prefixo <code class="gatsby-code-text">UNSAFE_</code> ajudará os componentes com padrões problemáticos a se destacarem durante os code review e depuração de código. (Se desejar, você pode desestimular ainda mais o uso dele dentro do seu aplicativo com o <a href="/docs/strict-mode.html">Strict Mode</a>.)</p>
<blockquote>
<p>Nota</p>
<p>Saiba mais sobre nossa <a href="/docs/faq-versioning.html#commitment-to-stability">política de versão e compromisso com a estabilidade</a>.</p>
</blockquote>
<h3 id="deprecating-javascript-urls"><a href="#deprecating-javascript-urls" 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>Depreciando URLs <code class="gatsby-code-text">javascript:</code> </h3>
<p>As URLs que começam com <code class="gatsby-code-text">javascript:</code> são uma superfície de ataque perigosa porque é fácil incluir acidentalmente uma saída não-tratada em uma tag <code class="gatsby-code-text">&lt;a href&gt;</code> e criar uma brecha de segurança:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token keyword">const</span> userProfile <span class="token operator">=</span> <span class="token punctuation">{</span>
  website<span class="token operator">:</span> <span class="token string">"javascript: alert('you got hacked')"</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token comment">// This will now warn:</span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span>userProfile<span class="token punctuation">.</span>website<span class="token punctuation">}</span></span><span class="token punctuation">></span></span><span class="token plain-text">Profile</span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span></code></pre></div>
<p><strong>Em React 16.9,</strong> esse padrão continua a funcionar, mas registrará um aviso. Se você usar <code class="gatsby-code-text">javascript:</code> na lógica das URLs, tente usar manipuladores de eventos React. (Como último recurso, você pode contornar a proteção <a href="/docs/dom-elements.html#dangerouslysetinnerhtml"><code class="gatsby-code-text">dangerouslySetInnerHTML</code></a>, mas é altamente desencorajado e muitas vezes leva a falhas de segurança.)</p>
<p><strong>Em uma versão principal futura,</strong> React lançará um erro se encontrar um <code class="gatsby-code-text">javascript:</code> URL.</p>
<h3 id="deprecating-factory-components"><a href="#deprecating-factory-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>Depreciando Componentes “Factory” </h3>
<p>Antes de compilar as classes JavaScript com o Babel se tornar popular, o React tinha suporte para um componente “factory” que retorna um objeto com um método <code class="gatsby-code-text">render</code>:</p>
<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">FactoryComponent</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <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> <span class="token keyword">return</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> <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div>
<p>Esse padrão é confuso porque parece muito com um componente de função - mas não é um. (Um componente de função apenas retornaria o <code class="gatsby-code-text">&lt;div /&gt;</code> do exemplo acima.)</p>
<p>Esse padrão quase nunca foi usado e o suportá-lo faz com que o React seja um pouco maior e mais lento do que o necessário. Então estamos depreciando este padrão na 16.9 e registrando um aviso se ele for encontrado. Se você confiar nele, a adição <code class="gatsby-code-text">FactoryComponent.prototype = React.Component.prototype</code> pode servir como uma solução alternativa. Alternativamente, você pode convertê-lo em uma classe ou em um componente de função.</p>
<p>Não esperamos que a maioria das bases de código seja afetadas por isso.</p>
<h2 id="new-features"><a href="#new-features" 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>Novas Funcionalidades </h2>
<h3 id="async-act-for-testing"><a href="#async-act-for-testing" 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>Utilitário <a href="/docs/test-utils.html#act"><code class="gatsby-code-text">act()</code></a> assíncrono para teste </h3>
<p><a href="/blog/2019/02/06/react-v16.8.0.html">O React 16.8</a> introduziu um novo utilitário de teste chamado <a href="/docs/test-utils.html#act"><code class="gatsby-code-text">act()</code></a> para ajudá-lo a escrever testes que correspondam melhor ao comportamento do navegador. Por exemplo, várias atualizações de estado em um único <code class="gatsby-code-text">act()</code> são enfileiradas. Isso corresponde ao modo como o React já funciona ao manipular eventos reais do navegador e ajuda a preparar seus componentes para o futuro, no qual o React irá enfileirar atualizações com mais frequência.</p>
<p>No entanto, em 16.8 <code class="gatsby-code-text">act()</code> apenas suporta funções síncronas. Às vezes, você pode ter visto um aviso como este em um teste, mas <a href="https://github.com/facebook/react/issues/14769" target="_blank" rel="nofollow noopener noreferrer">não conseguiu corrigi-lo facilmente</a>:</p>
<div class="gatsby-highlight" data-language="text"><pre class="gatsby-code-text"><code class="gatsby-code-text">An update to SomeComponent inside a test was not wrapped in act(...).</code></pre></div>
<p><strong>No React 16.9, <code class="gatsby-code-text">act()</code> também aceita funções assíncronas,</strong> e você pode chamar o <code class="gatsby-code-text">await</code>:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token keyword">await</span> <span class="token function">act</span><span class="token punctuation">(</span><span class="token keyword">async</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  <span class="token comment">// ...</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>Isso resolve os casos restantes em que antes você não podia usar o <code class="gatsby-code-text">act()</code>, como quando a atualização do estado estava dentro de uma função assíncrona. Como resultado, <strong>você poderá corrigir todos os avisos do <code class="gatsby-code-text">act()</code> restantes em seus testes agora.</strong> </p>
<p>Ouvimos que não haviam informações suficientes sobre como escrever testes com <code class="gatsby-code-text">act()</code>. O novo guia <a href="/docs/testing-recipes.html">Receitas de Testes</a> descreve cenários comuns e como <code class="gatsby-code-text">act()</code> pode ajudar você a escrever bons testes. Esses exemplos usam APIs vanilla do DOM, mas você pode também usar o <a href="https://testing-library.com/docs/react-testing-library/intro" target="_blank" rel="nofollow noopener noreferrer">React Testing Library</a> para reduzir o boilerplate de código. Muitos de seus métodos já usam <code class="gatsby-code-text">act()</code> internamente.</p>
<p>Por favor, informe-nos <a href="https://github.com/facebook/react/issues" target="_blank" rel="nofollow noopener noreferrer">com uma issue</a> se você se deparar com outros cenários em que <code class="gatsby-code-text">act()</code> não funciona bem para você e tentaremos ajudá-lo.</p>
<h3 id="performance-measurements-with-reactprofiler"><a href="#performance-measurements-with-reactprofiler" 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>Medições de Desempenho com <a href="/docs/profiler.html"><code class="gatsby-code-text">&lt;React.Profiler&gt;</code></a> </h3>
<p>Em React 16.5, introduzimos um novo <a href="/blog/2018/09/10/introducing-the-react-profiler.html">React Profiler para o DevTools</a> que ajuda a encontrar gargalos de desempenho em seu aplicativo. <strong>Em React 16.9, também estamos adicionando uma maneira <em>programática</em> de reunir as medições</strong> chamadas <code class="gatsby-code-text">&lt;React.Profiler&gt;</code>. Esperamos que a maioria dos aplicativos menores não os use, mas pode ser útil rastrear as regressões de desempenho ao longo do tempo em aplicativos maiores.</p>
<p>O <code class="gatsby-code-text">&lt;Profiler&gt;</code> mede com qual frequência uma aplicação React renderiza e qual o “custo” da renderização. Sua finalidade é ajudar identificar partes de um aplicativo que estão lentas e podem se beneficiar da <a href="/docs/hooks-faq.html#how-to-memoize-calculations">otimização, como a memorização</a>.</p>
<p>Um <code class="gatsby-code-text">&lt;Profiler&gt;</code> pode ser adicionado em qualquer lugar em uma árvore React para medir o custo de renderização dessa parte da árvore.
Ele requer duas props: um <code class="gatsby-code-text">id</code> (string) e um <a href="/docs/profiler.html#onrender-callback"><code class="gatsby-code-text">onRender</code> callback</a> (função) que o React chama toda vez que um componente dentro da árvore “envia” uma atualização.</p>
<div class="gatsby-highlight has-highlighted-lines" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token function">render</span><span class="token punctuation">(</span>
<span class="gatsby-highlight-code-line">  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">Profiler</span></span> <span class="token attr-name">id</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>application<span class="token punctuation">"</span></span> <span class="token attr-name">onRender</span><span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span><span class="token punctuation">{</span>onRenderCallback<span class="token punctuation">}</span></span><span class="token punctuation">></span></span><span class="token plain-text"></span></span><span class="token plain-text">    </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 plain-text"></span>
<span class="token plain-text">      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">Navigation</span></span> <span class="token spread"><span class="token punctuation">{</span><span class="token punctuation">...</span><span class="token attr-value">props</span><span class="token punctuation">}</span></span> <span class="token punctuation">/></span></span><span class="token plain-text"></span>
<span class="token plain-text">      </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span><span class="token class-name">Main</span></span> <span class="token spread"><span class="token punctuation">{</span><span class="token punctuation">...</span><span class="token attr-value">props</span><span class="token punctuation">}</span></span> <span class="token punctuation">/></span></span><span class="token plain-text"></span>
<span class="token plain-text">    </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 plain-text"></span>
<span class="gatsby-highlight-code-line"><span class="token plain-text">  </span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span><span class="token class-name">Profiler</span></span><span class="token punctuation">></span></span></span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>Para saber mais sobre o <code class="gatsby-code-text">Profiler</code> e os parametros passado para o <code class="gatsby-code-text">onRender</code> callback, confira <a href="/docs/profiler.html">a documentação do <code class="gatsby-code-text">Profiler</code></a>.</p>
<blockquote>
<p>Nota:</p>
<p>Profiling adiciona uma sobrecarga extra, portanto, <strong>ela é desativada na <a href="https://reactjs.org/docs/optimizing-performance.html#use-the-production-build" target="_blank" rel="nofollow noopener noreferrer">compilação de produção</a></strong>.</p>
<p>Para optar pelo profiling em produção, o React fornece uma compilação de produção especial com a criação de profiling ativo.
Leia mais sobre como usar essa versão em <a href="https://fb.me/react-profiling" target="_blank" rel="nofollow noopener noreferrer">fb.me/react-profiling</a>.</p>
</blockquote>
<h2 id="notable-bugfixes"><a href="#notable-bugfixes" 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>Bugfixes Notáveis </h2>
<p>Esta versão contém algumas outras melhorias notáveis:</p>
<ul>
<li>Um problema ao chamar <code class="gatsby-code-text">findDOMNode()</code> dentro de um <code class="gatsby-code-text">&lt;Suspense&gt;</code> <a href="https://github.com/facebook/react/pull/15312" target="_blank" rel="nofollow noopener noreferrer">foi corrigido</a>.</li>
<li>Um vazamento de memória causado pela retenção de subárvores excluídas <a href="https://github.com/facebook/react/pull/16115" target="_blank" rel="nofollow noopener noreferrer">também foi corrigido</a>.</li>
<li>Um loop infinito causado por <code class="gatsby-code-text">setState</code> em <code class="gatsby-code-text">useEffect</code> agora <a href="https://github.com/facebook/react/pull/15180" target="_blank" rel="nofollow noopener noreferrer">registra um erro</a>. (Isto é semelhante ao erro que você vê quando você chama <code class="gatsby-code-text">setState</code> em <code class="gatsby-code-text">componentDidUpdate</code> de uma classe.)</li>
</ul>
<p>Agradecemos a todos os colaboradores que ajudaram a identificar e corrigir esses e outros problemas. Você pode encontrar o changelog completo <a href="#changelog">abaixo</a>.</p>
<h2 id="an-update-to-the-roadmap"><a href="#an-update-to-the-roadmap" 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>Uma atualização para o Roadmap </h2>
<p>Em <a href="/blog/2018/11/27/react-16-roadmap.html">Novembro de 2018</a>, publicamos este roteiro para as versões 16.x:</p>
<ul>
<li>Uma versão menor de 16.x com React Hooks (estimativa passada: Q1 2019)</li>
<li>Uma versão menor de 16.x com o Concurrent Mode (estimativa passada: Q2 2019)</li>
<li>Uma versão menor de 16.x com Suspense para Data Fetching (estimativa anterior: meados de 2019)</li>
</ul>
<p>Essas estimativas eram otimistas demais e precisamos ajustá-las.</p>
<p><strong>tldr:</strong> Nós lançamos os Hooks a tempo, mas estamos reagrupando o Concurrent Mode e Suspense para Data Fetching em uma única versão que pretendemos lançar ainda este ano.</p>
<p>Em fevereiro, nós <a href="/blog/2019/02/06/react-v16.8.0.html">lançamos a versão estável 16.8</a> incluindo o React Hooks, com suporte ao React Native <a href="https://reactnative.dev/blog/2019/03/12/releasing-react-native-059" target="_blank" rel="nofollow noopener noreferrer">um mês mais tarde</a>. No entanto, subestimamos o trabalho de acompanhamento desta versão, incluindo as regras de lint, ferramentas de desenvolvimento, exemplos e mais documentação. Isso mudou a linha do tempo em alguns meses.</p>
<p>Agora que React Hooks foram lançados, o trabalho no Concurrent Mode e Suspense para Data Fetching está em pleno andamento. O <a href="https://twitter.com/facebook/status/1123322299418124289" target="_blank" rel="nofollow noopener noreferrer">novo site do Facebook que está atualmente em desenvolvimento ativo</a> é construído sobre esses recursos. Testá-los com código real ajudou a descobrir e resolver muitos problemas antes que eles pudessem afetar os usuários de código aberto. Algumas dessas correções envolveram uma reformulação interna desses recursos, o que também fez com que a linha do tempo fosse alterada.</p>
<p>Com esse novo entendimento, aqui está o que planejamos fazer a seguir.</p>
<h3 id="one-release-instead-of-two"><a href="#one-release-instead-of-two" 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>Um Lançamento em Vez de Dois </h3>
<p>Concurrent Mode e Suspense <a href="https://developers.facebook.com/videos/2019/building-the-new-facebookcom-with-react-graphql-and-relay/" target="_blank" rel="nofollow noopener noreferrer">fortalecem o novo site do Facebook</a> que está em desenvolvimento ativo, por isso estamos confiantes de que estão perto de um estado estável tecnicamente. Agora também entendemos melhor as etapas concretas antes que elas estejam prontas para adoção de código aberto.</p>
<p>Originalmente, pensamos em dividir o Concurrent Mode e Suspense para Data Fetching em dois lançamentos. Descobrimos que esse sequenciamento é confuso para explicar porque esses recursos são mais relacionados do que pensávamos inicialmente. Portanto, planejamos lançar suporte para o Concurrent Mode e Suspense para Data Fetching em uma única versão.</p>
<p>Nós não queremos comprometer a data de lançamento novamente. Dado que confiamos em ambos no código de produção, esperamos fornecer uma versão 16.x com suporte opcional para eles este ano.</p>
<h3 id="an-update-on-data-fetching"><a href="#an-update-on-data-fetching" 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>Uma Atualização na Busca de Dados </h3>
<p>Embora o React não tenha opinião sobre como você busca dados, a primeira versão do Suspense para Data Fetching provavelmente focará a integração com <em>bibliotecas de busca de dados opinativas</em>. Por exemplo, no Facebook, estamos usando as APIs do Relay que se integram com o Suspense. Vamos documentar como outras bibliotecas opinativas como a Apollo podem suportar uma integração semelhante.</p>
<p>Na primeira versão, <em>não</em> pretendemos focar na solução ad-hoc “fire an HTTP request” que usamos nas demos anteriores (também conhecidas como “React Cache”). No entanto, esperamos que tanto nós como a comunidade React exploremos esse espaço nos meses após o lançamento inicial.</p>
<h3 id="an-update-on-server-rendering"><a href="#an-update-on-server-rendering" 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>Uma Atualização na Renderização do Servidor </h3>
<p>Iniciamos o trabalho no <a href="/blog/2018/11/27/react-16-roadmap.html#suspense-for-server-rendering">novo renderizador de servidor com capacidade para suspense</a>, mas <em>não</em> esperamos que ele esteja pronto para a versão inicial do Concurrent Mode. Essa versão, no entanto, fornecerá uma solução temporária que permitirá que o renderizador do servidor existente emita HTML para fallbacks de Suspense imediatamente e, em seguida, renderize seu conteúdo real no cliente. Esta é a solução que estamos atualmente usando no Facebook até que o renderizador de streaming esteja pronto.</p>
<h3 id="why-is-it-taking-so-long"><a href="#why-is-it-taking-so-long" 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>Por que Demora Tanto Tempo? </h3>
<p>Lançamos as peças individuais que levaram ao Concurrent Mode quando elas se tornaram estáveis, incluindo a <a href="/blog/2018/03/29/react-v-16-3.html">nova API de contexto</a>, <a href="/blog/2018/10/23/react-v-16-6.html">carregamento sob demanda com Suspense</a> e <a href="/blog/2019/02/06/react-v16.8.0.html">Hooks</a>. Também estamos ansiosos para liberar as outras partes que faltam, mas <a href="/docs/design-principles.html#dogfooding">testá-las em escala</a> é uma parte importante do processo. A resposta honesta é que isso só levou mais trabalho do que esperávamos quando começamos. Como sempre, agradecemos suas dúvidas e comentários no <a href="https://twitter.com/reactjs" target="_blank" rel="nofollow noopener noreferrer">Twitter</a> e em nossas <a href="https://github.com/facebook/react/issues" target="_blank" rel="nofollow noopener noreferrer">issues</a>.</p>
<h2 id="installation"><a href="#installation" 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>Instalação </h2>
<h3 id="react"><a href="#react" 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>React </h3>
<p>React v16.9.0 está disponível no registro npm.</p>
<p>Para instalar o React 16 com Yarn, execute:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token function">yarn</span> <span class="token function">add</span> react@^16.9.0 react-dom@^16.9.0</code></pre></div>
<p>Para instalar o React 16 com npm, execute:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token function">npm</span> <span class="token function">install</span> --save react@^16.9.0 react-dom@^16.9.0</code></pre></div>
<p>Nós também fornecemos compilações UMD de React via CDN:</p>
<div class="gatsby-highlight" data-language="html"><pre class="gatsby-code-html"><code class="gatsby-code-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">crossorigin</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://unpkg.com/react@16/umd/react.production.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">crossorigin</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://unpkg.com/react-dom@16/umd/react-dom.production.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre></div>
<p>Consulte a documentação para <a href="/docs/installation.html">instruções detalhadas de instalação</a>.</p>
<h2 id="changelog"><a href="#changelog" 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>Changelog </h2>
<h3 id="react"><a href="#react" 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>React </h3>
<ul>
<li>Adiciona API do <code class="gatsby-code-text">&lt;React.Profiler&gt;</code> para reunir medições de desempenho programaticamente. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/15172" target="_blank" rel="nofollow noopener noreferrer">#15172</a>)</li>
<li>Remove <code class="gatsby-code-text">unstable_ConcurrentMode</code> em favor de <code class="gatsby-code-text">unstable_createRoot</code>. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/15532" target="_blank" rel="nofollow noopener noreferrer">#15532</a>)</li>
</ul>
<h3 id="react-dom"><a href="#react-dom" 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>React DOM </h3>
<ul>
<li>Deprecia nomes antigos dos métodos do ciclo de vida para os <code class="gatsby-code-text">UNSAFE_*</code>. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/15186" target="_blank" rel="nofollow noopener noreferrer">#15186</a> e <a href="https://github.com/threepointone" target="_blank" rel="nofollow noopener noreferrer">@threepointone</a> em <a href="https://github.com/facebook/react/pull/16103" target="_blank" rel="nofollow noopener noreferrer">#16103</a>)</li>
<li>Deprecia URLs <code class="gatsby-code-text">javascript:</code> como uma superfície de ataque comum. (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/15047" target="_blank" rel="nofollow noopener noreferrer">#15047</a>)</li>
<li>Deprecia componentes incomuns do “module pattern” (factory). (<a href="https://github.com/sebmarkbage" target="_blank" rel="nofollow noopener noreferrer">@sebmarkbage</a> em <a href="https://github.com/facebook/react/pull/15145" target="_blank" rel="nofollow noopener noreferrer">#15145</a>)</li>
<li>Adiciona suporte para o atributo <code class="gatsby-code-text">disablePictureInPicture</code> em <code class="gatsby-code-text">&lt;video&gt;</code>. (<a href="https://github.com/eek" target="_blank" rel="nofollow noopener noreferrer">@eek</a> em <a href="https://github.com/facebook/react/pull/15334" target="_blank" rel="nofollow noopener noreferrer">#15334</a>)</li>
<li>Adiciona suporte para o evento <code class="gatsby-code-text">onLoad</code> no <code class="gatsby-code-text">&lt;embed&gt;</code>. (<a href="https://github.com/cherniavskii" target="_blank" rel="nofollow noopener noreferrer">@cherniavskii</a> em <a href="https://github.com/facebook/react/pull/15614" target="_blank" rel="nofollow noopener noreferrer">#15614</a>)</li>
<li>Adiciona suporte para editar estados criados por <code class="gatsby-code-text">useState</code> no DevTools. (<a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">@bvaughn</a> em <a href="https://github.com/facebook/react/pull/14906" target="_blank" rel="nofollow noopener noreferrer">#14906</a>)</li>
<li>Adiciona suporte para alterar o Suspense no DevTools. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/15232" target="_blank" rel="nofollow noopener noreferrer">#15232</a>)</li>
<li>Avisa quando <code class="gatsby-code-text">setState</code> é chamado no <code class="gatsby-code-text">useEffect</code>, criando um loop. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/15180" target="_blank" rel="nofollow noopener noreferrer">#15180</a>)</li>
<li>Corrige um vazamento de memória. (<a href="https://github.com/paulshen" target="_blank" rel="nofollow noopener noreferrer">@paulshen</a> em <a href="https://github.com/facebook/react/pull/16115" target="_blank" rel="nofollow noopener noreferrer">#16115</a>)</li>
<li>Corrige uma falha dentro do <code class="gatsby-code-text">findDOMNode</code> dos componentes envolvidos por <code class="gatsby-code-text">&lt;Suspense&gt;</code>. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/15312" target="_blank" rel="nofollow noopener noreferrer">#15312</a>)</li>
<li>Corrige efeitos pendentes de ser liberados muito tarde. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/15650" target="_blank" rel="nofollow noopener noreferrer">#15650</a>)</li>
<li>Corrige ordem de argumento incorreta em uma messagem de aviso. (<a href="https://github.com/brickspert" target="_blank" rel="nofollow noopener noreferrer">@brickspert</a> em <a href="https://github.com/facebook/react/pull/15345" target="_blank" rel="nofollow noopener noreferrer">#15345</a>)</li>
<li>Corrige a ocultação dos nós de fallback do Suspense quando houver um <code class="gatsby-code-text">!important</code> no estilo. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/15861" target="_blank" rel="nofollow noopener noreferrer">#15861</a> e <a href="https://github.com/facebook/react/pull/15882" target="_blank" rel="nofollow noopener noreferrer">#15882</a>)</li>
<li>Melhora ligeiramente o desempenho de hidratação. (<a href="https://github.com/bmeurer" target="_blank" rel="nofollow noopener noreferrer">@bmeurer</a> em <a href="https://github.com/facebook/react/pull/15998" target="_blank" rel="nofollow noopener noreferrer">#15998</a>)</li>
</ul>
<h3 id="react-dom-server"><a href="#react-dom-server" 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>React DOM Server </h3>
<ul>
<li>Corrige a saída incorreta para nomes de propriedades CSS customizadas do camelCase. (<a href="https://github.com/bedakb" target="_blank" rel="nofollow noopener noreferrer">@bedakb</a> em <a href="https://github.com/facebook/react/pull/16167" target="_blank" rel="nofollow noopener noreferrer">#16167</a>)</li>
</ul>
<h3 id="react-test-utilities-and-test-renderer"><a href="#react-test-utilities-and-test-renderer" 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>React Test Utilities e Test Renderer </h3>
<ul>
<li>Adiciona <code class="gatsby-code-text">act(async () =&gt; ...)</code> para testar atualizações de estado assíncronas. (<a href="https://github.com/threepointone" target="_blank" rel="nofollow noopener noreferrer">@threepointone</a> em <a href="https://github.com/facebook/react/pull/14853" target="_blank" rel="nofollow noopener noreferrer">#14853</a>)</li>
<li>Adiciona suporte para aninhamento <code class="gatsby-code-text">act</code> de diferentes renderizadores. (<a href="https://github.com/threepointone" target="_blank" rel="nofollow noopener noreferrer">@threepointone</a> em <a href="https://github.com/facebook/react/pull/16039" target="_blank" rel="nofollow noopener noreferrer">#16039</a> e <a href="https://github.com/facebook/react/pull/16042" target="_blank" rel="nofollow noopener noreferrer">#16042</a>)</li>
<li>Avisa no Strict Mode se os efeitos estiverem programados fora de uma chamada <code class="gatsby-code-text">act()</code>. (<a href="https://github.com/threepointone" target="_blank" rel="nofollow noopener noreferrer">@threepointone</a> em <a href="https://github.com/facebook/react/pull/15763" target="_blank" rel="nofollow noopener noreferrer">#15763</a> e <a href="https://github.com/facebook/react/pull/16041" target="_blank" rel="nofollow noopener noreferrer">#16041</a>)</li>
<li>Avisa ao usar <code class="gatsby-code-text">act</code> no renderizador errado. (<a href="https://github.com/threepointone" target="_blank" rel="nofollow noopener noreferrer">@threepointone</a> em <a href="https://github.com/facebook/react/pull/15756" target="_blank" rel="nofollow noopener noreferrer">#15756</a>)</li>
</ul>]]></description><link>https://pt-br.reactjs.org/blog/2019/08/08/react-v16.9.0.html</link><guid isPermaLink="false">https://pt-br.reactjs.org/blog/2019/08/08/react-v16.9.0.html</guid><pubDate>Thu, 08 Aug 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[O React já esta traduzido? ¡Sí! Sim! はい！]]></title><description><![CDATA[<p>Temos o prazer de anunciar o esforço continuo para manter traduções oficiais do website de documentação do React em diferentes idiomas. Graças ao esforço dedicado dos membros da comunidade do React de todo o mundo, o React agora está sendo traduzido em <em>mais de 30</em> idiomas! Você pode acha-los na nova pagina de <a href="/languages">Idiomas</a>.</p>
<p>Além disso, as três linguagens a seguir concluíram a tradução da maioria dos documentos do React! 🎉</p>
<ul>
<li><strong>Espanhol: <a href="https://es.reactjs.org" target="_blank" rel="nofollow noopener noreferrer">es.reactjs.org</a></strong></li>
<li><strong>Japonês: <a href="https://ja.reactjs.org" target="_blank" rel="nofollow noopener noreferrer">ja.reactjs.org</a></strong></li>
<li><strong>Português do Brasil: <a href="https://pt-br.reactjs.org" target="_blank" rel="nofollow noopener noreferrer">pt-br.reactjs.org</a></strong></li>
</ul>
<p>Parabéns especiais para <a href="https://github.com/alejandronanez" target="_blank" rel="nofollow noopener noreferrer">Alejandro Ñáñez Ortiz</a>, <a href="https://github.com/carburo" target="_blank" rel="nofollow noopener noreferrer">Rainer Martínez Fraga</a>, <a href="https://github.com/dmorales" target="_blank" rel="nofollow noopener noreferrer">David Morales</a>, <a href="https://github.com/Darking360" target="_blank" rel="nofollow noopener noreferrer">Miguel Alejandro Bolívar Portilla</a>, e todos os colaboradores da tradução em espanhol por serem os primeiros a <em>completamente</em> traduzirem as páginas principais da documentação!</p>
<h2 id="why-localization-matters"><a href="#why-localization-matters" 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>Por Que a Localização é Importante? </h2>
<p>O React já tem muitos eventos e conferências no mundo todo, mas muitos desenvolvedores não tem o inglês como idioma principal. Gostaríamos de oferecer suporte às comunidades locais que usam o React, disponibilizando nossa documentação nos idiomas mais populares.</p>
<p>No passado, membros da comunidade do React criaram traduções não oficiais para o <a href="https://github.com/discountry/react" target="_blank" rel="nofollow noopener noreferrer">chinês</a>, <a href="https://wiki.hsoub.com/React" target="_blank" rel="nofollow noopener noreferrer">árabe</a> e <a href="https://github.com/reactjs/ko.reactjs.org/issues/4" target="_blank" rel="nofollow noopener noreferrer">coreano</a>; Ao criar um canal oficial para essas traduções, esperamos torna-las mais fáceis de se encontrar e ajudar a garantir que os usuários do React que não falem inglês não sejam deixados para trás.</p>
<h2 id="contributing"><a href="#contributing" 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>Contribuindo </h2>
<p>Se você quiser ajudar em uma tradução atual, confira a página <a href="/languages">Idiomas</a> e clique no link “Contribuir” para o seu idioma.</p>
<p>Não consegue encontrar o seu idioma? Se você deseja manter o repositório de tradução do seu idioma, siga as instruções no <a href="https://github.com/reactjs/reactjs.org-translation#starting-a-new-translation" target="_blank" rel="nofollow noopener noreferrer">repositório de tradução</a>!</p>
<h2 id="backstory"><a href="#backstory" 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>Contexto </h2>
<p>Olá a todos! Me chamo <a href="https://twitter.com/tesseralis" target="_blank" rel="nofollow noopener noreferrer">Nat</a>! Talvez você me conheça como a <a href="https://www.youtube.com/watch?v=Ew-UzGC8RqQ" target="_blank" rel="nofollow noopener noreferrer">moça dos poliedros</a>. Nas últimas semanas, eu ajudei a equipe do React a coordenar os esforços da tradução. Eis como eu fiz isso.</p>
<p>Nossa abordagem original para as traduções foi usar uma plataforma SaaS que permite usuários a submeter traduções. Já havia um <a href="https://github.com/reactjs/reactjs.org/pull/873" target="_blank" rel="nofollow noopener noreferrer">pull request</a> para integrá-lo e minha responsabilidade original era terminar essa integração. No entanto, tivemos preocupações sobre a viabilidade dessa integração e a qualidade das traduções na plataforma no momento. Nossa principal preocupação era garantir que as traduções continuassem atualizadas com o repositório principal e não se tornassem obsoletas.</p>
<p><a href="https://twitter.com/dan_abramov" target="_blank" rel="nofollow noopener noreferrer">Dan</a> me encorajou a procurar soluções alternativas, e nós nos deparamos com a forma como a <a href="https://vuejs.org" target="_blank" rel="nofollow noopener noreferrer">Vue</a> manteve suas traduções - através de diferentes forks dos principais repositórios no GitHub. Em particular, a <a href="https://jp.vuejs.org" target="_blank" rel="nofollow noopener noreferrer">tradução em japonês</a> usou um bot para verificar periodicamente as alterações no repositório em inglês e enviar pull requests sempre que existir uma mudança.</p>
<p>Essa abordagem nos atraiu por vários motivos:</p>
<ul>
<li>Menos código de integração.</li>
<li>Encorajou mantenedores ativos em cada repositório para garantir qualidade.</li>
<li>Os colaboradores já tem entendimento do GitHub como plataforma e ficam motivados para contribuir diretamente a organização do React.</li>
</ul>
<p>Começamos com um período inicial de teste em três idiomas: espanhol, japonês e chinês simplificado. Isso nos permitiu resolver quaisquer problemas no processo e garantir que futuras traduções tenham ótimas chances de sucesso. Eu queria dar a liberdade para que as equipes de tradução pudessem escolher qualquer ferramenta com a qual se sentissem à vontade. O único requisito é uma <a href="https://github.com/reactjs/reactjs.org-translation/blob/master/PROGRESS.template.md" target="_blank" rel="nofollow noopener noreferrer">checklist</a> que descreve a ordem de importância para a tradução de páginas.</p>
<p>Após o período de testes, estávamos prontos para aceitar mais idiomas. Eu criei <a href="https://github.com/reactjs/reactjs.org-translation/blob/master/scripts/create.js" target="_blank" rel="nofollow noopener noreferrer">um script</a> para automatizar a criação de novos repositórios de idiomas, e um site, <a href="https://isreacttranslatedyet.com" target="_blank" rel="nofollow noopener noreferrer">O React já esta traduzido?</a>, para acompanhar o andamento das diferentes traduções. Começamos <em>10</em> novas traduções apenas no nosso primeiro dia!</p>
<p>Por causa da automação, o restante da manutenção foi em geral tranquila. Nós finalmente criamos um <a href="https://rt-slack-invite.herokuapp.com" target="_blank" rel="nofollow noopener noreferrer">canal no Slack</a> para facilitar o compartilhamento de informações pelos tradutores, e eu publiquei um guia para solidificar as <a href="https://github.com/reactjs/reactjs.org-translation/blob/master/maintainer-guide.md" target="_blank" rel="nofollow noopener noreferrer">responsabilidades dos mantenedores</a>. Permitir que os tradutores conversassem entre si foi um grande benefício - por exemplo, as traduções em árabe, persa e hebraico eram capazes de se comunicar entre si para obter o <a href="https://en.wikipedia.org/wiki/Right-to-left" target="_blank" rel="nofollow noopener noreferrer">texto da direita para a esquerda</a> funcionando!</p>
<h2 id="the-bot"><a href="#the-bot" 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 Bot </h2>
<p>A parte mais desafiadora foi fazer com que o bot sincronizasse as alterações da versão em inglês do site. Inicialmente, estávamos usando o bot <a href="https://github.com/vuejs-jp/che-tsumi" target="_blank" rel="nofollow noopener noreferrer">che-tsumi</a> criado pela equipe de tradução da Vue em japonês, mas logo decidimos construir nosso próprio bot para atender às nossas necessidades. Em particular, o bot che-tsumi trabalha com <a href="https://git-scm.com/docs/git-cherry-pick" target="_blank" rel="nofollow noopener noreferrer">cherry picking</a> dos novos commits. Isso acabou causando uma confusão de novos problemas que estavam interconectados, especialmente quando <a href="/blog/2019/02/06/react-v16.8.0.html">os Hooks foram lançados</a>.</p>
<p>No final, decidimos que em vez de selecionar cada commit com cherry pick, fazia mais sentido juntar todos os novos commits e criar um novo pull request em torno de uma vez por dia. Conflitos são deixados como estão e listados no <a href="https://github.com/reactjs/pt-BR.reactjs.org/pull/114" target="_blank" rel="nofollow noopener noreferrer">pull request</a>, deixando uma lista de pontos para os mantenedores corrigirem.</p>
<p>Criar o <a href="https://github.com/reactjs/reactjs.org-translation/blob/master/scripts/sync.js" target="_blank" rel="nofollow noopener noreferrer">script de sincronização</a> foi fácil: ele faz o download do repositório traduzido, adiciona o original como remoto, puxa dele, mescla os conflitos e cria um pull request.</p>
<p>O problema foi encontrar um lugar para o bot rodar. Eu sou uma desenvolvedora frontend por uma razão - Heroku e seus amigos são estranhos para mim e infinitamente frustrantes. Na verdade, até esta terça-feira passada, eu estava executando o script manualmente na minha máquina local!</p>
<p>O maior desafio foi o espaço. Cada fork do repositório tem cerca de 100MB - o que leva alguns minutos para clonar na minha máquina local. Temos <em>32</em> forks, e os níveis gratuitos da maioria das plataformas de deployment que eu verifiquei limitam você a 512 MB de armazenamento.</p>
<p>Após vários cálculos no papel, encontrei uma solução: excluir cada repo depois de terminar o script e limitar a simultaneidade dos scripts de sincronização que são executados de uma vez para estarem dentro dos requisitos de armazenamento. Felizmente, os dynos no Heroku têm uma conexão à Internet muito mais rápida e são capazes de clonar até mesmo o repositório do React rapidamente.</p>
<p>Houve outros problemas menores que eu encontrei. Eu tentei usar o <a href="https://elements.heroku.com/addons/scheduler" target="_blank" rel="nofollow noopener noreferrer">Heroku Scheduler</a> para não ter que escrever nenhum código que fizesse <code class="gatsby-code-text">watch</code> (vigiar o repositório), mas ele acabou rodando de forma muito inconsistente, e eu <a href="https://twitter.com/tesseralis/status/1097387938088796160" target="_blank" rel="nofollow noopener noreferrer">tive um colapso existencial no Twitter</a> quando não conseguia descobrir como enviar commits do dyno no Heroku. Mas no final, essa engenheira de frontend conseguiu fazer o bot funcionar!</p>
<p>Há, como sempre, melhorias que quero fazer no bot. No momento, ele não verifica se há um pedido de pull request pendente antes de fazer outro. Ainda é difícil dizer a mudança exata que aconteceu na fonte original, e é possível não perceber uma mudança de tradução necessária. Mas eu confio nos mantenedores que escolhemos para resolver esses problemas, e o bot é <a href="https://github.com/reactjs/reactjs.org-translation" target="_blank" rel="nofollow noopener noreferrer">open source</a> se alguém quiser me ajudar a fazer essas melhorias!</p>
<h2 id="thanks"><a href="#thanks" 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>Agradecimentos </h2>
<p>Por fim, gostaria de estender minha gratidão às seguintes pessoas e grupos:</p>
<ul>
<li>Todos os mantenedores e contribuidores que estão ajudando a traduzir o React para mais de trinta idiomas.</li>
<li>O <a href="https://github.com/vuejs-jp" target="_blank" rel="nofollow noopener noreferrer">Grupo de Usuários do Vue.js Japão</a> por ter a ideia de ter traduções gerenciadas por um bot e, especialmente, a <a href="https://github.com/potato4d" target="_blank" rel="nofollow noopener noreferrer">Hanatani Takuma</a> por nos ajudar a entender sua abordagem e ajudar a manter a tradução em japonês.</li>
<li><a href="https://github.com/smikitky" target="_blank" rel="nofollow noopener noreferrer">Soichiro Miki</a> por muitas <a href="https://github.com/reactjs/reactjs.org/pull/1636" target="_blank" rel="nofollow noopener noreferrer">contribuições</a> e comentários heio de idéias sobre o processo geral de tradução, bem como por manter a tradução japonesa.</li>
<li><a href="https://github.com/ericnakagawa" target="_blank" rel="nofollow noopener noreferrer">Eric Nakagawa</a> por gerenciar nosso processo de tradução anterior.</li>
<li><a href="https://github.com/bvaughn" target="_blank" rel="nofollow noopener noreferrer">Brian Vaughn</a> por configurar a <a href="/languages">página de idiomas</a> e gerenciar todos os subdomínios.</li>
</ul>
<p>E finalmente, obrigada a <a href="https://twitter.com/dan_abramov" target="_blank" rel="nofollow noopener noreferrer">Dan Abramov</a> por me dar esta oportunidade e ser um grande mentor ao longo do caminho.</p>]]></description><link>https://pt-br.reactjs.org/blog/2019/02/23/is-react-translated-yet.html</link><guid isPermaLink="false">https://pt-br.reactjs.org/blog/2019/02/23/is-react-translated-yet.html</guid><pubDate>Sat, 23 Feb 2019 00:00:00 GMT</pubDate></item><item><title><![CDATA[React v16.8: O React com Hooks]]></title><description><![CDATA[<p>Com o React 16.8, <a href="/docs/hooks-intro.html">React Hooks</a> tornam-se disponíveis em sua versão estável!</p>
<h2 id="what-are-hooks"><a href="#what-are-hooks" 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 São Hooks? </h2>
<p>Hooks lhe permite utilizar estado e outras funcionalidades do React sem a necessidade de escrever uma classe. Assim como, você também pode <strong>criar o seus próprios Hooks</strong> para compartilhar e reutilizar sua lógica com estado entre componentes.</p>
<p>Se você nunca ouviu falar sobre Hooks antes, talvez você ache estes tópicos interessantes:</p>
<ul>
<li><a href="/docs/hooks-intro.html">Introduzindo Hooks</a> explica porque nós estamos adicionando Hooks ao React.</li>
<li><a href="/docs/hooks-overview.html">Hooks de Forma Resumida</a> é uma visão geral sobre o Hooks.</li>
<li><a href="/docs/hooks-custom.html">Criando Seus Próprios Hooks</a> demonstra como reutilizar de código utilizando Hooks personalizados.</li>
<li><a href="https://medium.com/@dan_abramov/making-sense-of-react-hooks-fdbde8803889" target="_blank" rel="nofollow noopener noreferrer">O Sentido do React Hooks</a> explora as novas possibilidades com Hooks.</li>
<li><a href="https://usehooks.com/" target="_blank" rel="nofollow noopener noreferrer">useHooks.com</a> apresenta Hooks mantidos pela comunidade e suas implementações.</li>
</ul>
<p><strong>Você não precisa aprender Hooks agora.</strong> Hooks não quebra aplicações existentes, e nós não temos planos de remover o uso de classes do React. O <a href="/docs/hooks-faq.html">Hooks FAQ</a> descreve à adoção gradual da estratégia.</p>
<h2 id="no-big-rewrites"><a href="#no-big-rewrites" 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>Sem Grandes Reescritas </h2>
<p>Não recomendamos que você reescreva suas aplicações existentes, apenas para utilizar Hooks de uma hora para outra. Pelo contrário, tente utilizar Hooks em alguns de seus novos componentes, e deixe-nos saber o que você acha. Desenvolver utlizando Hooks, funcionará <a href="/docs/hooks-intro.html#gradual-adoption-strategy">lado a lado</a> ao código já existente qual faz uso de classes.</p>
<h2 id="can-i-use-hooks-today"><a href="#can-i-use-hooks-today" 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>Posso usar Hooks hoje? </h2>
<p>Sim! Iniciando com a versão 16.8.0, o React inclui a versão estável da implementação do React Hooks para:</p>
<ul>
<li>React DOM</li>
<li>React DOM Servidor (React DOM Server)</li>
<li>Renderizador de Teste React (React Test Renderer)</li>
<li>Renderizador Superficial React (React Shallow Renderer)</li>
</ul>
<p>Observe que <strong>para utilizar Hooks, todos os pacotes do React precisam estar na versão 16.8.0 ou superior</strong>. Hooks não irão funcionar se você esquecer de atualizar, por exemplo, o React DOM.</p>
<p><strong>O React Native terá suporte ao Hooks na <a href="https://github.com/react-native-community/react-native-releases/issues/79#issuecomment-457735214" target="_blank" rel="nofollow noopener noreferrer">versão 0.59</a>.</strong></p>
<h2 id="tooling-support"><a href="#tooling-support" 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>Suporte de Ferramentas </h2>
<p>React Hooks agora são suportados pelo React DevTools. Assim como, as últimas definições de Flow e TypeScript do React. Nós recomendamos fortemente a utilização da <a href="https://www.npmjs.com/package/eslint-plugin-react-hooks" target="_blank" rel="nofollow noopener noreferrer">nova regra lint, chamada: <code class="gatsby-code-text">eslint-plugin-react-hooks</code></a>, para a aplicação das melhores práticas de codificação com Hooks. Em breve, ela será incluída ao Create React App por padrão. </p>
<h2 id="whats-next"><a href="#whats-next" 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 Vem a Seguir </h2>
<p>Nós descrevemos nossos planos para os próximos meses na recente publicação do <a href="/blog/2018/11/27/react-16-roadmap.html">Roteiro React</a>. </p>
<p>Observe que React Hooks ainda não cobrem <em>todos</em> os casos de uso de classes, mas eles estão <a href="/docs/hooks-faq.html#do-hooks-cover-all-use-cases-for-classes">bem próximos</a>. Atualmente, apenas os métodos que não possuem API de Hooks equivalentes são <code class="gatsby-code-text">getSnapshotBeforeUpdate()</code> e <code class="gatsby-code-text">componentDidCatch()</code>, estes ciclos de vida são relativamentes incomuns. Se você quiser, você deve conseguir utilizar Hooks em grande parte do novo código qual você está escrevendo.</p>
<p>Mesmo enquanto Hooks estavam em sua versão alpha, a comunidade React criou muitos <a href="https://codesandbox.io/react-hooks" target="_blank" rel="nofollow noopener noreferrer">exemplos</a> e <a href="https://usehooks.com" target="_blank" rel="nofollow noopener noreferrer">indicações</a> interessantes usando Hooks, seja para animações, formulários, subscriptions, integração com outras bibliotecas e assim por diante. Nós estamos entusiasmados com Hooks, porque eles tornam a reutilização de código mais fácil, ajudando você a escrever seus componentes de forma simples e criando grandes experiências de usuário. Não podemos esperar para ver o que você irá criar em seguida!</p>
<h2 id="testing-hooks"><a href="#testing-hooks" 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>Testando os Hooks </h2>
<p>Nós adicionamos uma nova API nesta versão, chamada <code class="gatsby-code-text">ReactTestUtils.act()</code>. Ela garante que o comportamento de seus testes, correspondam de forma mais semelhante com o que acontece no navegador. Nós recomendamos encapsular quaquer código de renderização e execução de atualizações ao seu componente, dentro das chamadas aos métodos <code class="gatsby-code-text">act()</code>. Bibliotecas de teste, do mesmo modo, podem encapsular suas APIs com o método (por exemplo: utilitários do <a href="https://testing-library.com/react" target="_blank" rel="nofollow noopener noreferrer"><code class="gatsby-code-text">react-testing-library</code></a>, como <code class="gatsby-code-text">render</code> e <code class="gatsby-code-text">fireEvent</code>, fazem isto).</p>
<p>Por exemplo, o exemplo de contador <a href="/docs/hooks-effect.html">desta página</a> pode ser testado assim:</p>
<div class="gatsby-highlight has-highlighted-lines" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token keyword">import</span> React <span class="token keyword">from</span> <span class="token string">'react'</span><span class="token punctuation">;</span>
<span class="token keyword">import</span> ReactDOM <span class="token keyword">from</span> <span class="token string">'react-dom'</span><span class="token punctuation">;</span>
<span class="gatsby-highlight-code-line"><span class="token keyword">import</span> <span class="token punctuation">{</span> act <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react-dom/test-utils'</span><span class="token punctuation">;</span></span><span class="token keyword">import</span> Counter <span class="token keyword">from</span> <span class="token string">'./Counter'</span><span class="token punctuation">;</span>

<span class="token keyword">let</span> container<span class="token punctuation">;</span>

<span class="token function">beforeEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  container <span class="token operator">=</span> document<span class="token punctuation">.</span><span class="token function">createElement</span><span class="token punctuation">(</span><span class="token string">'div'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  document<span class="token punctuation">.</span>body<span class="token punctuation">.</span><span class="token function">appendChild</span><span class="token punctuation">(</span>container<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token function">afterEach</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  document<span class="token punctuation">.</span>body<span class="token punctuation">.</span><span class="token function">removeChild</span><span class="token punctuation">(</span>container<span class="token punctuation">)</span><span class="token punctuation">;</span>
  container <span class="token operator">=</span> <span class="token keyword">null</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token function">it</span><span class="token punctuation">(</span><span class="token string">'can render and update a counter'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  <span class="token comment">// Testa primeira renderização e resultado</span>
<span class="gatsby-highlight-code-line">  <span class="token function">act</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span></span><span class="gatsby-highlight-code-line">    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">Counter</span></span> <span class="token punctuation">/></span></span><span class="token punctuation">,</span> container<span class="token punctuation">)</span><span class="token punctuation">;</span></span><span class="gatsby-highlight-code-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>  <span class="token keyword">const</span> button <span class="token operator">=</span> container<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'button'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token keyword">const</span> label <span class="token operator">=</span> container<span class="token punctuation">.</span><span class="token function">querySelector</span><span class="token punctuation">(</span><span class="token string">'p'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token function">expect</span><span class="token punctuation">(</span>label<span class="token punctuation">.</span>textContent<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toBe</span><span class="token punctuation">(</span><span class="token string">'Você clicou 0 vezes'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token function">expect</span><span class="token punctuation">(</span>document<span class="token punctuation">.</span>title<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toBe</span><span class="token punctuation">(</span><span class="token string">'Você clicou 0 vezes'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token comment">// Testa segunda renderização e resultado</span>
<span class="gatsby-highlight-code-line">  <span class="token function">act</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span></span><span class="gatsby-highlight-code-line">    button<span class="token punctuation">.</span><span class="token function">dispatchEvent</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">MouseEvent</span><span class="token punctuation">(</span><span class="token string">'click'</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>bubbles<span class="token operator">:</span> <span class="token boolean">true</span><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span><span class="gatsby-highlight-code-line">  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>  <span class="token function">expect</span><span class="token punctuation">(</span>label<span class="token punctuation">.</span>textContent<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toBe</span><span class="token punctuation">(</span><span class="token string">'Você clicou 1 vezes'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token function">expect</span><span class="token punctuation">(</span>document<span class="token punctuation">.</span>title<span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toBe</span><span class="token punctuation">(</span><span class="token string">'Você clicou 1 vezes'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre></div>
<p>As chamadas ao método <code class="gatsby-code-text">act()</code> também irão disparar os efeitos dentro delas.</p>
<p>Se você precisa testar um Hook customizado, você pode fazer isso criando um componente em seu teste e utilizar seu Hook a partir dele. Assim, você pode testar o componente qual você escreveu.</p>
<p>Para reduzir a repetição, nós recomendamos utilizar a <a href="https://testing-library.com/react" target="_blank" rel="nofollow noopener noreferrer"><code class="gatsby-code-text">react-testing-library</code></a>, qual é projetada para incentivar a escrita de testes, que utilizam de seus componentes como o usuário final utiliza.</p>
<h2 id="thanks"><a href="#thanks" 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>Agradecimento </h2>
<p>Nós gostaríamos de agradecer todos aqueles que comentaram no <a href="https://github.com/reactjs/rfcs/pull/68" target="_blank" rel="nofollow noopener noreferrer">Hooks RFC</a>, por terem compartilhado suas opiniões. Nós lemos todos os seus comentários e fizemos alguns ajustes finais nas APIs baseando-se neles. </p>
<h2 id="installation"><a href="#installation" 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>Instalação </h2>
<h3 id="react"><a href="#react" 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>React </h3>
<p>O React v16.8.0 está disponível no registro do npm.</p>
<p>Para instalar o React 16 com o Yarn, execute:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token function">yarn</span> <span class="token function">add</span> react@^16.8.0 react-dom@^16.8.0</code></pre></div>
<p>Para instalar o React 16 com o npm, execute:</p>
<div class="gatsby-highlight" data-language="bash"><pre class="gatsby-code-bash"><code class="gatsby-code-bash"><span class="token function">npm</span> <span class="token function">install</span> --save react@^16.8.0 react-dom@^16.8.0</code></pre></div>
<p>Nós também fornecemos compilações UMD do React via CDN:</p>
<div class="gatsby-highlight" data-language="html"><pre class="gatsby-code-html"><code class="gatsby-code-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">crossorigin</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://unpkg.com/react@16/umd/react.production.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>script</span> <span class="token attr-name">crossorigin</span> <span class="token attr-name">src</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://unpkg.com/react-dom@16/umd/react-dom.production.min.js<span class="token punctuation">"</span></span><span class="token punctuation">></span></span><span class="token script"></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>script</span><span class="token punctuation">></span></span></code></pre></div>
<p>Consulte a documentação para <a href="/docs/installation.html">instruções de instalações detalhadas</a>.</p>
<h3 id="eslint-plugin-for-react-hooks"><a href="#eslint-plugin-for-react-hooks" 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>Extensão ESLint para o React Hooks </h3>
<blockquote>
<p>Observação</p>
<p>Como mencionado acima, nós recomendamos severamente o uso da regra do <code class="gatsby-code-text">eslint-plugin-react-hooks</code>.</p>
<p>Se você está usando o Create React App, ao invéz da configuração manual do ESLint, você pode aguardar pela próxima versão do <code class="gatsby-code-text">react-scrips</code>, qual será lançada em breve e irá incluir esta regra.</p>
</blockquote>
<p>Assumindo que você já possui o ESLint instalado, excute:</p>
<div class="gatsby-highlight" data-language="sh"><pre class="gatsby-code-sh"><code class="gatsby-code-sh"># npm
npm install eslint-plugin-react-hooks --save-dev

# yarn
yarn add eslint-plugin-react-hooks --dev</code></pre></div>
<p>Então adicione em suas confugações do ESLint:</p>
<div class="gatsby-highlight" data-language="jsx"><pre class="gatsby-code-jsx"><code class="gatsby-code-jsx"><span class="token punctuation">{</span>
  <span class="token string">"plugins"</span><span class="token operator">:</span> <span class="token punctuation">[</span>
    <span class="token comment">// ...</span>
    <span class="token string">"react-hooks"</span>
  <span class="token punctuation">]</span><span class="token punctuation">,</span>
  <span class="token string">"rules"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token comment">// ...</span>
    <span class="token string">"react-hooks/rules-of-hooks"</span><span class="token operator">:</span> <span class="token string">"error"</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre></div>
<h2 id="changelog"><a href="#changelog" 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>Histórico de Mudanças </h2>
<h3 id="react-1"><a href="#react-1" 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>React </h3>
<ul>
<li>Adiciona <a href="https://reactjs.org/docs/hooks-intro.html" target="_blank" rel="nofollow noopener noreferrer">Hooks</a> — uma forma de utilizar estado e outras funcionalidades do React sem escrever uma classe. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> et al. em <a href="https://github.com/facebook/react/pull/13968" target="_blank" rel="nofollow noopener noreferrer">#13968</a>)</li>
<li>Aperfeiçoamento da API de inicialização lenta (lazy initialization) do Hook <code class="gatsby-code-text">useReducer</code>. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/14723" target="_blank" rel="nofollow noopener noreferrer">#14723</a>)</li>
</ul>
<h3 id="react-dom"><a href="#react-dom" 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>React DOM </h3>
<ul>
<li>Evita renderização de valores identicos nos Hooks <code class="gatsby-code-text">useState</code> e <code class="gatsby-code-text">useReducer</code>. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/14569" target="_blank" rel="nofollow noopener noreferrer">#14569</a>)</li>
<li>Não compare o primeiro argumento passado aos Hooks <code class="gatsby-code-text">useEffect</code>/<code class="gatsby-code-text">useMemo</code>/<code class="gatsby-code-text">useCallback</code>. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/14594" target="_blank" rel="nofollow noopener noreferrer">#14594</a>)</li>
<li>Utilização do algortimo <code class="gatsby-code-text">Object.is</code> para comparação dos valores de <code class="gatsby-code-text">useState</code> e <code class="gatsby-code-text">useReducer</code>. (<a href="https://github.com/Jessidhia" target="_blank" rel="nofollow noopener noreferrer">@Jessidhia</a> em <a href="https://github.com/facebook/react/pull/14752" target="_blank" rel="nofollow noopener noreferrer">#14752</a>)</li>
<li>Suporte síncrono aos thenables passados para <code class="gatsby-code-text">React.lazy()</code>. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/14626" target="_blank" rel="nofollow noopener noreferrer">#14626</a>)</li>
<li>Renderiza os componentes com Hooks duas vezes no Modo Estrito (Strict Mode) - apenas DEV, para combinar o comportamento de classe. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/14654" target="_blank" rel="nofollow noopener noreferrer">#14654</a>)</li>
<li>Aviso sobre a incompatibilidade do Hooks quanto ao desenvolvimento. (<a href="https://github.com/threepointone" target="_blank" rel="nofollow noopener noreferrer">@threepointone</a> em <a href="https://github.com/facebook/react/pull/14585" target="_blank" rel="nofollow noopener noreferrer">#14585</a> e <a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/14591" target="_blank" rel="nofollow noopener noreferrer">#14591</a>)</li>
<li>As funções de limpeza de resultados devem retornar <code class="gatsby-code-text">undefined</code> ou uma função. Todos os outros valores, incluindo <code class="gatsby-code-text">null</code>, não são permitidos. <a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/14119" target="_blank" rel="nofollow noopener noreferrer">#14119</a></li>
</ul>
<h3 id="react-test-renderer"><a href="#react-test-renderer" 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>Renderizador de Teste React </h3>
<ul>
<li>Suporte para Hooks no renderizador superficial (Shallow Renderer). (<a href="https://github.com/trueadm" target="_blank" rel="nofollow noopener noreferrer">@trueadm</a> em <a href="https://github.com/facebook/react/pull/14567" target="_blank" rel="nofollow noopener noreferrer">#14567</a>)</li>
<li>Correção do estado do <code class="gatsby-code-text">shouldComponentUpdate</code> junto ao <code class="gatsby-code-text">getDerivedStateFromProps</code> ao renderizador superficial (Shallow Renderer). (<a href="https://github.com/chenesan" target="_blank" rel="nofollow noopener noreferrer">@chenesan</a> em <a href="https://github.com/facebook/react/pull/14613" target="_blank" rel="nofollow noopener noreferrer">#14613</a>)</li>
<li>Adiciona <code class="gatsby-code-text">ReactTestRenderer.act()</code> e <code class="gatsby-code-text">ReactTestUtils.act()</code> para atualizações em lote a fim de que testes sejam executados de forma mais semelhante ao comportamento real. (<a href="https://github.com/threepointone" target="_blank" rel="nofollow noopener noreferrer">@threepointone</a> em <a href="https://github.com/facebook/react/pull/14744" target="_blank" rel="nofollow noopener noreferrer">#14744</a>)</li>
</ul>
<h3 id="eslint-plugin-react-hooks"><a href="#eslint-plugin-react-hooks" 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>Extensão ESLint: React Hooks </h3>
<ul>
<li><a href="https://www.npmjs.com/package/eslint-plugin-react-hooks" target="_blank" rel="nofollow noopener noreferrer">Lançamento</a> inicial. (<a href="https://github.com/calebmer" target="_blank" rel="nofollow noopener noreferrer">@calebmer</a> em <a href="https://github.com/facebook/react/pull/13968" target="_blank" rel="nofollow noopener noreferrer">#13968</a>)</li>
<li>Correção do relatório após encontrar ciclo. (<a href="https://github.com/calebmer" target="_blank" rel="nofollow noopener noreferrer">@calebmer</a> e <a href="https://github.com/Yurickh" target="_blank" rel="nofollow noopener noreferrer">@Yurickh</a> em <a href="https://github.com/facebook/react/pull/14661" target="_blank" rel="nofollow noopener noreferrer">#14661</a>)</li>
<li>Não considere lançamento de exceção como uma violação de regra. (<a href="https://github.com/sophiebits" target="_blank" rel="nofollow noopener noreferrer">@sophiebits</a> em <a href="https://github.com/facebook/react/pull/14040" target="_blank" rel="nofollow noopener noreferrer">#14040</a>)</li>
</ul>
<h2 id="hooks-changelog-since-alpha-versions"><a href="#hooks-changelog-since-alpha-versions" 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>Histórico de mudanças do Hooks desde a versão alpha </h2>
<p>O histórico de mudanças acima contém todas as mudanças notáveis, desde a nossa última versão <strong>estável</strong> (16.7.0). <a href="/docs/faq-versioning.html">Assim como, todos o nossos lançamentos secundários</a>, não interrompe a compatibilidade com as versões anteriores.</p>
<p>Se você está utilizando Hooks da versão alpha do React, observe que esta versão contêm algumas pequenas mudanças, que causa instabilidade ao Hooks. <strong>Nós não recomendamos a dependência da versão alpha em código de produção.</strong> Nós publicamos versões alpha para realizar mudanças com base na opinião da comunidade, antes da versão estável da API.</p>
<p>Aqui estão todas as mudanças radicais do Hooks, quais foram feitas desde a primeira versão alpha:</p>
<ul>
<li>Remove <code class="gatsby-code-text">useMutationEffect</code>. (<a href="https://github.com/sophiebits" target="_blank" rel="nofollow noopener noreferrer">@sophiebits</a> em <a href="https://github.com/facebook/react/pull/14336" target="_blank" rel="nofollow noopener noreferrer">#14336</a>)</li>
<li>Renomeia <code class="gatsby-code-text">useImperativeMethods</code> para <code class="gatsby-code-text">useImperativeHandle</code>. (<a href="https://github.com/threepointone" target="_blank" rel="nofollow noopener noreferrer">@threepointone</a> em <a href="https://github.com/facebook/react/pull/14565" target="_blank" rel="nofollow noopener noreferrer">#14565</a>)</li>
<li>Evita renderização de valores idênticos nos Hooks <code class="gatsby-code-text">useState</code> e <code class="gatsby-code-text">useReducer</code>. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/14569" target="_blank" rel="nofollow noopener noreferrer">#14569</a>)</li>
<li>Não compare o primeiro argumento passado aos Hooks <code class="gatsby-code-text">useEffect</code>/<code class="gatsby-code-text">useMemo</code>/<code class="gatsby-code-text">useCallback</code>. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/14594" target="_blank" rel="nofollow noopener noreferrer">#14594</a>)</li>
<li>Utilização do algortimo <code class="gatsby-code-text">Object.is</code> para comparação dos valores de <code class="gatsby-code-text">useState</code> e <code class="gatsby-code-text">useReducer</code>. (<a href="https://github.com/Jessidhia" target="_blank" rel="nofollow noopener noreferrer">@Jessidhia</a> em <a href="https://github.com/facebook/react/pull/14752" target="_blank" rel="nofollow noopener noreferrer">#14752</a>)</li>
<li>Renderiza os componentes com Hooks duas vezes no Modo Estrito (Strict Mode) - apenas DEV. (<a href="https://github.com/gaearon" target="_blank" rel="nofollow noopener noreferrer">@gaearon</a> em <a href="https://github.com/facebook/react/pull/14654" target="_blank" rel="nofollow noopener noreferrer">#14654</a>)</li>
<li>Aperfeiçoamento da API de inicialização lenta (lazy initialization) do Hook <code class="gatsby-code-text">useReducer</code>. (<a href="https://github.com/acdlite" target="_blank" rel="nofollow noopener noreferrer">@acdlite</a> em <a href="https://github.com/facebook/react/pull/14723" target="_blank" rel="nofollow noopener noreferrer">#14723</a>)</li>
</ul>]]></description><link>https://pt-br.reactjs.org/blog/2019/02/06/react-v16.8.0.html</link><guid isPermaLink="false">https://pt-br.reactjs.org/blog/2019/02/06/react-v16.8.0.html</guid><pubDate>Wed, 06 Feb 2019 00:00:00 GMT</pubDate></item></channel></rss>