{"componentChunkName":"component---src-templates-blog-js","path":"/blog/2020/08/10/react-v17-rc.html","result":{"data":{"markdownRemark":{"html":"<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<p>Portanto, queríamos oferecer outra opção.</p>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<blockquote>\n<p>Nota</p>\n<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>\n</blockquote>\n<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>\n<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>\n<p>Nos componentes React, você geralmente escreve manipuladores de eventos (event handler) inline:</p>\n<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>\n<p>O DOM vanilla equivalente a este código é semelhante à:</p>\n<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>\n<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>\n<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>\n<p>No entanto, esse é um problema para atualizações graduais.</p>\n<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>\n<p>É por isso que estamos mudando a forma como o React anexa eventos ao DOM nos bastidores.</p>\n<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>\n<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>\nReactDOM<span class=\"token punctuation\">.</span><span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">App</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">,</span> rootNode<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<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>\n<p>\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/bb4b10114882a50090b8ff61b3c4d0fd/31868/react_17_delegation.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 840px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      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;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"Um diagrama mostrando como o React 17 anexa eventos às raízes em vez de anexar ao documento\"\n        title=\"\"\n        src=\"/static/bb4b10114882a50090b8ff61b3c4d0fd/1e088/react_17_delegation.png\"\n        srcset=\"/static/bb4b10114882a50090b8ff61b3c4d0fd/65ed1/react_17_delegation.png 210w,\n/static/bb4b10114882a50090b8ff61b3c4d0fd/d10fb/react_17_delegation.png 420w,\n/static/bb4b10114882a50090b8ff61b3c4d0fd/1e088/react_17_delegation.png 840w,\n/static/bb4b10114882a50090b8ff61b3c4d0fd/78612/react_17_delegation.png 1260w,\n/static/bb4b10114882a50090b8ff61b3c4d0fd/21cdd/react_17_delegation.png 1680w,\n/static/bb4b10114882a50090b8ff61b3c4d0fd/31868/react_17_delegation.png 3496w\"\n        sizes=\"(max-width: 840px) 100vw, 840px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </p>\n<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>\n<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>\n<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>\n<blockquote>\n<p>Nota</p>\n<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>\n</blockquote>\n<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>\n<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>\n<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>\n<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>\n  <span class=\"token comment\">// Este manipulador personalizado não receberá mais cliques</span>\n  <span class=\"token comment\">// dos componentes React que chamaram e.stopPropagation()</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<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>\n<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>\n  <span class=\"token comment\">// Agora este event handlers usa a fase de captura</span>\n  <span class=\"token comment\">// então ele recebe *todas* os eventos de clique abaixo!</span>\n<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>\n<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>\n<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>\n<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>\n<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>\n<p>Fizemos algumas alterações menores relacionadas ao sistema de eventos:</p>\n<ul>\n<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>\n<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>\n<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>\n</ul>\n<p>Essas mudanças alinham o React mais de perto com o comportamento do navegador e melhoram a interoperabilidade.</p>\n<blockquote>\n<p>Nota</p>\n<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>\n</blockquote>\n<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>\n<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>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">handleChange</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">e</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <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>\n    <span class=\"token operator\">...</span>data<span class=\"token punctuation\">,</span>\n    <span class=\"token comment\">// Isso trava no React 16 e anteriores:</span>\n    text<span class=\"token operator\">:</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<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>\n<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>\n<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>\n<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>\n<p>Estamos tornando o tempo da função de limpeza <code class=\"gatsby-code-text\">useEffect</code> mais consistente.</p>\n<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>\n  <span class=\"token comment\">// Este é o próprio Effect.</span>\n<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>\n<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>\n<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>\n<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>\n<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>\n<blockquote>\n<p>Nota</p>\n<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>\n</blockquote>\n<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>\n<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>\n<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>\n<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>\n  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>\n  <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>\n    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>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<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>\n<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>\n  <span class=\"token keyword\">const</span> instance <span class=\"token operator\">=</span> someRef<span class=\"token punctuation\">.</span>current<span class=\"token punctuation\">;</span>\n  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>\n  <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>\n    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>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<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>\n<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>\n<p>No React 16 e anteriores, retornar <code class=\"gatsby-code-text\">undefined</code> sempre foi um erro:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">Button</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// Erro: nada foi retornado da renderização</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Isso ocorre em parte porque é fácil retornar <code class=\"gatsby-code-text\">undefined</code> involuntariamente:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">Button</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Esquecemos de escrever return, então este componente retorna indefinido.</span>\n  <span class=\"token comment\">// React mostra isso como um erro em vez de ignorá-lo.</span>\n  <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>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<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>\n<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>\n<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>\n  <span class=\"token comment\">// Esquecemos de escrever return, então este componente retorna indefinido.</span>\n  <span class=\"token comment\">// React 17 mostra isso como um erro em vez de ignorá-lo.</span>\n  <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>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<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>\n  <span class=\"token comment\">// Esquecemos de escrever return, então este componente retorna indefinido.</span>\n  <span class=\"token comment\">// React 17 mostra isso como um erro em vez de ignorá-lo.</span>\n  <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>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Para os casos em que você não deseja renderizar nada intencionalmente, retorne <code class=\"gatsby-code-text\">null</code>.</p>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<p>Para instalar o React 17 RC com npm, execute:</p>\n<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>\n<p>Para instalar o React 17 RC com Yarn, execute:</p>\n<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>\n<p>Também fornecemos compilações UMD do React por meio de um CDN:</p>\n<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>\n<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>\n<p>Consulte a documentação para <a href=\"/docs/installation.html\">instruções de instalação detalhadas</a>.</p>\n<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>\n<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>\n<ul>\n<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>\n<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>\n<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>\n<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>\n<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>\n</ul>\n<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>\n<ul>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n</ul>\n<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>\n<ul>\n<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>\n<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>\n</ul>\n<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>\n<ul>\n<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>\n</ul>\n<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>\n<ul>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n<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>\n</ul>","excerpt":"Hoje, estamos publicando o primeiro candidato à lançamento do React 17. Já se passaram dois anos e meio desde o principal lançamento anterior do React, 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. Sem novas funcionalidades  A versão React 17 é incomum porque não adiciona nenhum novo recurso voltado para o desenvolvedor. Em vez disso, esta…","frontmatter":{"title":"React v17.0 Candidato à lançamento: Sem novas funcionalidades","next":null,"prev":null,"author":[{"frontmatter":{"name":"Dan Abramov","url":"https://twitter.com/dan_abramov"}},{"frontmatter":{"name":"Rachel Nabors","url":"https://twitter.com/rachelnabors"}}]},"fields":{"date":"10 de agosto de 2020","path":"content/blog/2020-08-10-react-v17-rc.md","slug":"/blog/2020/08/10/react-v17-rc.html"}},"allMarkdownRemark":{"edges":[{"node":{"frontmatter":{"title":"React v17.0"},"fields":{"slug":"/blog/2020/10/20/react-v17.html"}}},{"node":{"frontmatter":{"title":"Apresentando o novo JSX Transform"},"fields":{"slug":"/blog/2020/09/22/introducing-the-new-jsx-transform.html"}}},{"node":{"frontmatter":{"title":"React v17.0 Candidato à lançamento: Sem novas funcionalidades"},"fields":{"slug":"/blog/2020/08/10/react-v17-rc.html"}}},{"node":{"frontmatter":{"title":"React v16.13.0"},"fields":{"slug":"/blog/2020/02/26/react-v16.13.0.html"}}},{"node":{"frontmatter":{"title":"Construindo Ótimas Experiências de Usuário com Modo Concorrente e Suspense"},"fields":{"slug":"/blog/2019/11/06/building-great-user-experiences-with-concurrent-mode-and-suspense.html"}}},{"node":{"frontmatter":{"title":"Preparando para o Futuro com as Prereleases React"},"fields":{"slug":"/blog/2019/10/22/react-release-channels.html"}}},{"node":{"frontmatter":{"title":"Apresentando o novo React DevTools"},"fields":{"slug":"/blog/2019/08/15/new-react-devtools.html"}}},{"node":{"frontmatter":{"title":"React v16.9.0 e a atualização do Roadmap"},"fields":{"slug":"/blog/2019/08/08/react-v16.9.0.html"}}},{"node":{"frontmatter":{"title":"O React já esta traduzido? ¡Sí! Sim! はい！"},"fields":{"slug":"/blog/2019/02/23/is-react-translated-yet.html"}}},{"node":{"frontmatter":{"title":"React v16.8: O React com Hooks"},"fields":{"slug":"/blog/2019/02/06/react-v16.8.0.html"}}}]}},"pageContext":{"slug":"/blog/2020/08/10/react-v17-rc.html"}},"staticQueryHashes":[]}