{"componentChunkName":"component---src-templates-docs-js","path":"/docs/faq-state.html","result":{"data":{"markdownRemark":{"html":"<h3 id=\"what-does-setstate-do\"><a href=\"#what-does-setstate-do\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>O que <code class=\"gatsby-code-text\">setState</code> faz? </h3>\n<p><code class=\"gatsby-code-text\">setState()</code> agenda uma atualização para o objeto <code class=\"gatsby-code-text\">state</code> de um componente. Quando o state muda, o componente responde renderizando novamente.</p>\n<h3 id=\"what-is-the-difference-between-state-and-props\"><a href=\"#what-is-the-difference-between-state-and-props\" 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>Qual é a diferença entre <code class=\"gatsby-code-text\">state</code> e <code class=\"gatsby-code-text\">props</code>? </h3>\n<p><a href=\"/docs/components-and-props.html\"><code class=\"gatsby-code-text\">props</code></a> (abreviação de ”<i lang=\"en\">properties</i>”) e <a href=\"/docs/state-and-lifecycle.html\"><code class=\"gatsby-code-text\">state</code></a> são ambos objetos JavaScript. Apesar de ambos guardarem informações que influenciam no resultado da renderização, eles são diferentes por uma razão importante: <code class=\"gatsby-code-text\">props</code> são <em>passados</em> para o componente (como parâmetros de funções), enquanto <code class=\"gatsby-code-text\">state</code> é gerenciado <em>de dentro</em> do componente (como variáveis declaradas dentro de uma função).</p>\n<p>Aqui estão alguns bons recursos para ler mais sobre quando usar <code class=\"gatsby-code-text\">props</code> vs <code class=\"gatsby-code-text\">state</code> (ambos em inglês):</p>\n<ul>\n<li><a href=\"https://github.com/uberVU/react-guide/blob/master/props-vs-state.md\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Props vs State</a></li>\n<li><a href=\"https://lucybain.com/blog/2016/react-state-vs-pros/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ReactJS: Props vs. State</a></li>\n</ul>\n<h3 id=\"why-is-setstate-giving-me-the-wrong-value\"><a href=\"#why-is-setstate-giving-me-the-wrong-value\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Por que <code class=\"gatsby-code-text\">setState</code> está me dando o valor errado? </h3>\n<p>Em React, tanto <code class=\"gatsby-code-text\">this.props</code> quanto <code class=\"gatsby-code-text\">this.state</code> representam os valores <em>renderizados</em>, ou seja, o que está atualmente na tela.</p>\n<p>Chamadas para <code class=\"gatsby-code-text\">setState</code> são assíncronas - não confie que <code class=\"gatsby-code-text\">this.state</code> vá refletir o novo valor imediatamente após chamar <code class=\"gatsby-code-text\">setState</code>. Use uma função de atualização ao invés de um objeto se você precisa calcular valores baseado no state atual (veja abaixo para mais detalhes).</p>\n<p>Exemplo de código que <em>não</em> vai funcionar como esperado:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token function\">incrementCount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Nota: isso *não* vai funcionar como esperado.</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>count<span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>count <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">handleSomething</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Digamos que `this.state.count` começa em 0.</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">incrementCount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">incrementCount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">incrementCount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\">// Quando o React renderizar novamente o componente, `this.state.count` será 1, mas você esperava 3.</span>\n\n  <span class=\"token comment\">// Isso é porque a função `incrementCount()` usa `this.state.count`,</span>\n  <span class=\"token comment\">// mas o React não atualiza `this.state.count` até o componente ser renderizado novamente.</span>\n  <span class=\"token comment\">// Então `incrementCount()` acaba lendo `this.state.count` como 0 todas as vezes, e muda seu valor para 1.</span>\n\n  <span class=\"token comment\">// A solução é exibida abaixo!</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Veja abaixo como solucionar esse problema.</p>\n<h3 id=\"how-do-i-update-state-with-values-that-depend-on-the-current-state\"><a href=\"#how-do-i-update-state-with-values-that-depend-on-the-current-state\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Como eu atualizo o state com valores que dependem do state atual? </h3>\n<p>Passe uma função ao invés de um objeto para <code class=\"gatsby-code-text\">setState</code> para garantir que a chamada sempre use o valor mais recente do state (veja abaixo).</p>\n<h3 id=\"what-is-the-difference-between-passing-an-object-or-a-function-in-setstate\"><a href=\"#what-is-the-difference-between-passing-an-object-or-a-function-in-setstate\" 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>Qual é a diferença entre passar um objeto e uma função em <code class=\"gatsby-code-text\">setState</code>? </h3>\n<p>Passar uma função de atualização permite que você acesse o valor atual do state dentro dela. Como as chamadas de <code class=\"gatsby-code-text\">setState</code> são feitas em lotes, isso permite que você encadeie atualizações e garanta que elas se componham ao invés de entrar em conflito:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token function\">incrementCount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">state</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Importante: use `state` em vez de `this.state` quando estiver atualizando.</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>count<span class=\"token operator\">:</span> state<span class=\"token punctuation\">.</span>count <span class=\"token operator\">+</span> <span class=\"token number\">1</span><span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token function\">handleSomething</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token comment\">// Digamos que `this.state.count` começa em 0.</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">incrementCount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">incrementCount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">incrementCount</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\">// Se você ler `this.state.count` agora, ele ainda seria 0.</span>\n  <span class=\"token comment\">// Mas quando o React renderizar novamente o componente, ele será 3.</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p><a href=\"/docs/react-component.html#setstate\">Saiba mais sobre setState</a></p>\n<h3 id=\"when-is-setstate-asynchronous\"><a href=\"#when-is-setstate-asynchronous\" 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>Quando <code class=\"gatsby-code-text\">setState</code> é assíncrono? </h3>\n<p>Atualmente, <code class=\"gatsby-code-text\">setState</code> é assíncrono dentro de manipuladores de evento.</p>\n<p>Isso garante que, por exemplo, caso tanto <code class=\"gatsby-code-text\">Parent</code> quanto <code class=\"gatsby-code-text\">Child</code> chamem <code class=\"gatsby-code-text\">setState</code> após um evento de clique, <code class=\"gatsby-code-text\">Child</code> não seja renderizado duas vezes. Em vez disso, React executa todas as atualizações de estado ao final do evento do navegador. Isso resulta numa melhoria de performance significativa para aplicativos maiores.</p>\n<p>Isso é um detalhe de implementação, então evite depender disso diretamente. Em versões futuras, o React fará atualizações em lotes em mais casos.</p>\n<h3 id=\"why-doesnt-react-update-thisstate-synchronously\"><a href=\"#why-doesnt-react-update-thisstate-synchronously\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Por que o React não atualiza <code class=\"gatsby-code-text\">this.state</code> síncronamente? </h3>\n<p>Como explicado na seção anterior, React intencionalmente “espera” até todos os componentes terem chamado <code class=\"gatsby-code-text\">setState()</code> em seus manipuladores de evento antes de começar a renderizar novamente. Isso aumenta performance por evitar renderizações desnecessárias.</p>\n<p>No entanto, você pode ainda estar se perguntando porque o React simplesmene não atualiza <code class=\"gatsby-code-text\">this.state</code> imediatamente, sem renderizar novamente.</p>\n<p>Existem duas principais razões:</p>\n<ul>\n<li>Isso quebraria a consistência entre <code class=\"gatsby-code-text\">props</code> e <code class=\"gatsby-code-text\">state</code>, causando problemas muito difíceis de debugar.</li>\n<li>Isso tornaria algumas das novas funcionalidades em que estamos trabalhando impossíveis de implementar.</li>\n</ul>\n<p>Esse <a href=\"https://github.com/facebook/react/issues/11527#issuecomment-360199710\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">comentário no GitHub</a> se aprofunda em exemplos específicos.</p>\n<h3 id=\"should-i-use-a-state-management-library-like-redux-or-mobx\"><a href=\"#should-i-use-a-state-management-library-like-redux-or-mobx\" 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>Eu devo usar uma biblioteca de gerenciamento de state, como Redux ou MobX? </h3>\n<p><a href=\"https://redux.js.org/faq/general#when-should-i-use-redux\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Talvez.</a></p>\n<p>É uma boa ideia se aprofundar em React primeiro, antes de adicionar bibliotecas. Você pode fazer aplicativos bastante complexos apenas com React.</p>","frontmatter":{"title":"State dos Componentes","next":null,"prev":null},"fields":{"path":"content/docs/faq-state.md","slug":"docs/faq-state.html"}}},"pageContext":{"slug":"docs/faq-state.html"}},"staticQueryHashes":[]}