{"componentChunkName":"component---src-templates-docs-js","path":"/docs/lifting-state-up.html","result":{"data":{"markdownRemark":{"html":"<p>Com frequência, a modificação de um dado tem que ser refletida em vários componentes. Recomendamos elevar o state compartilhado ao elemento pai comum mais próximo. Vamos ver como isso funciona na prática.</p>\n<p>Nessa seção, criaremos uma calculadora de temperatura que calcula se a água ferveria em determinada temperatura.</p>\n<p>Vamos iniciar com um componente chamado <code class=\"gatsby-code-text\">BoilingVerdict</code>. Ele recebe a temperatura por meio da prop <code class=\"gatsby-code-text\">celsius</code> e retorna uma mensagem indicando se a temperatura é suficiente para a água ferver.</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\">function</span> <span class=\"token function\">BoilingVerdict</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">.</span>celsius <span class=\"token operator\">>=</span> <span class=\"token number\">100</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">A água ferveria.</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span></span>  <span class=\"token punctuation\">}</span>\n<span class=\"gatsby-highlight-code-line\">  <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>p</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">A água não ferveria.</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>p</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span></span><span class=\"token punctuation\">}</span></code></pre></div>\n<p>A seguir, criaremos um componente chamado <code class=\"gatsby-code-text\">Calculator</code>. Ele renderiza um <code class=\"gatsby-code-text\">&lt;input&gt;</code> que recebe a temperatura e a mantém em <code class=\"gatsby-code-text\">this.state.temperature</code>.</p>\n<p>Além disso, ele renderiza o <code class=\"gatsby-code-text\">BoilingVerdict</code> de acordo com o valor atual do input.</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\">class</span> <span class=\"token class-name\">Calculator</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\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleChange <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">handleChange</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</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>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>temperature<span class=\"token operator\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></span>  <span class=\"token punctuation\">}</span>\n\n  <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=\"gatsby-highlight-code-line\">    <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>temperature<span class=\"token operator\">:</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>  <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=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">const</span> temperature <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>temperature<span class=\"token punctuation\">;</span></span>    <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>fieldset</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>legend</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Informe a temperatura em Celsius:</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>legend</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span></span><span class=\"gatsby-highlight-code-line\">          <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>temperature<span class=\"token punctuation\">}</span></span></span><span class=\"gatsby-highlight-code-line\">          <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleChange<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">BoilingVerdict</span></span></span><span class=\"gatsby-highlight-code-line\">          <span class=\"token attr-name\">celsius</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token function\">parseFloat</span><span class=\"token punctuation\">(</span>temperature<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>fieldset</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><a href=\"https://codepen.io/gaearon/pen/ZXeOBm?editors=0010\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><strong>Experimente no CodePen</strong></a></p>\n<h2 id=\"adding-a-second-input\"><a href=\"#adding-a-second-input\" 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>Adicionando um Segundo Input </h2>\n<p>Nosso novo requisito é que, além de um input para grau Celsius, também tenhamos um input para grau Fahrenheit e que ambos estejam sincronizados.</p>\n<p>Podemos iniciar extraindo um componente <code class=\"gatsby-code-text\">TemperatureInput</code> do componente <code class=\"gatsby-code-text\">Calculator</code>. Vamos adicionar uma nova prop <code class=\"gatsby-code-text\">scale</code> que pode ser tanto <code class=\"gatsby-code-text\">&quot;c&quot;</code> como <code class=\"gatsby-code-text\">&quot;f&quot;</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=\"gatsby-highlight-code-line\"><span class=\"token keyword\">const</span> scaleNames <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span></span><span class=\"gatsby-highlight-code-line\">  c<span class=\"token operator\">:</span> <span class=\"token string\">'Celsius'</span><span class=\"token punctuation\">,</span></span><span class=\"gatsby-highlight-code-line\">  f<span class=\"token operator\">:</span> <span class=\"token string\">'Fahrenheit'</span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></span>\n<span class=\"token keyword\">class</span> <span class=\"token class-name\">TemperatureInput</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\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleChange <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">handleChange</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>temperature<span class=\"token operator\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <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 keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>temperature<span class=\"token operator\">:</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <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\">const</span> temperature <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>temperature<span class=\"token punctuation\">;</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">const</span> scale <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>scale<span class=\"token punctuation\">;</span></span>    <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>fieldset</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>legend</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Informe a temperatura em </span><span class=\"token punctuation\">{</span>scaleNames<span class=\"token punctuation\">[</span>scale<span class=\"token punctuation\">]</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">:</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>legend</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span> <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>temperature<span class=\"token punctuation\">}</span></span>\n               <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleChange<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>fieldset</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>Agora podemos modificar o <code class=\"gatsby-code-text\">Calculator</code> para renderizar dois inputs de temperatura separados:</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\">class</span> <span class=\"token class-name\">Calculator</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\">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>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TemperatureInput</span></span> <span class=\"token attr-name\">scale</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>c<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span></span><span class=\"gatsby-highlight-code-line\"><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TemperatureInput</span></span> <span class=\"token attr-name\">scale</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>f<span class=\"token punctuation\">\"</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</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><a href=\"https://codepen.io/gaearon/pen/jGBryx?editors=0010\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><strong>Experimente no CodePen</strong></a></p>\n<p>Agora nós temos dois inputs. Porém, quando a temperatura é inserida em um deles, o outro não atualiza. Isso contraria nosso requisito: queremos que eles estejam sincronizados.</p>\n<p>Também não podemos renderizar o <code class=\"gatsby-code-text\">BoilingVerdict</code> a partir do <code class=\"gatsby-code-text\">Calculator</code>, porque esse não conhece a temperatura atual já que ela está escondida dentro do <code class=\"gatsby-code-text\">TemperatureInput</code>.</p>\n<h2 id=\"writing-conversion-functions\"><a href=\"#writing-conversion-functions\" 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>Codificando Funções de Conversão </h2>\n<p>Primeiro, vamos criar duas funções para converter de Celsius para Fahrenheit e vice-versa:</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\">toCelsius</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">fahrenheit</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>fahrenheit <span class=\"token operator\">-</span> <span class=\"token number\">32</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">*</span> <span class=\"token number\">5</span> <span class=\"token operator\">/</span> <span class=\"token number\">9</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">toFahrenheit</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">celsius</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>celsius <span class=\"token operator\">*</span> <span class=\"token number\">9</span> <span class=\"token operator\">/</span> <span class=\"token number\">5</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">+</span> <span class=\"token number\">32</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Essas duas funções convertem números. Vamos criar outra função que recebe uma string <code class=\"gatsby-code-text\">temperature</code> e uma função de conversão como argumentos e retorna uma string. Vamos usá-la para calcular o valor de um input com base no outro input.</p>\n<p>Retorna uma string vazia quando <code class=\"gatsby-code-text\">temperature</code> for inválido e mantém o retorno arredondado até a terceira casa decimal.</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\">tryConvert</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">temperature<span class=\"token punctuation\">,</span> convert</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> input <span class=\"token operator\">=</span> <span class=\"token function\">parseFloat</span><span class=\"token punctuation\">(</span>temperature<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>Number<span class=\"token punctuation\">.</span><span class=\"token function\">isNaN</span><span class=\"token punctuation\">(</span>input<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 string\">''</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">const</span> output <span class=\"token operator\">=</span> <span class=\"token function\">convert</span><span class=\"token punctuation\">(</span>input<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">const</span> rounded <span class=\"token operator\">=</span> Math<span class=\"token punctuation\">.</span><span class=\"token function\">round</span><span class=\"token punctuation\">(</span>output <span class=\"token operator\">*</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">/</span> <span class=\"token number\">1000</span><span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">return</span> rounded<span class=\"token punctuation\">.</span><span class=\"token function\">toString</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>Por exemplo, <code class=\"gatsby-code-text\">tryConvert(&#39;abc&#39;, toCelsius)</code> retona uma string vazia e <code class=\"gatsby-code-text\">tryConvert(&#39;10.22&#39;, toFahrenheit)</code> retorna <code class=\"gatsby-code-text\">&#39;50.396&#39;</code>.</p>\n<h2 id=\"lifting-state-up\"><a href=\"#lifting-state-up\" 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>Elevando o State </h2>\n<p>Atualmente, ambos os componentes <code class=\"gatsby-code-text\">TemperatureInput</code> mantém, de modo independente, o valor em seu state local.</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\">class</span> <span class=\"token class-name\">TemperatureInput</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\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleChange <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">handleChange</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</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>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>temperature<span class=\"token operator\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></span>  <span class=\"token punctuation\">}</span>\n\n  <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=\"gatsby-highlight-code-line\">    <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>temperature<span class=\"token operator\">:</span> e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>  <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=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">const</span> temperature <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>temperature<span class=\"token punctuation\">;</span></span>    <span class=\"token comment\">// ...  </span></code></pre></div>\n<p>Porém, queremos que esses dois inputs estejam sincronizados um com o outro. Quando o input de Celsius for atualizado, o input de Fahrenheit deve mostrar a temperatura convertida e vice-versa.</p>\n<p>No React, o compartilhamento do state é alcançado ao movê-lo para o elemento pai comum aos componentes que precisam dele. Isso se chama “elevar o state” (state lift). Vamos remover o state local do <code class=\"gatsby-code-text\">TemperatureInput</code> e colocá-lo no <code class=\"gatsby-code-text\">Calculator</code>.</p>\n<p>Se o <code class=\"gatsby-code-text\">Calculator</code> é dono do state compartilhado, ele se torna a “fonte da verdade” para a temperatura atual em ambos os inputs. Ele pode instruir ambos a terem valores que são consistentes um com o outro. Já que as props de ambos os <code class=\"gatsby-code-text\">TemperatureInput</code> vem do mesmo componente pai, <code class=\"gatsby-code-text\">Calculator</code>, os dois inputs sempre estarão sincronizados.</p>\n<p>Vamos ver o passo a passo de como isso funciona.</p>\n<p>Primeiro, vamos substituir <code class=\"gatsby-code-text\">this.state.temperature</code> por <code class=\"gatsby-code-text\">this.props.temperature</code> no componente <code class=\"gatsby-code-text\">TemperatureInput</code>. Por hora, vamos fingir que <code class=\"gatsby-code-text\">this.props.temperature</code> já existe. Apesar de que, no futuro, teremos que passá-la do <code class=\"gatsby-code-text\">Calculator</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 function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Antes: const temperature = this.state.temperature;</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">const</span> temperature <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>temperature<span class=\"token punctuation\">;</span></span>    <span class=\"token comment\">// ...</span></code></pre></div>\n<p>Sabemos que <a href=\"/docs/components-and-props.html#props-are-read-only\">props são somente leitura</a>. Quando a <code class=\"gatsby-code-text\">temperature</code> estava no state local, o <code class=\"gatsby-code-text\">TemperatureInput</code> podia simplesmente chamar <code class=\"gatsby-code-text\">this.setState()</code> para modificá-lo. Porém, agora que a <code class=\"gatsby-code-text\">temperature</code> vem do elemento pai como uma prop, o <code class=\"gatsby-code-text\">TemperatureInput</code> não tem controle sobre ela.</p>\n<p>No React, isso é comumente solucionado ao tornar um componente comum em um “componente controlado”. Assim como o <code class=\"gatsby-code-text\">&lt;input&gt;</code> do DOM aceita ambas as props <code class=\"gatsby-code-text\">value</code> e <code class=\"gatsby-code-text\">onChange</code>, o componente personalizado <code class=\"gatsby-code-text\">TemperatureInput</code> também pode aceitar ambas as props <code class=\"gatsby-code-text\">temperature</code> e <code class=\"gatsby-code-text\">onTemperatureChange</code> do <code class=\"gatsby-code-text\">Calculator</code>, seu componente pai.</p>\n<p>Agora, quando o <code class=\"gatsby-code-text\">TemperatureInput</code> quiser atualizar sua temperatura, ele executa <code class=\"gatsby-code-text\">this.props.onTemperatureChange</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 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 comment\">// Antes: this.setState({temperature: e.target.value});</span>\n<span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span><span class=\"token function\">onTemperatureChange</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>    <span class=\"token comment\">// ...</span></code></pre></div>\n<blockquote>\n<p>Observação:</p>\n<p>O nome das props <code class=\"gatsby-code-text\">temperature</code> ou <code class=\"gatsby-code-text\">onTemperatureChange</code> não possui nenhum significado especial. Elas poderiam ter quaisquer outros nomes, tais como <code class=\"gatsby-code-text\">value</code> e <code class=\"gatsby-code-text\">onChange</code>, o que é uma convenção comum.</p>\n</blockquote>\n<p>A prop <code class=\"gatsby-code-text\">onTemperatureChange</code> será fornecida juntamente com a prop <code class=\"gatsby-code-text\">temperature</code> pelo componente pai <code class=\"gatsby-code-text\">Calculator</code>. Esse irá cuidar das alterações ao modificar seu próprio state local, fazendo com que ambos os inputs sejam renderizados com novos valores. Vamos conferir a nova implementação do componente <code class=\"gatsby-code-text\">Calculator</code> em breve.</p>\n<p>Antes de mergulhar nas alterações do <code class=\"gatsby-code-text\">Calculator</code>, vamos recapitular as alterações no componente <code class=\"gatsby-code-text\">TemperatureInput</code>. Nós removemos o state local dele, então ao invés de ler <code class=\"gatsby-code-text\">this.state.temperature</code>, agora lemos <code class=\"gatsby-code-text\">this.props.temperature</code>. Ao invés de chamar <code class=\"gatsby-code-text\">this.setState()</code> quando quisermos fazer uma alteração chamamos <code class=\"gatsby-code-text\">this.props.onTemperatureChange()</code> que será fornecido pelo <code class=\"gatsby-code-text\">Calculator</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\">class</span> <span class=\"token class-name\">TemperatureInput</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\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleChange <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">handleChange</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <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=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span><span class=\"token function\">onTemperatureChange</span><span class=\"token punctuation\">(</span>e<span class=\"token punctuation\">.</span>target<span class=\"token punctuation\">.</span>value<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></span>  <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=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">const</span> temperature <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>temperature<span class=\"token punctuation\">;</span></span>    <span class=\"token keyword\">const</span> scale <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>scale<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>fieldset</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>legend</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Informe a temperatura em </span><span class=\"token punctuation\">{</span>scaleNames<span class=\"token punctuation\">[</span>scale<span class=\"token punctuation\">]</span><span class=\"token punctuation\">}</span><span class=\"token plain-text\">:</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>legend</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>input</span> <span class=\"token attr-name\">value</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>temperature<span class=\"token punctuation\">}</span></span>\n               <span class=\"token attr-name\">onChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleChange<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>fieldset</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>Agora é a vez do componente <code class=\"gatsby-code-text\">Calculator</code>.</p>\n<p>Vamos armazenar no state local os valores <code class=\"gatsby-code-text\">temperature</code> e <code class=\"gatsby-code-text\">scale</code> referentes ao input atual. Eles representam o state que “foi elevado” dos inputs e servirá como “fonte da verdade” para ambos. É a representação mínima de todos os dados necessários para conseguir renderizar ambos os inputs.</p>\n<p>Por exemplo, se informarmos 37 no input de Celsius, o state do componente <code class=\"gatsby-code-text\">Calculator</code> será:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token punctuation\">{</span>\n  temperature<span class=\"token operator\">:</span> <span class=\"token string\">'37'</span><span class=\"token punctuation\">,</span>\n  scale<span class=\"token operator\">:</span> <span class=\"token string\">'c'</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Posteriormente, se editarmos o input Fahrenheit para ser 212, o state do componente <code class=\"gatsby-code-text\">Calculator</code> será:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token punctuation\">{</span>\n  temperature<span class=\"token operator\">:</span> <span class=\"token string\">'212'</span><span class=\"token punctuation\">,</span>\n  scale<span class=\"token operator\">:</span> <span class=\"token string\">'f'</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Poderíamos ter armazenado o valor de ambos os inputs mas isso não é necessário. É suficiente armazenar o valor do input recentemente alterado e da escala que ele representa. Podemos assim inferir o valor do outro input com base nos valores atuais de <code class=\"gatsby-code-text\">temperature</code> e <code class=\"gatsby-code-text\">scale</code>.</p>\n<p>Os inputs ficam sincronizados porque seus valores são calculados tendo como base o mesmo state:</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\">class</span> <span class=\"token class-name\">Calculator</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\">constructor</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">props</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">super</span><span class=\"token punctuation\">(</span>props<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleCelsiusChange <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">handleCelsiusChange</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleFahrenheitChange <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">handleFahrenheitChange</span><span class=\"token punctuation\">.</span><span class=\"token function\">bind</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</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>state <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>temperature<span class=\"token operator\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span> scale<span class=\"token operator\">:</span> <span class=\"token string\">'c'</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></span>  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token function\">handleCelsiusChange</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">temperature</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><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>scale<span class=\"token operator\">:</span> <span class=\"token string\">'c'</span><span class=\"token punctuation\">,</span> temperature<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\">handleFahrenheitChange</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">temperature</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><span class=\"token function\">setState</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>scale<span class=\"token operator\">:</span> <span class=\"token string\">'f'</span><span class=\"token punctuation\">,</span> temperature<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=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">const</span> scale <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>scale<span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">const</span> temperature <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>state<span class=\"token punctuation\">.</span>temperature<span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">const</span> celsius <span class=\"token operator\">=</span> scale <span class=\"token operator\">===</span> <span class=\"token string\">'f'</span> <span class=\"token operator\">?</span> <span class=\"token function\">tryConvert</span><span class=\"token punctuation\">(</span>temperature<span class=\"token punctuation\">,</span> toCelsius<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> temperature<span class=\"token punctuation\">;</span></span><span class=\"gatsby-highlight-code-line\">    <span class=\"token keyword\">const</span> fahrenheit <span class=\"token operator\">=</span> scale <span class=\"token operator\">===</span> <span class=\"token string\">'c'</span> <span class=\"token operator\">?</span> <span class=\"token function\">tryConvert</span><span class=\"token punctuation\">(</span>temperature<span class=\"token punctuation\">,</span> toFahrenheit<span class=\"token punctuation\">)</span> <span class=\"token operator\">:</span> temperature<span class=\"token punctuation\">;</span></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>div</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\"></span>\n<span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TemperatureInput</span></span>\n          <span class=\"token attr-name\">scale</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>c<span class=\"token punctuation\">\"</span></span>\n<span class=\"gatsby-highlight-code-line\">          <span class=\"token attr-name\">temperature</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>celsius<span class=\"token punctuation\">}</span></span></span><span class=\"gatsby-highlight-code-line\">          <span class=\"token attr-name\">onTemperatureChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleCelsiusChange<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">TemperatureInput</span></span>\n          <span class=\"token attr-name\">scale</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>f<span class=\"token punctuation\">\"</span></span>\n<span class=\"gatsby-highlight-code-line\">          <span class=\"token attr-name\">temperature</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>fahrenheit<span class=\"token punctuation\">}</span></span></span><span class=\"gatsby-highlight-code-line\">          <span class=\"token attr-name\">onTemperatureChange</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>handleFahrenheitChange<span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">        </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span><span class=\"token class-name\">BoilingVerdict</span></span>\n<span class=\"gatsby-highlight-code-line\">          <span class=\"token attr-name\">celsius</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span><span class=\"token function\">parseFloat</span><span class=\"token punctuation\">(</span>celsius<span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span></span> <span class=\"token punctuation\">/></span></span><span class=\"token plain-text\"></span></span><span class=\"token plain-text\">      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</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><a href=\"https://codepen.io/gaearon/pen/WZpxpz?editors=0010\" target=\"_blank\" rel=\"nofollow noopener noreferrer\"><strong>Experimente no CodePen</strong></a></p>\n<p>Agora, tanto faz qual input for editado, <code class=\"gatsby-code-text\">this.state.temperature</code> e <code class=\"gatsby-code-text\">this.state.scale</code> no componente <code class=\"gatsby-code-text\">Calculator</code> serão atualizados. Um dos inputs recebe o valor como está, preservando o que foi informado pelo usuário e o valor do outro input é sempre recalculado com base no primeiro.</p>\n<p>Vamos recapitular o que acontece quando um input é editado:</p>\n<ul>\n<li>O React executa a função especificada como <code class=\"gatsby-code-text\">onChange</code> no <code class=\"gatsby-code-text\">&lt;input&gt;</code> do DOM. Nesse caso, esse é o método <code class=\"gatsby-code-text\">handleChange</code> do componente <code class=\"gatsby-code-text\">TemperatureInput</code>.</li>\n<li>O método <code class=\"gatsby-code-text\">handleChange</code> do componente <code class=\"gatsby-code-text\">TemperatureInput</code> executa <code class=\"gatsby-code-text\">this.props.onTemperatureChange()</code> com o novo valor desejado. Suas props, incluindo <code class=\"gatsby-code-text\">onTemperatureChange</code>, foram fornecidas pelo seu componente pai, o <code class=\"gatsby-code-text\">Calculator</code>.</li>\n<li>Quando renderizado previamente, o componente <code class=\"gatsby-code-text\">Calculator</code> especificou que <code class=\"gatsby-code-text\">onTemperatureChange</code> do <code class=\"gatsby-code-text\">TemperatureInput</code> de Celsius é o método <code class=\"gatsby-code-text\">handleCelsiusChange</code> do <code class=\"gatsby-code-text\">Calculator</code>, e que <code class=\"gatsby-code-text\">onTemperatureChange</code> do <code class=\"gatsby-code-text\">TemperatureInput</code> de Fahrenheit é o método <code class=\"gatsby-code-text\">handleFahrenheitChange</code> do <code class=\"gatsby-code-text\">Calculator</code>. Então um desses dois métodos do <code class=\"gatsby-code-text\">Calculator</code> será executado dependendo de qual input for editado.</li>\n<li>Dentro desses métodos, o componente <code class=\"gatsby-code-text\">Calculator</code> pede ao React para ser renderizado novamente ao chamar <code class=\"gatsby-code-text\">this.setState()</code> com o novo valor da temperatura e da escala do input recém editado.</li>\n<li>O React executa o método <code class=\"gatsby-code-text\">render</code> do componente <code class=\"gatsby-code-text\">Calculator</code> para aprender como a interface deveria ficar. Os valores de ambos os inputs são recalculados com base na temperatura e escala atuais. A conversão de temperatura é realizada aqui.</li>\n<li>O React executa o método <code class=\"gatsby-code-text\">render</code> dos dois componentes <code class=\"gatsby-code-text\">TemperatureInput</code> com suas novas props especificadas pelo <code class=\"gatsby-code-text\">Calculator</code>. O React aprende como a interface do usuário deve ficar.</li>\n<li>O React executa o método <code class=\"gatsby-code-text\">render</code> do componente <code class=\"gatsby-code-text\">BoilingVerdict</code>, passando a temperatura em Celsius como prop.</li>\n<li>O React DOM atualiza o DOM com o veredito e com os valores de input desejáveis. O input que acabamos de editar recebe seu valor atual e o outro input é atualizado com a temperatura após a conversão.</li>\n</ul>\n<p>Toda edição segue os mesmos passos então os inputs ficam sincronizados.</p>\n<h2 id=\"lessons-learned\"><a href=\"#lessons-learned\" 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>Lições Aprendidas </h2>\n<p>Deve haver uma única “fonte da verdade” para quaisquer dados que sejam alterados em uma aplicação React. Geralmente, o state é adicionado ao componente que necessita dele para renderizar. Depois, se outro componente também precisar desse state, você pode elevá-lo ao elemento pai comum mais próximo de ambos os componentes. Ao invés de tentar sincronizar o state entre diferentes componentes, você deve contar com o <a href=\"/docs/state-and-lifecycle.html#the-data-flows-down\">fluxo de dados de cima para baixo</a>.</p>\n<p>Elevar o state envolve escrever mais código de estrutura do que as abordagens de two-way data bind, mas como benefício, demanda menos trabalho para encontrar e isolar erros. Já que o state “vive” em um componente e somente esse componente pode alterá-lo, a área de superfície para encontrar os erros é drasticamente reduzida. Além disso, é possível implementar qualquer lógica personalizada para rejeitar ou transformar o input do usuário.</p>\n<p>Se alguma coisa pode ser derivada tanto das props como do state, ela provavelmente não deveria estar no state. Por exemplo, ao invés de armazenar ambos <code class=\"gatsby-code-text\">celsiusValue</code> e <code class=\"gatsby-code-text\">fahrenheitValue</code>, armazenamos somente o valor da última <code class=\"gatsby-code-text\">temperature</code> editada e o valor de <code class=\"gatsby-code-text\">scale</code>. O valor do outro input pode sempre ser calculado com base nessas informações no método <code class=\"gatsby-code-text\">render()</code>. Isso permite limpar ou arredondar o valor no outro input sem perder precisão no valor informado pelo usuário.</p>\n<p>Quando você vê algo de errado na interface do usuário, você pode utilizar o <a href=\"https://github.com/facebook/react/tree/master/packages/react-devtools\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">React Developer Tools</a> para inspecionar as props e subir a árvore de elementos até encontrar o componente responsável por atualizar o state. Isso permite que você encontre a fonte dos erros:</p>\n<img src=\"/ef94afc3447d75cdc245c77efb0d63be/react-devtools-state.gif\" alt=\"Monitoring State in React DevTools\" max-width=\"100%\" height=\"100%\">","frontmatter":{"title":"Elevando o State","next":"composition-vs-inheritance.html","prev":"forms.html"},"fields":{"path":"content/docs/lifting-state-up.md","slug":"docs/lifting-state-up.html"}}},"pageContext":{"slug":"docs/lifting-state-up.html"}},"staticQueryHashes":[]}