{"componentChunkName":"component---src-templates-blog-js","path":"/blog/2016/11/16/react-v15.4.0.html","result":{"data":{"markdownRemark":{"html":"<p>Hoje nós estamos lançando React 15.4.0.</p>\n<p>Nós não anunciamos os <a href=\"https://github.com/facebook/react/blob/master/CHANGELOG.md#1530-july-29-2016\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">lançamentos</a> <a href=\"https://github.com/facebook/react/blob/master/CHANGELOG.md#1520-july-1-2016\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">menores</a> <a href=\"https://github.com/facebook/react/blob/master/CHANGELOG.md#1510-may-20-2016\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">anteriores</a> no blog porque a maioria das alterações foram correções de bugs. Entretanto, 15.4.0 é uma versão especial, e nós gostaríamos de destacar algumas mudanças notáveis.</p>\n<h3 id=\"separating-react-and-react-dom\"><a href=\"#separating-react-and-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>Separando React e React DOM </h3>\n<p><a href=\"/blog/2015/09/10/react-v0.14-rc1.html#two-packages-react-and-react-dom\">Há mais de um ano atrás</a>, nós começamos a separar o React e React DOM em pacotes separados. Nós descontinuamos o <code class=\"gatsby-code-text\">React.render()</code> a favor do <code class=\"gatsby-code-text\">ReactDOM.render()</code> no React 0.14, e removemos APIs específicas do DOM do <code class=\"gatsby-code-text\">React</code> completamente no React 15. Entretanto, a implementação do React DOM ainda <a href=\"(https://www.reddit.com/r/javascript/comments/3m6wyu/found_this_line_in_the_react_codebase_made_me/cvcyo4a/)\">viveu secretamente dentro do pacote do React</a>.</p>\n<p>No React 15.4.0, nós estamos finalmente movendo a implementação do React DOM para o pacote do React DOM. O pacote do React agora irá conter apenas o código “renderer-agnostic” tal como <code class=\"gatsby-code-text\">React.Component</code> e <code class=\"gatsby-code-text\">React.createElement()</code>.’</p>\n<p>Isso resolve algumas questões de longa data, tais como <a href=\"https://github.com/facebook/react/issues/7386\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">erros</a> quando você importa o React DOM no mesmo arquivo que o renderizador do  <a href=\"(https://facebook.github.io/jest/blog/2016/07/27/jest-14.html)\">teste snapshot</a>.</p>\n<p><strong>Se você utilizar apenas as APIs oficiais e documentadas do React você não precisará mudar nada na sua aplicação.</strong></p>\n<p>Entretanto, existe uma possibilidade de você ter importado APIs privadas de <code class=\"gatsby-code-text\">react/lib/*</code>, ou que um pacote que você confia usá-las. Gostaríamos de lembrar que isso nunca foi suportado, e que as suas aplicações não devem confiar em APIs internas. As partes internas do React irão continuar mudando conforme nós trabalhamos para melhorar o React.</p>\n<p>Outra coisa a observar é que o React DOM Server agora tem o mesmo tamanho que o React DOM uma vez que ele contém a própria cópia do React reconciler. Nós não recomendamos usar React DOM Server no lado do cliente na maioria dos casos. </p>\n<h3 id=\"profiling-components-with-chrome-timeline\"><a href=\"#profiling-components-with-chrome-timeline\" 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>Perfilizando Componentes com a Timeline do Chrome </h3>\n<p>Agora você pode visualizar os componentes React na Timeline do Chrome. Isso permite que você veja exatamente quais componentes são montados, atualizados, e desmontados e quanto tempo eles levam em relação aos outros.</p>\n\n  <a class=\"gatsby-resp-image-link\" href=\"/static/64d522b74fb585f1abada9801f85fa9d/1ac66/react-perf-chrome-timeline.png\" style=\"display: block\" target=\"_blank\" rel=\"noopener\">\n  \n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block;  max-width: 651px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 35.23809523809524%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsSAAALEgHS3X78AAABYUlEQVQY022NeUsCURTF5yMG0aaZSgniMtqCEfQlgoowqCCoRDNIs+gfdVTMJa3JbdRyaROHyXJ0xuc47zVqC0Rw7uHec/lxsPeqmyJ0WT+e8xspwli+wp9ipnZ+QRJHzfP3y3RyPeXAMycm0oEXXeayx/zmXWIDliZhwXgmHzuQxQ+VKefcg0db9+kaQT1D6Gm/vu7V0gEzW7JVLxTF45Gya4wLyoSwvBOaAqFJEBrHel2+Gt1PnGqj9onIkTx3pqLcyrxbVfdrGsFZJowLbKlbcHK32+BmAyTXAGntkFZAboH0LgYhRBCKIAUYX9JmiO0pSLsm7pzJeNSVy2k6toKgAIcSOVFgYY+DQguKvJT34T4tGULP6R3KO0pTm48Rw8v1In23ytWcUg6//mhg6OtACBtuUrfkzdd44VzdqkXZSuijTIB6QuSYbxj+YH/hfiKNwPN0Vuy2ByUQoV/mX/gTU11epAmedTIAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;\">\n      <img class=\"gatsby-resp-image-image\" style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\" alt=\"React components in Chrome timeline\" title src=\"/static/64d522b74fb585f1abada9801f85fa9d/1ac66/react-perf-chrome-timeline.png\" srcset=\"/static/64d522b74fb585f1abada9801f85fa9d/65ed1/react-perf-chrome-timeline.png 210w,\n/static/64d522b74fb585f1abada9801f85fa9d/d10fb/react-perf-chrome-timeline.png 420w,\n/static/64d522b74fb585f1abada9801f85fa9d/1ac66/react-perf-chrome-timeline.png 651w\" sizes=\"(max-width: 651px) 100vw, 651px\">\n    </span>\n  </span>\n  \n  </a>\n    \n<p>Para usá-lo:</p>\n<ol>\n<li>Carregue sua aplicação com <code class=\"gatsby-code-text\">?react_perf</code> na query string (por exemplo, <code class=\"gatsby-code-text\">http://localhost:3000/?react_perf</code>)</li>\n<li>Abra a aba <strong>Timeline</strong> no Chrome DevTools e pressione <strong>Gravar</strong>.</li>\n<li>Execute as ações que você deseja perfilizar. Não grave mais de 20 segundos ou o Chrome poderá travar.</li>\n<li>Pare de gravar.</li>\n<li>Os eventos do React serão agrupados debaixo do campo <strong>Tempo do Usuário</strong></li>\n</ol>\n<p>Perceba que os números são relativos então os componentes irão renderizar mais rápido em produção. Ainda assim, isso deve ajudar você a perceber quando a UI não relacionada é atualizada por um erro, quão profundas e com qual frequência as atualizações da sua UI ocorrem.</p>\n<p>Atualmente o Chrome, Edge, e o IE são os únicos navegadores dando suporte à essa funcionalidade, mas nós utilizamos a <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/User_Timing_API\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">API de Tempo de Usuário</a> padrão, então nós esperamos que mais browsers dêem suporte à ela.</p>\n<h3 id=\"mocking-refs-for-snapshot-testing\"><a href=\"#mocking-refs-for-snapshot-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>Simulando Referências para Testes Snapshot </h3>\n<p>Se você está usando Jest <a href=\"https://facebook.github.io/jest/blog/2016/07/27/jest-14.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">testes snapshot</a>, você pode ter tido <a href=\"https://github.com/facebook/react/issues/7371\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">problemas</a> com componentes que dependem de referências. Com React 15.4.0, nós introduzimos uma maneira para prover simulações de referências para o renderizador de testes. Por exemplo, considere esse componente usando uma referência em <code class=\"gatsby-code-text\">componentDidMount</code>:</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 keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">default</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">MyInput</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>\n  <span class=\"token function\">componentDidMount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>input<span class=\"token punctuation\">.</span><span class=\"token function\">focus</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span>\n<span class=\"gatsby-highlight-code-line\">        <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><span class=\"token parameter\">node</span> <span class=\"token operator\">=></span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>input <span class=\"token operator\">=</span> node<span class=\"token punctuation\">}</span></span></span>      <span class=\"token punctuation\">/></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Com o renderizador de teste snapshot, <code class=\"gatsby-code-text\">this.input</code> será <code class=\"gatsby-code-text\">null</code> porque não tem o DOM. React 15.4.0 nos permite evitar tais falhas passando uma função <code class=\"gatsby-code-text\">createNodeMock</code> customizada para o renderizador do teste snapshot no argumento <code class=\"gatsby-code-text\">options</code>:</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 keyword\">import</span> React <span class=\"token keyword\">from</span> <span class=\"token string\">'react'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> MyInput <span class=\"token keyword\">from</span> <span class=\"token string\">'./MyInput'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> renderer <span class=\"token keyword\">from</span> <span class=\"token string\">'react-test-renderer'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"gatsby-highlight-code-line\"><span class=\"token keyword\">function</span> <span class=\"token function\">createNodeMock</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">element</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>element<span class=\"token punctuation\">.</span>type <span class=\"token operator\">===</span> <span class=\"token string\">'input'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">      <span class=\"token function\">focus</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><span class=\"gatsby-highlight-code-line\">    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token punctuation\">}</span></span><span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">return</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token punctuation\">}</span></span>\n<span class=\"token function\">it</span><span class=\"token punctuation\">(</span><span class=\"token string\">'renders correctly'</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> options <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>createNodeMock<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">const</span> tree <span class=\"token operator\">=</span> renderer<span class=\"token punctuation\">.</span><span class=\"token function\">create</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\">MyInput</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token punctuation\">,</span> options<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>  <span class=\"token function\">expect</span><span class=\"token punctuation\">(</span>tree<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">toMatchSnapshot</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><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Nós gostaríamos de agradecer à <a href=\"https://github.com/Aweary\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Brandon Dail</a> por implementar esse recurso.</p>\n<p>Você pode aprender mais sobre testes snapshot <a href=\"https://facebook.github.io/jest/blog/2016/07/27/jest-14.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">nesse post no blog do Jest</a>.</p>\n<hr>\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>Nós recomendamos utilizar <a href=\"https://yarnpkg.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Yarn</a> ou <a href=\"https://www.npmjs.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">npm</a> para gerenciar as dependências do front-end. Se você é novo nos gerenciadores de pacotes, a <a href=\"https://yarnpkg.com/en/docs/getting-started\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">documentação do Yarn</a> é um bom lugar para começar.</p>\n<p>Para instalar React com Yarn, rode:</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@15.4.0 react-dom@15.4.0</code></pre></div>\n<p>Para instalar React com npm, rode:</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> --save react@15.4.0 react-dom@15.4.0</code></pre></div>\n<p>Nós recomendamos o uso de um bundler como o <a href=\"https://webpack.js.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">webpack</a> ou <a href=\"http://browserify.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Browserify</a> para que você possa escrever código modular e empacotá-lo em pequenos pacotes para otimizar o tempo de carregamento.</p>\n<p>Lembre-se de que por padrão, o React executa verificações extras e fornece avisos úteis no modo de desenvolvimento. Quando publicar sua aplicação, tenha certeza de <a href=\"/docs/installation.html#development-and-production-versions\">compilá-lo em modo de produção</a>.</p>\n<p>Caso você não utilize um bundler, nós também fornecemos bundlers pré-buildados nos pacotes npm que você pode <a href=\"/docs/installation.html#using-a-cdn\">incluir como tags de script</a> na sua página:</p>\n<ul>\n<li><strong>React</strong><br>\nCompilação de desenvolvimento com avisos: <a href=\"https://unpkg.com/react@15.4.0/dist/react.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react/dist/react.js</a>\nCompilação minificada para produção: <a href=\"https://unpkg.com/react@15.4.0/dist/react.min.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react/dist/react.min.js</a></li>\n<li><strong>React com Add-Ons</strong><br>\nCompilação de desenvolvimento com avisos: <a href=\"https://unpkg.com/react@15.4.0/dist/react-with-addons.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react/dist/react-with-addons.js</a>\nCompilação minificada para produção: <a href=\"https://unpkg.com/react@15.4.0/dist/react-with-addons.min.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react/dist/react-with-addons.min.js</a></li>\n<li><strong>React DOM</strong> (incluir React na página antes do React DOM)<br>\nCompilação de desenvolvimento com avisos: <a href=\"https://unpkg.com/react-dom@15.4.0/dist/react-dom.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react-dom/dist/react-dom.js</a><br>\nCompilação minificada para produção: <a href=\"https://unpkg.com/react-dom@15.4.0/dist/react-dom.min.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react-dom/dist/react-dom.min.js</a>  </li>\n<li><strong>React DOM Server</strong> (incluir React na página antes do React DOM Server)<br>\nCompilação de desenvolvimento com avisos: <a href=\"https://unpkg.com/react-dom@15.4.0/dist/react-dom-server.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react-dom/dist/react-dom-server.js</a><br>\nCompilação minificada para produção: <a href=\"https://unpkg.com/react-dom@15.4.0/dist/react-dom-server.min.js\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">react-dom/dist/react-dom-server.min.js</a></li>\n</ul>\n<p>Também publicamos a versão <code class=\"gatsby-code-text\">15.4.0</code> do <code class=\"gatsby-code-text\">react</code>, <code class=\"gatsby-code-text\">react-dom</code>, e pacotes addons no npm e no pacote do <code class=\"gatsby-code-text\">react</code> no bower.</p>\n<hr>\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>Pacote do React e compilação do browser </li>\n<li>O pacote do React e a compilação do navegador não incluem mais “secretamente” o React DOM.\n<small>(<a href=\"https://github.com/sebmarkbage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@sebmarkbage</a> em <a href=\"https://github.com/facebook/react/pull/7164\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7164</a> e <a href=\"https://github.com/facebook/react/pull/7168\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7168</a>)</small> </li>\n<li>PropTypes necessárias agora falham com mensagens específicas para null e undefined.\n<small>(<a href=\"https://github.com/chenglou\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@chenglou</a> em <a href=\"https://github.com/facebook/react/pull/7291\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7291</a>)</small></li>\n<li>Melhor performance de desenvolvimento congelando elementos filhos ao invés de copiar.\n<small>(<a href=\"https://github.com/keyanzhang\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@keyanzhang</a> em <a href=\"https://github.com/facebook/react/pull/7455\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7455</a>)</small></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>Corrigidas falhas ocasionais de testes quando o React DOM é utilizado em conjunto com o renderizador superficial.\n<small>(<a href=\"https://github.com/goatslacker\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@goatslacker</a> em <a href=\"https://github.com/facebook/react/pull/8097\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#8097</a>)</small></li>\n<li>Adicionado um aviso para atributos <code class=\"gatsby-code-text\">aria-</code> inválidos.<br>\n<small>(<a href=\"https://github.com/jessebeach\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@jessebeach</a> em <a href=\"https://github.com/facebook/react/pull/7744\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7744</a>)</small></li>\n<li>Adicionado um aviso para usar <code class=\"gatsby-code-text\">autofocus</code> ao invés de <code class=\"gatsby-code-text\">autoFocus</code><br>\n<small>(<a href=\"https://github.com/hkal\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@hkal</a> em <a href=\"https://github.com/facebook/react/pull/7694\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7694</a>)</small></li>\n<li>Removido todos os avisos desnecessários sobre “polyfilling” <code class=\"gatsby-code-text\">String.prototype.splite</code>Removed an unnecessary warning about polyfilling <code class=\"gatsby-code-text\">String.prototype.split</code>.<br>\n<small>(<a href=\"https://github.com/nhunzaker\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@nhunzaker</a> em <a href=\"https://github.com/facebook/react/pull/7629\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7629</a>)</small></li>\n<li>Aviso esclarecido sobre não chamar PropTypes manualmente.<br>\n<small>(<a href=\"https://github.com/jedwards1211\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@jedwards1211</a> in <a href=\"https://github.com/facebook/react/pull/7777\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7777</a>)</small></li>\n<li>A API instável <code class=\"gatsby-code-text\">batchedUpdates</code> agora passa o valor de retorno através da função empacotada.\n<small>(<a href=\"https://github.com/bgnorlov\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@bgnorlov</a> em <a href=\"https://github.com/facebook/react/pull/7444\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7444</a>)</small></li>\n<li>Corrigido um bug ao atualizar um texto no IE 8.\n<small>(<a href=\"https://github.com/mnpenner\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@mnpenner</a> em <a href=\"https://github.com/facebook/react/pull/7832\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7832</a>)</small></li>\n</ul>\n<h3 id=\"react-perf\"><a href=\"#react-perf\" 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 Perf </h3>\n<ul>\n<li>Quando o ReactPerf é iniciado, agora você pode visualizar o tempo relativo gasto em componentes na forma de um gráfico na linha do tempo do Chrome.\n<small>(<a href=\"https://github.com/gaearon\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@gaearon</a> em <a href=\"https://github.com/facebook/react/pull/7549\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7549</a>)</small></li>\n</ul>\n<h3 id=\"react-test-utils\"><a href=\"#react-test-utils\" 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 Utils </h3>\n<ul>\n<li>Se você chamar <code class=\"gatsby-code-text\">Simulate.click()</code> em um <code class=\"gatsby-code-text\">&lt;input disabled onClick={foo} /&gt;</code> então <code class=\"gatsby-code-text\">foo</code> será chamado ao contrário de antes.\n<small>(<a href=\"https://github.com/nhunzaker\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@nhunzaker</a> em <a href=\"https://github.com/facebook/react/pull/7642\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7642</a>)</small></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>React Test Renderer </h3>\n<ul>\n<li>Devido a alterações no empacotamento, ele não trava mais quando é importado junto com o React DOM no mesmo arquivo.\n<small>(<a href=\"https://github.com/sebmarkbage\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@sebmarkbage</a> em <a href=\"https://github.com/facebook/react/pull/7164\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7164</a> e <a href=\"https://github.com/facebook/react/pull/7168\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7168</a>)</small></li>\n<li><code class=\"gatsby-code-text\">ReactTestRenderer.create()</code> agora aceita <code class=\"gatsby-code-text\">{createNodeMock: element =&gt; mock}</code> como um argumento opcional então você pode simular referências com os testes snapshot.\n<small>(<a href=\"https://github.com/Aweary\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">@Aweary</a> em <a href=\"https://github.com/facebook/react/pull/7649\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#7649</a> e <a href=\"https://github.com/facebook/react/pull/8261\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">#8261</a>)</small></li>\n</ul>","excerpt":"Hoje nós estamos lançando React 15.4.0. Nós não anunciamos os lançamentos menores anteriores no blog porque a maioria das alterações foram correções de bugs. Entretanto, 15.4.0 é uma versão especial, e nós gostaríamos de destacar algumas mudanças notáveis. Separando React e React DOM  Há mais de um ano atrás, nós começamos a separar o React e React DOM em pacotes separados. Nós descontinuamos o  a favor do  no React 0.14, e removemos APIs específicas do DOM do  completamente no React 1…","frontmatter":{"title":"React v15.4.0","next":null,"prev":null,"author":[{"frontmatter":{"name":"Dan Abramov","url":"https://twitter.com/dan_abramov"}}]},"fields":{"date":"16 de novembro de 2016","path":"content/blog/2016-11-16-react-v15.4.0.md","slug":"/blog/2016/11/16/react-v15.4.0.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/2016/11/16/react-v15.4.0.html"}},"staticQueryHashes":[]}