<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Daniel Miclos</title>
    <description>The latest articles on DEV Community by Daniel Miclos (@danielmiclos).</description>
    <link>https://dev.to/danielmiclos</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1265252%2Fb9097b4e-9910-4efa-b41a-0d15afcf1249.jpeg</url>
      <title>DEV Community: Daniel Miclos</title>
      <link>https://dev.to/danielmiclos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/danielmiclos"/>
    <language>en</language>
    <item>
      <title>Arrumando a casa - separando componentes, instalando módulos</title>
      <dc:creator>Daniel Miclos</dc:creator>
      <pubDate>Wed, 21 Jan 2026 17:48:23 +0000</pubDate>
      <link>https://dev.to/danielmiclos/2-arrumando-a-casa-separando-componentes-instalando-modulos-1edn</link>
      <guid>https://dev.to/danielmiclos/2-arrumando-a-casa-separando-componentes-instalando-modulos-1edn</guid>
      <description>&lt;p&gt;Bem amigos, sentiram saudades? Eu não, pois estou escrevendo esse post logo em seguida do anterior.&lt;/p&gt;

&lt;p&gt;No último artigo, chegamos ao nosso MVP: um To-do funcional, porém básico e tosco. Agora é hora de dar o próximo passo e torná-lo mais robusto, trabalhando em três frentes essenciais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Criando componentes separados&lt;/li&gt;
&lt;li&gt;Aprendendo a usar módulos de terceiros&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Antes disso, uma coisa muito importante que eu me esqueci de falar no último post: &lt;strong&gt;Vamos salvar nosso progresso no Git&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Essa etapa é essencial e você deveria fazer isso em qualquer projeto, por mais simples que seja. Assim, se algo der errado nas próximas mudanças, não vai precisar se descabelar, você pode voltar facilmente para um ponto em que tudo funcionava. É o seu "ponto de salvamento" no código.&lt;/p&gt;

&lt;p&gt;No terminal, na pasta raiz do seu projeto (&lt;code&gt;mytodolist&lt;/code&gt;), execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Inicializa um repositório Git&lt;/span&gt;
&lt;span class="k"&gt;git&lt;/span&gt; init

&lt;span class="c1"&gt;# Adiciona todos os arquivos para serem "rastreados"&lt;/span&gt;
&lt;span class="k"&gt;git&lt;/span&gt; add .

&lt;span class="c1"&gt;# Cria o primeiro commit (nosso "ponto de salvamento")&lt;/span&gt;
&lt;span class="k"&gt;git&lt;/span&gt; commit -m "MVP inicial do Todo App - versão tosca mas funcional"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto! Agora nosso MVP está devidamente salvo e podemos começar a brincar sem medo de estragar tudo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Criando componentes separados
&lt;/h2&gt;

&lt;p&gt;No artigo anterior, fizemos todo o código dentro do &lt;code&gt;App.jsx&lt;/code&gt;. Para os primeiros passos, tudo bem, mas qualquer aplicação um pouco mais complexa se transformaria em uma &lt;strong&gt;loucura total&lt;/strong&gt;. Imagine criar um app com vários componentes e manter tudo em um único arquivo? Nosso código ficaria desorganizado e começaria a se parecer com um... pergaminho digital. Aquele tipo de arquivo que você precisa rolar por 15 minutos só pra achar onde termina um &lt;code&gt;&amp;lt;/div&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Felizmente, a solução é simples e elegante: &lt;strong&gt;cada peça importante da interface vira seu próprio componente em um arquivo separado&lt;/strong&gt;. Para começar, vamos começar a pensar na estrutura do nosso app, ver o que já temos e como podemos reorganizar em arquivos diferentes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqdorr3acjvlsm57e19c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqdorr3acjvlsm57e19c.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;No princípio havia ReactDOM.render(, document.getElementById('root'));…&lt;/em&gt; &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;
  
  
  A estrutura de um app React
&lt;/h3&gt;

&lt;p&gt;Se olharmos a estrutura do nosso app agora nós temos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mytodolist/ 
│  node_modules...
│  public/...
│  src/
│  ├─ assets/...
│  ├─ App.css
│  ├─ App.jsx
│  ├─ index.css
│  └─ main.jsx
├─ .gitignore 
├─ index.html
├─ ... 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você pesquisar por aí, vai ver que a organização de um projeto em diretórios não é uma unanimidade e existem opiniões fortes sobre isso. No entanto, a estrutura comum aceita para projetos de pequeno e médio porte é a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/src
├── /assets/          &lt;span class="c"&gt;# Imagens, fontes, arquivos CSS, etc.&lt;/span&gt;
├── /components/      &lt;span class="c"&gt;# Componentes de UI reutilizáveis (botões, modais, etc.)&lt;/span&gt;
├── /hooks/           &lt;span class="c"&gt;# Hooks personalizados reutilizáveis&lt;/span&gt;
├── /pages/           &lt;span class="c"&gt;# Componentes que atuam como páginas/rotas completas&lt;/span&gt;
├── /utils/           &lt;span class="c"&gt;# Funções auxiliares (funções puras para formatação, etc.)&lt;/span&gt;
├── App.jsx           &lt;span class="c"&gt;# Componente principal da aplicação&lt;/span&gt;
└── main.jsx          &lt;span class="c"&gt;# Ponto de entrada da aplicação&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para o nosso projeto, como temos (por enquanto) apenas uma página, não vamos precisar do diretório &lt;code&gt;/pages/&lt;/code&gt;, mas vá em frente e crie dentro do diretório &lt;code&gt;/src&lt;/code&gt; os diretórios: &lt;code&gt;components&lt;/code&gt;, &lt;code&gt;hooks&lt;/code&gt; e &lt;code&gt;utils&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando nosso primeiro componente separado
&lt;/h3&gt;

&lt;p&gt;Depois disso, com o que já temos fica fácil, extremamente fácil, pra você e eu e todo mundo codar juntos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dentro do diretório &lt;code&gt;components&lt;/code&gt; crie um novo arquivo chamado &lt;code&gt;Task.jsx&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copie a função &lt;code&gt;Task()&lt;/code&gt; que está no arquivo &lt;code&gt;App.jsx&lt;/code&gt; e cole no novo arquivo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O arquivo &lt;code&gt;Task.jsx&lt;/code&gt; deve ficar mais ou menos assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;function &lt;/span&gt;Task&lt;span class="o"&gt;(&lt;/span&gt;props&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;
    &amp;lt;div &lt;span class="nv"&gt;className&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"task-item"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &amp;lt;div&amp;gt;
        &amp;lt;input
          &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"checkbox"&lt;/span&gt;
          &lt;span class="nv"&gt;checked&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;props.done&lt;span class="o"&gt;}&lt;/span&gt;
          &lt;span class="nv"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;={()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; props.onStatusChange&lt;span class="o"&gt;(&lt;/span&gt;props.id&lt;span class="o"&gt;)}&lt;/span&gt;
        /&amp;gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;" "&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;{&lt;/span&gt;props.children&lt;span class="o"&gt;}&lt;/span&gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;button &lt;span class="nv"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;={()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; props.onRemoveTask&lt;span class="o"&gt;(&lt;/span&gt;props.id&lt;span class="o"&gt;)}&amp;gt;&lt;/span&gt;X&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  &lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como não estamos importando nada dentro desse componente, a única coisa que está faltando é dizer ao React que esse componente pode ser usado em outros arquivos. Nós fazemos isso colocando um &lt;code&gt;export&lt;/code&gt; no final do arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;default Task&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salve o arquivo, volte no &lt;code&gt;App.jsx&lt;/code&gt;, remova a função &lt;code&gt;Task()&lt;/code&gt; toda e no começo do arquivo, vamos importar nosso novo componente separado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Task&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/Task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- O nosso novo componente Task &lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salve tudo, vá no browser e faça o teste. Se nada mudou, é que deu tudo certo!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uma observação importante:&lt;/strong&gt; Note que este é um ótimo exemplo de &lt;strong&gt;componente puro&lt;/strong&gt;. O que isso significa?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ele &lt;strong&gt;não gerencia seu próprio estado interno&lt;/strong&gt; (não tem &lt;code&gt;useState&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Seu comportamento e aparência são &lt;strong&gt;determinados totalmente pelas &lt;code&gt;props&lt;/code&gt; que recebe&lt;/strong&gt; (&lt;code&gt;id&lt;/code&gt;, &lt;code&gt;done&lt;/code&gt;, &lt;code&gt;onStatusChange&lt;/code&gt;, etc.).&lt;/li&gt;
&lt;li&gt;Dados as mesmas &lt;code&gt;props&lt;/code&gt;, ele &lt;strong&gt;sempre renderizará a mesma interface&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa simplicidade o torna previsível, fácil de testar e um bloco de construção perfeito para nossa aplicação. Em outras palavras: é o tipo de componente que você escreve hoje e agradece a si mesmo daqui a seis meses.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando o componente &lt;code&gt;TaskForm&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;O próximo component que vamos criar é o &lt;code&gt;TaskForm&lt;/code&gt; que é um formulário com o &lt;code&gt;&amp;lt;input type="text"/&amp;gt;&lt;/code&gt; e o &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; dentro. Note que originalmente não criamos um &lt;code&gt;form&lt;/code&gt; porque estávamos lidando com os elementos tudo num lugar só. Mas conforme aprimorarmos nosso app, você vai notar que criar uma estrutura e formulário agora, vai nos &lt;strong&gt;trazer benefícios&lt;/strong&gt; no futuro.&lt;/p&gt;

&lt;p&gt;Dentro do diretório &lt;code&gt;/components&lt;/code&gt; crie um novo arquivo chamado &lt;code&gt;TaskForm.jsx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;No arquivo, vamos começar criando o esqueleto do componente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;TaskForm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TaskForm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Até aqui, sem surpresas. Dentro do &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; vamos adicionar um &lt;code&gt;form&lt;/code&gt; e dentro o &lt;code&gt;input&lt;/code&gt; e o &lt;code&gt;button&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
          &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"O que você precisa fazer?"&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Add Task&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quase a mesma coisa do que tínhamos no App.jsx. A diferença é que, como agora estamos usando um &lt;code&gt;form&lt;/code&gt; o evento que envia o valor do formulário como um todo é o &lt;code&gt;onSubmit&lt;/code&gt; dele. O campo &lt;code&gt;&amp;lt;input type="text"/&amp;gt;&lt;/code&gt; continua sendo controlado como era o antigo e o &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; agora não precisa de um evento diretamente nele para funcionar.&lt;/p&gt;

&lt;p&gt;Como o &lt;code&gt;value&lt;/code&gt; do campo de texto agora se chama &lt;code&gt;input&lt;/code&gt;, precisamos criar um &lt;strong&gt;state&lt;/strong&gt; com esse nome e também precisamos criar a função &lt;code&gt;handleSubmit&lt;/code&gt; que vamos usar pra tratar o &lt;code&gt;onSubmit&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setInput&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lembra que quando nós criamos o componente &lt;code&gt;Task()&lt;/code&gt; nós passamos as funções que manipulavam o &lt;strong&gt;state&lt;/strong&gt; do pai no argumento &lt;code&gt;props&lt;/code&gt;? Agora nós precisamos fazer a mesma coisa, mas dessa vez faremos de um modo um pouco mais elegante. No lugar de simplesmente passar um argumento genérico &lt;code&gt;props&lt;/code&gt; e ter que ficar usando no código &lt;code&gt;props.isso&lt;/code&gt;, &lt;code&gt;props.aquilo&lt;/code&gt;, nós vamos desestruturar o argumento da função usando chaves (&lt;code&gt;{}&lt;/code&gt;) e nomear só as propriedade que vamos usar, &lt;code&gt;onAddTask&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;TaskForm&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;onAddTask&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setInput&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso facilita a leitura do código &lt;strong&gt;deste componente de forma isolada&lt;/strong&gt;, sem precisar ficar recorrendo ao arquivo pai para saber o que &lt;code&gt;props&lt;/code&gt; contém.&lt;/p&gt;

&lt;p&gt;Conhecendo a função que usaremos para passar o valor do form para o elemento pai, o &lt;code&gt;handleSubmit&lt;/code&gt; fica assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- evita que o form provoque um reload na página&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- checa se o input está vazio&lt;/span&gt;
    &lt;span class="nf"&gt;onAddTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- chama a função do elemento pai&lt;/span&gt;
    &lt;span class="nf"&gt;setInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;- limpa o input&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código completo o arquivo &lt;code&gt;TaskForm.jsx&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;TaskForm&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;onAddTask&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setInput&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;preventDefault&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;onAddTask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt; &lt;span class="na"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleSubmit&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
          &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"O que você precisa fazer?"&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Add Task&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;form&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TaskForm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora precisamos modificar o &lt;code&gt;App.jsx&lt;/code&gt; para funcionar com o &lt;code&gt;TaskForm&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;1 - importamos o &lt;code&gt;TaskForm&lt;/code&gt; de "./components/TaskForm"&lt;/p&gt;

&lt;p&gt;2 - removemos o state &lt;code&gt;inputValue&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;3 - modificamos o &lt;code&gt;handleAddTask()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;4 - removemos o input e button do código e adicionamos o &lt;code&gt;&amp;lt;TaskForm /&amp;gt;&lt;/code&gt; em seu lugar&lt;/p&gt;

&lt;p&gt;Aqui está o código com essas modificação comentadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Task&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/Task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TaskForm&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/TaskForm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 1 - importamos  o TaskForm&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// 2 - removemos o state inputValue&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Acordar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Escovar os dentes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tomar banho&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jogar videogame&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Comer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deitar e olhar para o teto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dormir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="c1"&gt;// 3 - modificamos o handleAddTask()&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleAddTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}]);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleStatusChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleRemoveTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;My Simple Todo List&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* 4 - removemos o input e button do código e adicionamos o &amp;lt;TaskForm /&amp;gt; em seu lugar */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TaskForm&lt;/span&gt; &lt;span class="na"&gt;onAddTask&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleAddTask&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;
              &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="na"&gt;onStatusChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleStatusChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
              &lt;span class="na"&gt;onRemoveTask&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleRemoveTask&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se testar a página, visualmente nada deve ter mudado. Essa é a mágia de componentes bem estruturados: &lt;strong&gt;a funcionalidade permanece idêntica para o usuário, mas o código por trás ficou muito mais organizado, modular e fácil de manter.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando um componente &lt;code&gt;header&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Aproveitando que estamos modularizando tudo, vamos criar um componente para o &lt;code&gt;Header&lt;/code&gt;. No momento, nem temos um, só um título solto,  mas como pretendemos aprimorar o layout e adicionar mais recursos futuramente, começar com uma estrutura clara faz todo sentido agora.&lt;/p&gt;

&lt;p&gt;Dentro de &lt;code&gt;/components&lt;/code&gt; crie o arquivo &lt;code&gt;Header.jsx&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;My Simple To-do list&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;header&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;Header&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, substitua aquele &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; solto no &lt;code&gt;App()&lt;/code&gt; por este novo componente. Vamos aproveitar também para dar uma pequena organizada na estrutura do &lt;code&gt;return&lt;/code&gt; do &lt;code&gt;App&lt;/code&gt;, agrupando visualmente o formulário e a lista em &lt;code&gt;div&lt;/code&gt;s separadas (isso ajudará muito quando formos estilizar).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Task&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/Task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TaskForm&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/TaskForm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Header&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/Header&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Acordar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Escovar os dentes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tomar banho&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jogar videogame&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Comer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deitar e olhar para o teto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dormir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleAddTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}]);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleStatusChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
      &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleRemoveTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Header&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TaskForm&lt;/span&gt; &lt;span class="na"&gt;onAddTask&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleAddTask&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;
                  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                  &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                  &lt;span class="na"&gt;onStatusChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleStatusChange&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                  &lt;span class="na"&gt;onRemoveTask&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleRemoveTask&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
                  &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Poderíamos criar um componente &lt;code&gt;TaskList&lt;/code&gt; agora?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sim, mas vamos deixar isso para um futuro próximo. Criar um componente &lt;code&gt;TaskList&lt;/code&gt; com o conhecimento que temos até aqui significaria passar &lt;em&gt;todas&lt;/em&gt; as funções (&lt;code&gt;handleStatusChange&lt;/code&gt;, &lt;code&gt;handleRemoveTask&lt;/code&gt;) e o array &lt;code&gt;todo&lt;/code&gt; como props para ele,  e ele teria que repassá-las para o componente &lt;code&gt;Task&lt;/code&gt;. Isso criaria um cenário clássico de &lt;strong&gt;&lt;em&gt;prop drilling&lt;/em&gt;&lt;/strong&gt;, que é justamente o que queremos aprender a evitar de forma elegante mais adiante.&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando um arquivo para funções utilitárias: &lt;code&gt;utils.js&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Olha só nossa função &lt;code&gt;generateId()&lt;/code&gt; ali, toda sozinha no meio do componente &lt;code&gt;App&lt;/code&gt;. Ela não está fazendo nada de errado, mas também não está no lugar ideal. Por quê?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ela não é JSX&lt;/strong&gt;: Essa função não retorna nada visual; ela apenas gera um ID. É pura lógica JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ela pode ser reutilizada&lt;/strong&gt;: E se outra parte do app precisar criar um ID único? Seria estranho ter que copiar a função ou importar o &lt;code&gt;App&lt;/code&gt; só por causa dela.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polui o componente&lt;/strong&gt;: Componentes devem focar na interface e em sua própria lógica de estado. Funções de apoio "sujam" a leitura.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Essa função é um exemplo clássico de &lt;strong&gt;função utilitária&lt;/strong&gt; (ou &lt;em&gt;helper function&lt;/em&gt;). São funções puras, pequenas e focadas em uma tarefa específica (como formatar uma data, fazer um cálculo, ou, no nosso caso, gerar um ID) que podem ser usadas em vários lugares do projeto.&lt;/p&gt;

&lt;p&gt;A solução é simples: vamos criar uma "caixa de ferramentas" para guardar essas funções.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Criando o arquivo  de utils&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dentro do diretório &lt;code&gt;/src/utils/&lt;/code&gt;, crie um arquivo chamado  &lt;code&gt;index.js&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Corte a função &lt;code&gt;generateId()&lt;/code&gt; do arquivo &lt;code&gt;App.jsx&lt;/code&gt; e cole-a neste novo arquivo.&lt;/li&gt;
&lt;li&gt;Não se esqueça de &lt;strong&gt;exportá-la&lt;/strong&gt; para que outros arquivos possam importá-la.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Seu &lt;code&gt;/src/utils/index.js&lt;/code&gt; ficará assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;(Você pode adicionar outras funções utilitárias aqui no futuro, como &lt;code&gt;formatDate&lt;/code&gt;, &lt;code&gt;calculateStats&lt;/code&gt;, etc.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atualizando o &lt;code&gt;App.jsx&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Agora, no &lt;code&gt;App.jsx&lt;/code&gt;, em vez de ter a função declarada, nós a &lt;strong&gt;importamos&lt;/strong&gt; do nosso novo módulo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Task&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/Task&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TaskForm&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/TaskForm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Header&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/Header&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;generateId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./utils&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//  Importação da função utilitária&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ... resto do código permanece igual, mas a função generateId não está mais aqui!&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Acordar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="c1"&gt;//  Aqui ela é usada normalmente&lt;/span&gt;
    &lt;span class="c1"&gt;// ... resto dos itens&lt;/span&gt;
  &lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="c1"&gt;// ... resto do componente&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pronto!&lt;/strong&gt; Movemos a lógica de apoio para onde ela pertence. O componente &lt;code&gt;App&lt;/code&gt; ficou mais limpo, e nossa função utilitária agora está organizada em um módulo dedicado, pronto para ser reutilizado em qualquer outro arquivo do projeto.&lt;/p&gt;

&lt;p&gt;Essa separação é um pequeno passo que faz uma &lt;strong&gt;grande diferença&lt;/strong&gt; na organização e manutenção do código à medida que o projeto cresce.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entendendo &lt;code&gt;export&lt;/code&gt; e &lt;code&gt;import&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Percebeu que usamos &lt;code&gt;export function generateId()&lt;/code&gt; e não &lt;code&gt;export default&lt;/code&gt;? E que na importação usamos &lt;code&gt;{ generateId }&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Essa é uma distinção importante do ES6 Modules:&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;&lt;code&gt;export default&lt;/code&gt;&lt;/strong&gt;: Usamos quando um arquivo exporta &lt;strong&gt;uma única coisa principal&lt;/strong&gt; (como um componente). Na importação, podemos dar qualquer nome: &lt;code&gt;import MinhaFuncao from './arquivo'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;• &lt;strong&gt;&lt;code&gt;export&lt;/code&gt; (nomeado)&lt;/strong&gt;: Usamos quando um arquivo pode exportar &lt;strong&gt;várias coisas&lt;/strong&gt;. Na importação, &lt;strong&gt;precisamos usar o nome exato&lt;/strong&gt; entre chaves: &lt;code&gt;import { funcao1, funcao2 } from './arquivo'&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nosso &lt;code&gt;utils&lt;/code&gt; é uma "caixa de ferramentas" que pode ter várias funções. Usar &lt;code&gt;export&lt;/code&gt; nomeado permite que no futuro você importe só as funções que precisa, como &lt;code&gt;import { generateId, formatDate } from './utils'&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Instalando nosso primeiro módulo externo: UUID&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Nossa função &lt;code&gt;generateId()&lt;/code&gt; caseira funciona, mas no mundo real, para algo tão comum e crítico quanto gerar um identificador único, é melhor usar uma ferramenta profissional.&lt;/p&gt;

&lt;p&gt;É aqui que entra o &lt;strong&gt;npm&lt;/strong&gt; (Node Package Manager). É o maior repositório de código do mundo, onde milhões de desenvolvedores compartilham pedacinhos de código reutilizáveis, chamados &lt;strong&gt;pacotes&lt;/strong&gt; ou &lt;strong&gt;módulos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vamos instalar o pacote &lt;a href="https://www.npmjs.com/package/uuid" rel="noopener noreferrer"&gt;&lt;code&gt;uuid&lt;/code&gt;&lt;/a&gt;, que é a solução padrão da indústria para gerar IDs únicos.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Passo 1: Instalando o pacote&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;No terminal, dentro da pasta do seu projeto (&lt;code&gt;mytodolist&lt;/code&gt;), execute no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;uuid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse comando faz o download do código do &lt;code&gt;uuid&lt;/code&gt; e de suas dependências, e as adiciona na pasta &lt;code&gt;node_modules&lt;/code&gt; e ao arquivo &lt;code&gt;package.json&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Passo 2: Atualizando nossa função utilitária&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Agora, vamos ao nosso "canivete suíço" de funções, o arquivo &lt;code&gt;/src/utils/index.js&lt;/code&gt;. Substitua o conteúdo antigo da função &lt;code&gt;generateId&lt;/code&gt; por uma importação e uso do &lt;code&gt;uuid&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A versão mais comum (v4) gera um ID completamente aleatório. Vamos usá-la:&lt;/p&gt;

&lt;p&gt;javascript&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// /src/utils/index.js&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;v4&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;uuidv4&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;uuid&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;uuidv4&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Gera um UUID único, ex: '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;O que mudou?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;import { v4 as uuidv4 } from 'uuid';&lt;/code&gt;&lt;/strong&gt;: Importamos a função &lt;code&gt;v4&lt;/code&gt; do pacote &lt;code&gt;uuid&lt;/code&gt; e a renomeamos localmente para &lt;code&gt;uuidv4&lt;/code&gt; (um nome mais claro).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;return uuidv4();&lt;/code&gt;&lt;/strong&gt;: Nossa função agora delega a complexidade de gerar um ID universalmente único para o pacote &lt;code&gt;uuid&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Passo 3: Por que fazer isso? (Não reinvente a roda!)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Você pode se perguntar: "Pra que instalar um pacote se minha função já funcionava?". Ótima pergunta! As vantagens são enormes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Confiabilidade e Testes&lt;/strong&gt;: O pacote &lt;code&gt;uuid&lt;/code&gt; é usado por &lt;strong&gt;milhões de projetos&lt;/strong&gt;, testado exaustivamente em inúmeras situações. A chance de haver um bug ou de gerar IDs duplicados é praticamente zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Padrão da Indústria&lt;/strong&gt;: Usar UUIDs (como &lt;code&gt;uuidv4&lt;/code&gt;) é um padrão reconhecido. Se seus dados forem para um banco de dados ou API, esse formato será imediatamente entendido.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mantenibilidade&lt;/strong&gt;: Você não precisa se preocupar em manter ou melhorar essa função. Uma equipe dedicada fará isso por você. Basta rodar &lt;code&gt;npm update uuid&lt;/code&gt; no futuro para receber melhorias e correções de segurança.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Foco no que importa&lt;/strong&gt;: Seu tempo é precioso. Use-o para resolver os problemas &lt;em&gt;únicos&lt;/em&gt; do seu app, não para reescrever soluções genéricas que já existem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Testando a aplicação&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Salve os arquivos e volte ao navegador. O hot reload do Vite deve ter atualizado a página. Se você abrir o console e adicionar uma nova tarefa, verá que o &lt;code&gt;id&lt;/code&gt; dela agora é uma bela string com hífens (ex: &lt;code&gt;550e8400-e29b-41d4-a716-446655440000&lt;/code&gt;), muito mais robusta que nossa versão anterior.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pronto!&lt;/strong&gt; Você acabou de dar um passo fundamental no desenvolvimento moderno: &lt;strong&gt;integrar uma dependência externa&lt;/strong&gt;. Isso desbloqueia todo o poder do ecossistema npm para seus projetos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluindo
&lt;/h2&gt;

&lt;p&gt;Olha só o caminho que percorremos! Partimos de um único arquivo &lt;code&gt;App.jsx&lt;/code&gt; com tudo amontoado e chegamos a uma aplicação com uma estrutura profissional e modular.&lt;/p&gt;

&lt;p&gt;Neste artigo, nós &lt;strong&gt;"arrumamos a casa"&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Separamos componentes&lt;/strong&gt; (&lt;code&gt;Task&lt;/code&gt;, &lt;code&gt;TaskForm&lt;/code&gt;, &lt;code&gt;Header&lt;/code&gt;), aprendendo sobre componentes puros e a importância de manter o código focado.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Criamos um módulo de utilitários&lt;/strong&gt; (&lt;code&gt;utils/&lt;/code&gt;), entendendo como isolar funções de lógica pura para reutilização e clareza.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Instalamos e usamos nosso primeiro pacote npm&lt;/strong&gt; (&lt;code&gt;uuid&lt;/code&gt;), vendo na prática o poder de não reinventar a roda e aproveitar soluções da comunidade.&lt;/p&gt;

&lt;p&gt;Nosso To-do List continua com as mesmas funcionalidades para o usuário, mas o &lt;strong&gt;código por trás está infinitamente mais organizado, legível e pronto para crescer&lt;/strong&gt;. Essa é a mágia da refatoração e das boas práticas.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;O que vem por aí? (Próximos passos!)&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Agora que a &lt;strong&gt;estrutura&lt;/strong&gt; está sólida, é hora de cuidar da &lt;strong&gt;aparência&lt;/strong&gt;. No próximo artigo da série, vamos mergulhar no mundo do &lt;strong&gt;TailwindCSS&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Nele, você vai aprender a:&lt;/p&gt;

&lt;p&gt;🎨 &lt;strong&gt;Configurar o Tailwind no projeto Vite&lt;/strong&gt; de forma rápida.&lt;/p&gt;

&lt;p&gt;✨ &lt;strong&gt;Transformar a UI "tosca" em algo visualmente atrativo e moderno&lt;/strong&gt; com classes utilitárias.&lt;/p&gt;

&lt;p&gt;📱 &lt;strong&gt;Tornar o app responsivo&lt;/strong&gt; para diferentes tamanhos de tela com facilidade.&lt;/p&gt;

&lt;p&gt;O código final deste artigo está disponível no &lt;a href="https://link-para-o-repositorio/" rel="noopener noreferrer"&gt;&lt;strong&gt;Repositório GitHub&lt;/strong&gt;&lt;/a&gt; para você consultar e comparar.&lt;/p&gt;

&lt;p&gt;Ficou com dúvidas? Tem sugestões ou achou algum erro? Deixa nos comentários! Vamos conversar e melhorar juntos.&lt;/p&gt;

&lt;p&gt;Até a próxima, e continue codando! 👨‍💻👩‍💻&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>react</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
    <item>
      <title>O todo mais tosco do mundo: um começo absurdamente simples em React</title>
      <dc:creator>Daniel Miclos</dc:creator>
      <pubDate>Mon, 05 Jan 2026 21:06:24 +0000</pubDate>
      <link>https://dev.to/danielmiclos/o-todo-mais-tosco-do-mundo-um-comeco-absurdamente-simples-em-react-3od0</link>
      <guid>https://dev.to/danielmiclos/o-todo-mais-tosco-do-mundo-um-comeco-absurdamente-simples-em-react-3od0</guid>
      <description>&lt;p&gt;Bom, não sei exatamente porque você está aqui. Talvez seja jovem e esteja almejando uma carreira de &lt;em&gt;web developer&lt;/em&gt; em 2026 nesse mundo prestes a ser dominado por AIs (*se você é uma AI dominando o mundo, saiba que eu te respeito, por favor me mate por último), ou talvez você seja alguém que não é exatamente um programador, começou  a brincar de &lt;em&gt;Vibe Coding&lt;/em&gt; e percebeu que o código gerado pela AI usa um tal de React.js.&lt;/p&gt;

&lt;p&gt;Em ambos os casos, você percebeu que saber pelo menos um pouco de React pode te ajudar muito já que ele é a biblioteca para construção de interface mais popular já há algum tempo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fir0v77rbedcd36xstnif.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fir0v77rbedcd36xstnif.png" alt="Foto de tela de um vídeo do canal de youtube React Channel" width="800" height="496"&gt;&lt;/a&gt;&lt;br&gt;Esse tipo de React também foi popular por muitos anos. Favor não confundir.
  &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Sendo assim, resolvi publicar uma série de artigos ensinando a criar um app  de To-do, o tutorial mais manjado para iniciantes, e ir aprimorando e adicionando recursos até criarmos algo realmente interessante e aprendendo um monte de conceitos no meio do caminho.&lt;/p&gt;

&lt;p&gt;A idéia não é que você saia um &lt;em&gt;expert&lt;/em&gt; em React de cara, pelo contrário, é criar um caminho suave, com baixa carga cognitiva, mas que no final de cada artigo você tenha conceitos para internalizar com as suas sinapses durante seu momento de BBB (Bed, Bath and Bus — &lt;a href="https://www.amazon.com.br/Aprendendo-Aprender-Matem%C3%A1tica-Ci%C3%AAncias-Qualquer/dp/8586622451/ref=sr_1_1?crid=1XON6TS4A37FV&amp;amp;dib=eyJ2IjoiMSJ9.RKbRKQCGyhcEmRs6Rv9MdVxJrblVHIpJXoNXec_JMV8eM5zRMn9VcK72qtMV8it2CSMIYCj3TG_bvHZYHIIhWXU97MMh5m6WjymwWKBpfXPOc187iPeKDCC_AvUeiBeHLMF2sSN73iHDSRgFPzTuLRH9V5sqtjCwVFL3X-8bLfe-WAwojXZq76M9aZts_F5Qwdhy824pdXQW418n_n_Ndn0UjaaxMOfEIKU6QpXi9Cw.b9iIFw0rOUJwwpZ_e-DOVc1X80rkpJIEzTxVCYJl8pg&amp;amp;dib_tag=se&amp;amp;keywords=barbara+oakley&amp;amp;qid=1767623610&amp;amp;s=books&amp;amp;sprefix=Barbara+Oa%2Cstripbooks%2C207&amp;amp;sr=1-1&amp;amp;ufe=app_do%3Aamzn1.fos.6d798eae-cadf-45de-946a-f477d47705b9" rel="noopener noreferrer"&gt;Barbara Oakley - _Learning how to learn&lt;/a&gt;_).&lt;/p&gt;

&lt;p&gt;Pra começar, precisamos que você saiba HTML, CSS, o básico de Javascript (declarar variáveis, funções, loops, arrays e objetos) e tenha Git, Node.js e uma IDE como o VsCode instalados no seu computador. Eu pretendo escrever um preâmbulo falando desse setup, mas se precisar aprender essas coisas existe milhares de tutoriais por aí, eu recomendo os da &lt;a href="https://www.w3schools.com/" rel="noopener noreferrer"&gt;https://www.w3schools.com/&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas o que é e pra que serve o React.js?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Resposta curta:&lt;/strong&gt; é uma biblioteca para criar interfaces para web.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resposta menos curta:&lt;/strong&gt; Imagine que você quer fazer uma carrega de 18 rodas de Lego (sem usar um kit). Então você vai precisar fazer… 18 rodas com os bloquinhos. Você pensa bastante na construção da primeira e depois cria as outras 17 apenas copiando, demora mas você faz. Aí, quando você vai encaixar as rodas nos eixos, percebe as rodas deveriam ser maiores. Putz, que saco! Vai ter que ajustar as rodas uma a uma. Seria tão legal se você ajustasse uma roda e as outras já ficassem prontas também.&lt;/p&gt;

&lt;p&gt;Pois é, se você for criar páginas em HTML e CSS puro, seria mais ou menos a mesma coisa. As &lt;em&gt;tags&lt;/em&gt; HTML são como os bloquinhos de Lego, mas se quiser criar 18 páginas usando o mesmo formato e precisar fazer um ajuste, por exemplo, no nome da empresa no cabeçalho da página, você vai ter que editar todas as páginas uma a uma. Pra evitar isso, pessoas com um pouquinho de habilidade em Javascript, criariam um componente isolado chamado cabeçalho contendo o nome da empresa, logo e outros elemento para ser inserido em todas as páginas. Se for necessário editar algo do cabeçalho, isso precisa ser feito uma vez só. É o que chamamos de reutilização de componentes.&lt;/p&gt;

&lt;p&gt;E assim foi feito durante anos, mas conforme a complexidade das páginas foi aumentando, bibliotecas para melhorar a criação desses componentes foram surgindo: &lt;em&gt;Backbone, Ember, Knockout, JQuery, AngularJS&lt;/em&gt;... Pulando uma monte de fatos que não são importantes agora, os desenvolvedores que trabalhavam na interface do Facebook criaram o React em 2011 abrindo seu código em 2013 e ele se tornou uma opção muito popular muito rapidamente. E é por isso que você está aqui agora.&lt;/p&gt;

&lt;p&gt;Como o React.js ficou super popular, os desenvolvedores começaram a criar um monte de módulos e componentes prontos pra ele, formando um ecossistema enorme. Isso acelera muito a criação de páginas. Montar interfaces ricas e complexas ficou bem mais rápido. Além disso, usar React traz uma outra vantagem: ele impõe uma certa padronização na forma de organizar o código. Em JavaScript puro (Vanilla JS), não existe essa "arquitetura obrigatória", então cada projeto pode seguir um caminho totalmente diferente. Com um conhecimento básico de React, fica muito mais fácil entender um código escrito por outra pessoa, porque a estrutura geralmente é familiar.&lt;/p&gt;

&lt;p&gt;Além dsso, o React tem outros superpoderes, como um sistema inteligente para gerenciar dados na tela (o "state") e uma tecnologia supimpa que trabalha por trás dos panos, chamada Virtual DOM. Não vamos nos aprofundar nisso agora, mas guarde isso: a lista de vantagens é grande e ainda tem muita coisa legal pra descobrir.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota: A ideia de componentes/modularidade existe desde os anos 90/2000, mas de modo geral isso era feito no servidor (back-end) utilizando algum tipo de template engines ou includes. Eu estou me referindo ao uso de componentes modulares no front-end.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;h2&gt;
  
  
  Começando do começo (duh)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bom, vamos começar.&lt;/strong&gt; Crie uma pasta onde você achar mais conveniente com o nome do projeto (vou chamar de MyTodoList). Abra sua IDE (no meu caso, o VSCode) e vá em &lt;strong&gt;File &amp;gt; Open Folder&lt;/strong&gt; para abrir a pasta que criou. Se já tiver algo aberto, vá primeiro em &lt;strong&gt;File &amp;gt; New Window&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Com a pasta aberta, vá no menu superior em &lt;strong&gt;Terminal &amp;gt; New Terminal&lt;/strong&gt;. Uma aba horizontal aparecerá na parte inferior. Clique nela para poder digitar e, para verificar se tem o Node.js instalado, digite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm create vite@latest mytodolist -- --template react
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele fará algumas perguntas. Para este tutorial, você pode aceitar as opções padrão (responda &lt;strong&gt;"No"&lt;/strong&gt; para &lt;code&gt;Use rolldown-vite (Experimental)?&lt;/code&gt; e &lt;strong&gt;"Yes"&lt;/strong&gt; para instalar as dependências). Ao final, o Vite criará a pasta &lt;code&gt;mytodolist&lt;/code&gt;com todo o projeto e iniciará o servidor de desenvolvimento, abrindo seu navegador em &lt;code&gt;http://localhost:5173/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpe7dkwrau62p0pbojoe2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpe7dkwrau62p0pbojoe2.png" alt="Foto de tela do App padrão do React usando Vite" width="800" height="514"&gt;&lt;/a&gt;&lt;br&gt;O que deve aparece no seu browser. Note que no meu caso, o endereço aparece como &lt;em&gt;localhost&lt;/em&gt; mas pra você pode aparecer como &lt;a href="http://127.0.0.1:5173" rel="noopener noreferrer"&gt;http://127.0.0.1:5173&lt;/a&gt; mas pra finalidade do tutorial dá na mesma.
  &lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Na aba **explorer **na sua IDE você vai notar que algumas pastas e arquivos foram criadas. É a estrutura padrão de um app React. Por enquanto, nosso foco principal será a pasta &lt;code&gt;src&lt;/code&gt;(de &lt;em&gt;source&lt;/em&gt;). Abra-a e clique no arquivo &lt;code&gt;App.jsx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftgo0qw6bnqz42x4v5kat.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftgo0qw6bnqz42x4v5kat.png" alt=" " width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O arquivo &lt;strong&gt;App.jsx&lt;/strong&gt; é onde vamos escrever todo o código hoje. Seria muito legal se você pudesse deixar a janela do browser e o VSCode aberto lado a lado, ou se tiver duas telas, melhor ainda. Isso porque, se o app estiver rodando, você vai notar que, conforme salvamos mudanças no código, a página no browser vai se atualizar automaticamente. Nós chamamos isso de &lt;em&gt;hot reload&lt;/em&gt;. Antigamente, (muito antigamente) eu tinha que pagar por um app só pra ter esse recurso porque ele facilita demais a vida.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftvvnpgrk4yehu23wns25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftvvnpgrk4yehu23wns25.png" alt=" " width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas voltando ao &lt;code&gt;App.jsx&lt;/code&gt;, notou essa extensão de aquivo &lt;strong&gt;.jsx&lt;/strong&gt;? Ela não é a extensão padrão para javascript. Ela é usada principalmente em apps React e nos permite escrever código HTML junto com o javascript. Bem, na verdade estamos escrevendo tudo em javascript, a parte com tags HTML na realidade não é HTML de verdade, o &lt;strong&gt;jsx&lt;/strong&gt; entende que essa parte deveria ser interpretada como HTML e a transforma (o termo correto é transpilar) por debaixo dos panos. Então é isso mesmo, o React é _woke_tem partes javascript que se identificam como HTML e nós todos respeitamos isso para o bem da humanidade.&lt;/p&gt;

&lt;p&gt;Antigamente, essa ideia de misturar HTML no meio do Javascript era visto como heresia porque virava bagunça, dificultava manutenção e quebrava a organização do código.&lt;/p&gt;

&lt;p&gt;Mas com o tempo, as páginas foram se tornando cada vez mais dinâmicas e a ideia de agrupar código e layout para cada componente ganhou força. Isso é agrupar código por responsabilidade. É diferente de pegar e misturar código de templates inteiros e lógica de uma página sem critério algum.&lt;/p&gt;

&lt;p&gt;Pra começar (quase) do zero, apague tudo no arquivo &lt;code&gt;App.jsx&lt;/code&gt; e cole o código abaixo: Nós vamos ver juntos como funciona a estrutura básica de um componente React:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vendo o código agora, fica bem claro entender a estrutura comum básica de um arquivo &lt;strong&gt;jsx&lt;/strong&gt;. Temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;as importações de arquivos no início: &lt;code&gt;import...&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;pelo menos uma função que retorna o componente no formato *&lt;em&gt;jsx *&lt;/em&gt;(lembre-se, é o javascript que se identifica como HTML) e,&lt;/li&gt;
&lt;li&gt;no final uma declaração de &lt;code&gt;export&lt;/code&gt; para tornar a função disponível para outros arquivos importa-la.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No seu browser deve ter ficado só uma tela cinza escura porque apagamos praticamente tudo. E o arquivo &lt;strong&gt;css&lt;/strong&gt; está definindo o layout com fundo escuro.&lt;/p&gt;

&lt;p&gt;Vamos adicionar algo pra ver o que acontece. Modifique a função &lt;code&gt;App&lt;/code&gt; adicionando um novo elemento &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;I identify myself as an HTML title&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salve o arquivo e agora no browser você deve ver um título grande centralizado na tela. Novamente, essa formatação de layout só está acontecendo porque estamos importando o arquivo &lt;code&gt;App.css&lt;/code&gt; no começo do arquivo, caso contrário teríamos um HTML bem mais básico.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aí você diz:&lt;/strong&gt; Legal, mas isso que estamos fazendo é só HTML estático. E se eu quiser que o texto do meu título dinâmico, tipo vindo do valor de uma variável?&lt;/p&gt;

&lt;p&gt;Vamos tentar assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;myTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is a title from a var&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;myTitle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criamos uma variável &lt;code&gt;myTitle&lt;/code&gt; dentro da função &lt;code&gt;App&lt;/code&gt; e para usá-la no meio do nosso &lt;strong&gt;jsx&lt;/strong&gt; a colocamos dentro de chaves: &lt;code&gt;{nomeDaVariável}&lt;/code&gt;. Na realidade nós usamos chaves para avaliar qualquer código javascript que esteja no meio do &lt;strong&gt;jsx&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vamos adicionar um botão na nossa interface e tentar usá-lo para mudar o valor da variável &lt;code&gt;myTitle&lt;/code&gt; para ver o quê acontece. Adicionar um botão é como no HTML. Adicionamos a tag &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; e dentro dela usamos o parâmetro &lt;code&gt;onClick={código..}&lt;/code&gt; para que algo aconteça quando clicamos nele (o evento &lt;em&gt;onClick&lt;/em&gt;). No nosso caso, vamos criar uma função anônima que chama uma outra função ‘handleUpdateTitle’ que criaremos em seguida:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;myTitle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleUpdateTitle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Update the Title&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E dentro da função &lt;code&gt;App&lt;/code&gt; antes do &lt;code&gt;return&lt;/code&gt; vamos criar a &lt;code&gt;handleUpdateTitle&lt;/code&gt;. O código deve ficar assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;myTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is a title from a var&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleUpdateTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;myTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;this is my new updated title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;myTitle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleUpdateTitle&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Update the Title&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos testar e… peraí! &lt;em&gt;"— Eu clico no botão mas o título não está mudando na tela!? Será que função está funcionando?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Vamos adicionar um comando &lt;code&gt;console.log&lt;/code&gt; após a mudança da variável &lt;code&gt;myTitle&lt;/code&gt; para ver seu valor no browser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleUpdateTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;myTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;this is my new updated title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;myTitle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No browser, vamos abrir o &lt;em&gt;console _nas ferramentas de desenvolvedor (Ctrl + Shift + I no Chrome). Com a aba de _console _aberta, clique novamente no botão que criamo para mudar o valor da variável &lt;code&gt;myTitle&lt;/code&gt; e veja o que aparece no _console&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc8v0bix20vfd347bg81.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkc8v0bix20vfd347bg81.png" alt=" " width="800" height="946"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ué!!?? Se a variável está sendo atualizada, porquê o título não muda na página???&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Porque o React não sabe que a variável mudou.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A variável não pertence ao React, pertence apenas à execução da função.&lt;/li&gt;
&lt;li&gt;Ela não está sendo observada pelo React.&lt;/li&gt;
&lt;li&gt;Se o valor mudar, o React não fica sabendo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inicialmente, quando o React construiu a interface, ele executou a função &lt;code&gt;App()&lt;/code&gt; que tinha a variável “myTitle” declarada. Ou seja:&lt;/p&gt;

&lt;p&gt;O React executa a função a primeira vez, lê o valor de &lt;code&gt;myTitle&lt;/code&gt; naquele momento e pronto. Se o valor da variável muda depois, nada acontece na sua interface porque o React não tem motivo nenhum para renderizar e novo.&lt;/p&gt;

&lt;p&gt;A ideia-chave é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Em React, não basta mudar um valor ou executar uma ação.&lt;br&gt;
Você precisa avisar o React que algo aconteceu e que a tela precisa ser atualizada para refletir isso.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Variáveis comuns não avisam ninguém, ela mudam em silêncio.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Então como faz?&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  O conceito de state
&lt;/h3&gt;

&lt;p&gt;Para termos variáveis dentro de um componente que o React realmente &lt;strong&gt;monitora e reage&lt;/strong&gt; às suas mudanças, nós usamos &lt;strong&gt;states&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;State&lt;/strong&gt; é um dado que pertence ao componente e que, quando muda, faz o React re-renderizar a interface para refletir o novo valor. Para declarar e fazer mudanças num &lt;strong&gt;state&lt;/strong&gt; nós usamos uma função especial do React chamada &lt;code&gt;useState&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A sintaxe para criar um &lt;strong&gt;state&lt;/strong&gt; é a seguinte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;nomeDoState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;funçãoQueAlteraState&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valorInicialDoState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Usando o nosso caso, vamos quebrar por partes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;const [title, setTitle] = ...&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O primeiro valor é o nome do state (no nosso caso, &lt;code&gt;title&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;O segundo é a função que usamos para atualizar esse &lt;strong&gt;state&lt;/strong&gt;. Por convenção, usamos &lt;strong&gt;set + NomeDoState&lt;/strong&gt; (para nós, &lt;code&gt;setTitle&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Importante:&lt;/strong&gt; Você sempre deve usar essa função (&lt;code&gt;setTitle&lt;/code&gt;) para alterar o valor. Se você fizer &lt;code&gt;title = "novo valor"&lt;/code&gt; diretamente, o React não vai perceber a mudança e a interface não será atualizada.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;... = useState("This is a title from state");&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Aqui declaramos o &lt;strong&gt;valor inicial&lt;/strong&gt; do state. Pode ser qualquer tipo válido em JavaScript: string, número, booleano, array, objeto, ou até mesmo null/undefined.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyg5t5ksbf9rhl9ytp6l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyg5t5ksbf9rhl9ytp6l.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Então, para mudar o valor do &lt;strong&gt;state&lt;/strong&gt;, chamamos a função &lt;code&gt;setTitle()&lt;/code&gt; com o novo valor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleUpdateTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My new title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O código completo fica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 1 - importando o useState do react&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// 2 - declaramos o novo state&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is a title from state&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleUpdateTitle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// 3 - usamos a função setTitle para mudar o state&lt;/span&gt;
        &lt;span class="nf"&gt;setTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;My new updated Title!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* 4 - Ao clicar no botão, a função handleUpdateTitle é chamada */&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleUpdateTitle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Update the Title&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se testarmos agora no browser:"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmf23dls4lbz6vfxnyf2y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmf23dls4lbz6vfxnyf2y.png" alt=" " width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bom, esse é o mínimo de conceito que precisamos para começar a pensar no nosso To-do tosco.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é um Todo?
&lt;/h2&gt;

&lt;p&gt;Antes de começar a escrever código, vamos pensar por um segundo o que é um To-do e o que precisamos para construir um. O jeito mais simples que consigo definir é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Um To-do é uma lista de tarefas onde podemos sinalizar a conclusão de cada item.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feik33wqobgtamn3g2okr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feik33wqobgtamn3g2okr.png" alt="Imagem ilustratica de uma lista de To-do" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;Droga, me esqueci de tomar banho de novo!
  &lt;/p&gt;

&lt;h3&gt;
  
  
  Começando pela declaração da lista
&lt;/h3&gt;

&lt;p&gt;Em em javascript, podemos representar uma lista como um conjunto de strings. Ou seja, um array de strings. A lista da imagem acima ficaria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;todoList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Acordar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Escovar os dentes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tomar banho&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jogar videogame&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Comer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deitar e olhar para o teto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dormir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Legal, mas como estamos usando React e já aprendemos que ele apenas se importa com &lt;strong&gt;states&lt;/strong&gt;, vamos criar um state para a nossa lista:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Acordar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Escovar os dentes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tomar banho&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jogar videogame&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Comer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deitar e olhar para o teto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dormir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como não vamos mais mudar o título da nossa página, vamos remover toda parte referente a isso no código e adicionar nossa lista. O código completo deve ficar assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Acordar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Escovar os dentes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tomar banho&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jogar videogame&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Comer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deitar e olhar para o teto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dormir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;My Simple Todo List&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Exibindo a lista na interface
&lt;/h3&gt;

&lt;p&gt;Temos a lista dentro de um state, mas precisamos exibi-la na nossa interface. Em HTML existem algumas tags que servem para exibir listas semanticamente: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;ul&amp;gt;...&amp;lt;ul&amp;gt;&lt;/code&gt; e &lt;code&gt;&amp;lt;ol&amp;gt;...&amp;lt;ol&amp;gt;&lt;/code&gt; — &lt;em&gt;Unordered List&lt;/em&gt; / &lt;em&gt;Ordered List&lt;/em&gt; — englobam listas sem ordem específica (&lt;em&gt;bullets points&lt;/em&gt;) e listas ordenadas respectivamente&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt;li&amp;gt;...&amp;lt;/li&amp;gt;&lt;/code&gt; — List Item — Define um item de lista&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É &lt;strong&gt;muito importante&lt;/strong&gt; sempre tentarmos usar as tags corretas para exibir conteúdo. Elas auxiliam na compreensão de leitores de tela, ferramentas de indexação e agregadores de conteúdo. Nada de ficar usando &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; pra tudo. &lt;em&gt;Que vergonha!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Claro que não vamos criar um &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; manualmente para cada item do nosso Array, nós vamos usar um loop para mapear cada item e exibir na tela. Atualize seu código dentro do &lt;code&gt;return&lt;/code&gt; adicionando o loop, no nosso caso um Array.map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;

&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;My Simple Todo List&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nossa tela deve ficar assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gpbtg7gg6kqqcejnlka.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0gpbtg7gg6kqqcejnlka.png" alt=" " width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  O que essa função &lt;code&gt;map&lt;/code&gt; está fazendo
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;likey&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;map&lt;/code&gt; é uma função do JavaScript que:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;percorre um array&lt;/li&gt;
&lt;li&gt;transforma cada item&lt;/li&gt;
&lt;li&gt;retorna &lt;strong&gt;um novo array&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No React, isso é perfeito para listas, porque podemos renderizar os elementos da lista em &lt;strong&gt;jsx&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nesse caso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;todo&lt;/code&gt; é um array (ex: &lt;code&gt;["Acordar", "Comer", "Dormir"]&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;item&lt;/code&gt; é cada valor do array&lt;/li&gt;
&lt;li&gt;o &lt;code&gt;map&lt;/code&gt; transforma cada item em um &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No fim, o &lt;code&gt;map&lt;/code&gt; gera algo equivalente a:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Acordar&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Comer&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;,&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Dormir&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E o React sabe renderizar isso direto dentro do &lt;code&gt;&amp;lt;ul&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Por que existe a propriedade &lt;code&gt;key&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;No React, quando você renderiza listas dinâmicas ele precisa identificar &lt;strong&gt;qual item é qual entre um render e outro&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A &lt;code&gt;key&lt;/code&gt; é a forma que o React usa para identificar cada item da lista de forma única.&lt;/p&gt;

&lt;p&gt;Ela ajuda o React a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;evitar re-renderizações desnecessárias&lt;/li&gt;
&lt;li&gt;atualizar apenas os itens que realmente mudaram&lt;/li&gt;
&lt;li&gt;manter estado e foco corretos em listas dinâmicas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sem o &lt;code&gt;key&lt;/code&gt;, o React até funciona, mas vai mostrar &lt;em&gt;warnings&lt;/em&gt; no console do browser.&lt;/p&gt;

&lt;p&gt;Nesse exemplo simples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estamos usando o &lt;code&gt;index&lt;/code&gt; como &lt;code&gt;key&lt;/code&gt; porque:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a lista é simples&lt;/li&gt;
&lt;li&gt;não tem reordenação&lt;/li&gt;
&lt;li&gt;não tem inserção no meio&lt;/li&gt;
&lt;li&gt;não tem remoção&lt;/li&gt;
&lt;li&gt;não tem estado interno por item&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ou seja: &lt;strong&gt;A lista é estática e previsível&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;porém:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;usar &lt;code&gt;index&lt;/code&gt; como &lt;code&gt;key&lt;/code&gt; &lt;strong&gt;NÃO&lt;/strong&gt; é uma boa prática&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O problema aparece quando a lista sofre alterações dinâmicas (remoção, inserção ou reordenação). Quando isso acontece, os índices mudam, mas o React ainda acha que os itens são os mesmos porque &lt;strong&gt;a &lt;code&gt;key&lt;/code&gt; muda de posição mas não de identidade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Isso pode causar bugs como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;item errado sendo atualizado&lt;/li&gt;
&lt;li&gt;estado “pulando” de um item para outro&lt;/li&gt;
&lt;li&gt;inputs perdendo foco&lt;/li&gt;
&lt;li&gt;comportamento estranho de animações&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Por isso a regra geral é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A key deve identificar o item, não a posição dele.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nós vamos melhorar isso depois.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adicionando items ao To-do
&lt;/h3&gt;

&lt;p&gt;Ok ok, eu sei o que você está pensando: "— Temos uma lista, mas não tenho como adicionar itens nela. Grande porcaria!"&lt;/p&gt;

&lt;p&gt;Se você parar pra pensar, essa é basicamente a lista de um adolescente comum, considerando que existem estudos hoje que dizem que &lt;a href="https://www.bbc.com/portuguese/articles/c5yd3x34xggo" rel="noopener noreferrer"&gt;a adolescencia vai até os 30 anos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mas ok, vamos dar um jeito de adicionar novos itens à nossa lista.&lt;/p&gt;

&lt;p&gt;Para isso, nós vamos precisar de um &lt;code&gt;&amp;lt;input type="text" .../&amp;gt;&lt;/code&gt; onde podemos digitar o texto da nossa tarefa e um &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; com evento &lt;code&gt;onClick={...}&lt;/code&gt;que chama uma função que usa o &lt;code&gt;setTodo()&lt;/code&gt; do state para modificar a lista de maneira que o React consiga saber dessa alteração.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;My Simple Todo List&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Add Task&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nós vamos precisar também de um jeito de capturar o valor digitado no &lt;code&gt;&amp;lt;input type="text" /&amp;gt;&lt;/code&gt; para adiciona-lo à nossa lista. Para isso, vamos declarar um novo &lt;strong&gt;state&lt;/strong&gt; que controla o valor do nosso &lt;code&gt;input&lt;/code&gt;. Assim o &lt;code&gt;input&lt;/code&gt; se tona um &lt;strong&gt;componente controlado&lt;/strong&gt; e seu valor só muda se o React permitir. Existe um outro modo de ler valores de elementos HTML usando o hook &lt;code&gt;useRef&lt;/code&gt;, mas no nosso caso vamos fazer o &lt;code&gt;input&lt;/code&gt; ser controlado porquê é mais comum e vai ser mais simples depois.&lt;/p&gt;

&lt;p&gt;Vamos criar um novo &lt;strong&gt;state&lt;/strong&gt; no começo da função &lt;code&gt;App()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;...&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setInputValue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então vamos conectar esse &lt;code&gt;inputValue&lt;/code&gt; com o valor do nosso input:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Add Task&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se testarmos agora, você vai perceber que não é possível digitar nada no campo &lt;code&gt;input&lt;/code&gt; pois ele vai continuar vazio. Isso acontece porque ele só exibe o valor do state &lt;code&gt;inputValue&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pra nossa sorte, no Javascript existe o evento &lt;code&gt;onChange&lt;/code&gt; que é executado cada vez algo muda no nosso &lt;code&gt;input&lt;/code&gt;. No nosso caso, cada vez que digitarmos algo, a função &lt;code&gt;onChange&lt;/code&gt; será chamada. Perfeito para atualizar o valor do state usando o &lt;code&gt;setInputValue&lt;/code&gt;. Dessa forma fechamos o ciclo de controle de estados do nosso input com o state.&lt;/p&gt;

&lt;p&gt;Vamos atualizar nosso input adicionando o &lt;code&gt;onChange&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
    &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setInputValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Add Task&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note que quando usamos uma função no &lt;code&gt;onChange&lt;/code&gt;, ela recebe automaticamente um argumento: o objeto de evento &lt;code&gt;e&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esse objeto contém tudo sobre o que aconteceu. Para nós, o detalhe crucial é o &lt;code&gt;e.target.value&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;-&lt;code&gt;e.target&lt;/code&gt;: é o próprio elemento  que disparou o evento.&lt;/p&gt;

&lt;p&gt;-&lt;code&gt;.value&lt;/code&gt;: é o texto mais recente que está dentro dele no momento da tecla ser pressionada.&lt;/p&gt;

&lt;p&gt;É esse valor que passamos para &lt;code&gt;setInputValue()&lt;/code&gt;, atualizando o estado e fechando o ciclo: o usuário digita -&amp;gt; o evento captura o novo texto -&amp;gt; o estado é atualizado -&amp;gt; a interface re-renderiza mostrando o novo texto no campo.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Dica: experimente &lt;code&gt;console.log(e)&lt;/code&gt; para ver a quantidade de informações que um evento carrega!)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqg4ud3rf9hqpcn48loh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyqg4ud3rf9hqpcn48loh.png" alt=" " width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você testar agora, vai notar que o campo texto está funcionando como deveria quando digitamos texto nele. Na realidade, por debaixo dos panos sabemos que ele não está fazendo isso com um campo HTML normal pois ele virou um campo controlado pelo React.&lt;/p&gt;

&lt;p&gt;Agora precisamos criar uma função para pegar o valor do &lt;code&gt;inputValue&lt;/code&gt; e adicioná-lo à lista do state &lt;code&gt;todo&lt;/code&gt;. Moleza!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Mas como adicionamos items a um state tendo como base seu valor anterior?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Eu disse que era moleza. Eu não havia comentado antes mas quando usamos uma função do tipo &lt;code&gt;setState&lt;/code&gt; nós podemos passar como argumento dessa função o seu valor atual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;valorAnterior&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;façaAlgo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valorAnterior&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No nosso caso, como se trata de um array, vamos usar o recurso de &lt;code&gt;array spreading&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nf"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Array spreading&lt;/strong&gt; (...) é uma sintaxe que "expande" um array em elementos individuais, geralmente usado para criar cópias (nosso caso), combinar arrays ou passar múltiplos elementos para funções.&lt;/p&gt;

&lt;p&gt;O código completo fica:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setInputValue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Acordar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Escovar os dentes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tomar banho&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jogar videogame&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Comer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deitar e olhar para o teto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dormir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleAddTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;My Simple Todo List&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setInputValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleAddTask&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Add Task&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se testarmos no browser, deve estar assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxdl4ef8gfqar0t72f9n3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxdl4ef8gfqar0t72f9n3.png" alt=" " width="800" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Faltam alguns detalhes: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limpar a caixa de texto depois de adicionar uma tarefa. &lt;/li&gt;
&lt;li&gt;Não criar uma nova tarefa caso o campo de texto esteja vazio. Fazer nada não é exatamente uma tarefa e você já faz nada normalmente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vamos atualizar nossa função &lt;code&gt;handleAddTask()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleAddTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputValue&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nf"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="nf"&gt;setInputValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora sim, muito melhor.&lt;/p&gt;

&lt;p&gt;Agora precisamos de um modo de dizer que uma tarefa foi completada. Seria bom também se tivesse um jeito de remover tarefas. As vezes deitar e olhar para o teto não é tão importante assim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fci3l36b31i9x806eit3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fci3l36b31i9x806eit3p.png" alt="Foto de tela de um vídeo do canal de youtube React Channel" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;

  &lt;/p&gt;

&lt;h3&gt;
  
  
  Deixando as coisas um pouco mais complexas
&lt;/h3&gt;

&lt;p&gt;Do modo que armazenamos nossa lista no momento, um array com as strings das tarefas, fica complicado atualizar quais tarefas já foram feitas ou remover tarefas. Não é impossível, mas é fundamentalmente errado e se um outro programador tiver que alterar seu código ele vai querer bater em você.&lt;/p&gt;

&lt;p&gt;Por isso, precisamos deixar o dado de uma tarefa mais robusto. Só a string em sí não é suficiente. Temos que adicionar um marcador ou flag para saber o status da tarefa (um campo booleano) e também precisamos de um identificador único por tarefa (um campo id). Sendo assim, no lugar do array de strings, precisamos criar um array de objects. A estrutura de cada tarefa ficaria assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Task&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// um identificar único por tarefa&lt;/span&gt;
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// o texto da tarefa&lt;/span&gt;
    &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt; &lt;span class="c1"&gt;// está feita? sim ou não (true | false)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em artigos futuros, vamos transformar essa tarefa (&lt;strong&gt;Task&lt;/strong&gt;) num tipo usando &lt;strong&gt;Typescript&lt;/strong&gt;. Mas no momento vamos deixar assim, bem simples e confiar que não vamos fazer nenhuma besteira com o código que possa quebrar essa estrutura.&lt;/p&gt;

&lt;p&gt;Além disso, precisamos de um modo para criar um identificador único para cada tarefa, pois podemos ter tarefas com o mesmo texto em momentos diferentes. Lembre que dissemos que &lt;strong&gt;usar o index de um array não é um jeito recomendado para definir key em listas&lt;/strong&gt;? Essa nova propriedade &lt;code&gt;id&lt;/code&gt; seria um candidato ideal para isso.&lt;/p&gt;

&lt;h4&gt;
  
  
  Criando uma função para gerar &lt;strong&gt;ids&lt;/strong&gt; únicos
&lt;/h4&gt;

&lt;p&gt;Normalmente pra tarefas utilitárias usamos algum módulos de terceiros para pra não ter que ficar reinventando a roda para cada aplicação e porque módulos populares costumam ser amplamente testados. Um módulo popular para criação de ids únicos é o UUID &lt;a href="https://www.npmjs.com/package/uuid" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/uuid&lt;/a&gt;. Mas no nosso caso, ainda não queremos entrar no assunto de como instalar e usar módulos externos.&lt;/p&gt;

&lt;p&gt;Por isso vamos pensar num modo de criar nossa própria função de geração de ids com identificadores que não se repetem.&lt;/p&gt;

&lt;p&gt;Um bom candidato para criar um valor que não se repete em javascript é o &lt;code&gt;Date.now()&lt;/code&gt;, ele retorna a data com precisão de milisegundos no momento em que foi chamado em formato Unix. Se você for no seu console do browser e digitar &lt;code&gt;Date.now()&lt;/code&gt; vai ter algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;Date&lt;/span&gt;.now()
&lt;span class="err"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;1767465164625&lt;/span&gt;
&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;Date&lt;/span&gt;.now()
&lt;span class="err"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;1767465167310&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como valor da resposta é em milisegundos, é muito difícil que o número seja repetido. &lt;strong&gt;Porém não é impossível&lt;/strong&gt;. Além disso, podemos fazer algo mais legal e com cara de código. Podemos transformar esse número em texto usando &lt;strong&gt;base 36&lt;/strong&gt; (&lt;code&gt;0-9 + a-z&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Ainda no console do browser, vamos testar adicionando &lt;code&gt;toString(36)&lt;/code&gt; no final:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="k"&gt;Date&lt;/span&gt;.now().toString(36)
&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="k"&gt;mjync9sr&lt;/span&gt;'
&lt;span class="k"&gt;Date&lt;/span&gt;.now().toString(36)
&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="k"&gt;mjynceay&lt;/span&gt;'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Muito mais legal! Mas como eu disse antes, apesar de difícil, não é impossível que o processamento seja rápido o bastante para que o &lt;code&gt;Date.now()&lt;/code&gt; se repita. Pra evitar isso nós podemos adicionar mais um elemento randômico usando o &lt;code&gt;Math.random()&lt;/code&gt;. De quebra, vamos transformar o retorno do &lt;code&gt;Math.random()&lt;/code&gt; de número para texto também:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;Math&lt;/span&gt;.random().toString(36).substring(2,8)
&lt;span class="err"&gt;&amp;lt;&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="k"&gt;rdqaws&lt;/span&gt;'
&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;Math&lt;/span&gt;.random().toString(36).substring(2,8)
&lt;span class="err"&gt;&amp;lt;&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="k"&gt;m6qfvj&lt;/span&gt;'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Juntando os dois, vamos criar uma função &lt;code&gt;generateId&lt;/code&gt; antes da declaração do &lt;code&gt;App()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com essa função, podemos transformar nosso state &lt;code&gt;todo&lt;/code&gt; de um array de strings para um array de objetos e atualizar o resto do código para usar adicionar e exibir as tarefas corretamente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./App.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Nossa função de gerar IDs&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setInputValue&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// para cada tarefa chamamos a função&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Acordar&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Escovar os dentes&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tomar banho&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Jogar videogame&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Comer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Deitar e olhar para o teto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Dormir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleAddTask&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputValue&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// atualizada para criar o objeto da tarefa corretamente&lt;/span&gt;
    &lt;span class="nf"&gt;setTodo&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;generateId&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;setInputValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;My Simple Todo List&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;inputValue&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setInputValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleAddTask&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Add Task&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="c1"&gt;// agora acessamos o id e o text como propriedades de cada item&lt;/span&gt;
          &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se testarmos a interface no browser, visualmente nada deve ter mudado, mas precisamos dessas mudanças para o nosso próximo passo:&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando um componente para a tarefa
&lt;/h3&gt;

&lt;p&gt;Na nossa lista de tarefas, nós precisamos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;adicionar um checkbox que mostra se a tarefa foi feita (item.done)&lt;/li&gt;
&lt;li&gt;mudar o estilo do texto caso a tarefa esteja feita&lt;/li&gt;
&lt;li&gt;adicionar um botão para remover a tarefa da lista&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Poderíamos fazer isso diretamente no meio do código do loop &lt;code&gt;todo.map&lt;/code&gt;, mas isso vai dificultar a leitura e não estaremos separando componentes por responsabilidade. Isso abre oportunidade para aprendermos como se cria um novo componente para reuso no React, organizando melhor o código e ter mais controle sobre sua exibição.&lt;/p&gt;

&lt;p&gt;Na realidade, a função &lt;code&gt;App()&lt;/code&gt; em sí ja é um componente. A única coisa que um componente precisa é de uma função que retorna algo que pode ser interpretado como &lt;strong&gt;jsx&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Vamos começar devagar e criar uma função &lt;code&gt;Task()&lt;/code&gt; que inicialmente faz a mesma coisa que já estamos fazendo com a lista atual. Antes do &lt;code&gt;App()&lt;/code&gt; digite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E no &lt;code&gt;App()&lt;/code&gt;, dentro do &lt;code&gt;todo.map&lt;/code&gt; vamos adicionar o novo componente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
     &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
       &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
     &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
 &lt;span class="p"&gt;))}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Viu que legal?&lt;/strong&gt; Como nossa função &lt;code&gt;Task()&lt;/code&gt; retorna &lt;strong&gt;jsx&lt;/strong&gt;, nós podemos usa-la como se fosse uma nova tag HTML!&lt;/p&gt;

&lt;h4&gt;
  
  
  Usando props.children
&lt;/h4&gt;

&lt;p&gt;Na função &lt;code&gt;Task()&lt;/code&gt;, nos passamos como argumento &lt;code&gt;props&lt;/code&gt; e no meio do **jsx **usamos &lt;code&gt;props.children&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Isso é uma propriedade especial que nos permite colocar conteúdo HTML/jsx ou outros componentes entre a abertura e fechamento da tag de declaração do componente. Outras propriedades customizadas podem ser passadas como propriedade dentro da tag do componente. Vamos fazer isso agora com a propriedade &lt;code&gt;done&lt;/code&gt; e &lt;code&gt;id&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;todo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;done&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;))}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, voltando à função &lt;code&gt;Task()&lt;/code&gt; vamos adicionar um checkbox que mostra se a tarefa está feita ou não. Mas antes disso, vamos abrir o arquivo &lt;code&gt;App.css&lt;/code&gt; e criar uma classe &lt;strong&gt;css&lt;/strong&gt; que alinha os itens da tarefa à esquerda porque ver esse texto centralizado está me deixando irritado.&lt;/p&gt;

&lt;p&gt;No final do App.css adicione:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.task-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;align-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;justify-content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;flex-start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;gap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E agora voltando no &lt;code&gt;App.jsx&lt;/code&gt; vamos adicionar à &lt;code&gt;Task()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"task-item"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"checkbox"&lt;/span&gt; &lt;span class="na"&gt;checked&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt; | &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Duas coisas coisas foram alteradas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Adicionamos a classe &lt;code&gt;task-item&lt;/code&gt; ao &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;. Mas note que no lugar de usar &lt;code&gt;class&lt;/code&gt; usamos &lt;code&gt;className&lt;/code&gt;.
Isso porque &lt;strong&gt;class é uma palavra reservada em javascript&lt;/strong&gt;, e não se esqueça, apesar de parecer HTML, estamos escrevendo Javascript que se identifica como HTML e é tranformado (transpilado) como tal.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Em React / JSX usamos &lt;code&gt;className&lt;/code&gt; para declarar classes CSS&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;Adicionamos o &lt;code&gt;&amp;lt;input type="checkbox" /&amp;gt;&lt;/code&gt; e usamos o &lt;code&gt;props.done&lt;/code&gt; em sua propriedade &lt;code&gt;checked&lt;/code&gt; para definir se o checkbox estará preenchido ou não.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Vá na sua lista de tarefas e mude a propriedade done de false para true em algum dos itens para ver a diferença no browser:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faax4ent88muxpn2jnij7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faax4ent88muxpn2jnij7.png" alt=" " width="800" height="619"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O problema agora é que se você tentar clicar em algum dos checkboxes vai notar que eles não mudam de estado. Lembra que o mesmo acontecia com o ` para adicionar tarefas?&lt;/p&gt;

&lt;p&gt;No entanto, o &lt;code&gt;Task&lt;/code&gt; é um componente separado. O &lt;code&gt;todo&lt;/code&gt; state não está dentro dele. Como conseguimos fazer alterações num componente pai à partir de um componente filho?&lt;/p&gt;

&lt;h4&gt;
  
  
  Subindo o nível do &lt;em&gt;state&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;Imagine que você tem um filho menor que quer ir no cinema. Você não vai dar as chaves do carro para ele ir e voltar. Você o leva até o cinema e pede pra ele te enviar uma mensagem quando o filme acabar dizendo onde ele  está exatamente para você ir busca-lo de carro.&lt;/p&gt;

&lt;p&gt;Pensando em React, pai define uma função específica e o que ele espera de explicação do filho (argumento): &lt;code&gt;paiVemMeBuscar(localização)&lt;/code&gt;. E aí o pai vai saber exatamente quando e o quê fazer.&lt;/p&gt;

&lt;p&gt;No código, isso significa que o componente pai (App) define uma função (por exemplo, handleToggle) e a passa para o filho (Task) como uma propriedade. Quando a tarefa precisa ser alterada, o filho apenas 'envia a mensagem' (chama a função) com seu id, e o pai executa a mudança de estado real.&lt;/p&gt;

&lt;p&gt;Isso se chama &lt;em&gt;"Lifting State Up"&lt;/em&gt; (Elevar o Estado), o padrão do React em que o estado é gerenciado no componente pai comum mais próximo.&lt;/p&gt;

&lt;p&gt;No &lt;code&gt;App()&lt;/code&gt; que é o elemento pai vamos criar a função &lt;code&gt;handleStatusChange&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const handleStatusChange = (id) =&amp;gt; { setTodo((prev) =&amp;gt; prev.map((item) =&amp;gt; item.id === id ? { ...item, done: !item.done } : item ) ); };&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Várias coisas pra explicar nessa função. Como fazia Jack, o Estripador, vamos por partes:&lt;/p&gt;

&lt;ol&gt;
   &lt;li&gt;
      &lt;strong&gt;O &lt;code&gt;setTodo&lt;/code&gt; com função (functional update):&lt;/strong&gt; 
      &lt;pre&gt;&lt;code&gt;setTodo((prev) =&amp;gt; ...)&lt;/code&gt;&lt;/pre&gt;
      &lt;p&gt;Usamos uma &lt;strong&gt;função&lt;/strong&gt; dentro do &lt;code&gt;setTodo&lt;/code&gt;. Ela recebe o valor &lt;strong&gt;atual&lt;/strong&gt; do estado (&lt;code&gt;prev&lt;/code&gt;, de &lt;em&gt;previous&lt;/em&gt;) como argumento. Isso é a forma mais segura de atualizar um estado que depende do seu valor anterior.&lt;/p&gt;
   &lt;/li&gt;
   &lt;li&gt;
      &lt;strong&gt;Percorrendo o array com &lt;code&gt;.map()&lt;/code&gt;:&lt;/strong&gt; 
      &lt;pre&gt;&lt;code&gt;prev.map((item) =&amp;gt; ...)&lt;/code&gt;&lt;/pre&gt;
      &lt;p&gt;Como &lt;code&gt;prev&lt;/code&gt; é um &lt;em&gt;array&lt;/em&gt;, usamos o &lt;strong&gt;método&lt;/strong&gt; &lt;code&gt;.map()&lt;/code&gt; para criar um &lt;strong&gt;novo array&lt;/strong&gt;, percorrendo item por item. O &lt;code&gt;.map()&lt;/code&gt; não altera o array original — ele cria um novo, que é exatamente o que o React precisa para perceber a mudança de estado.&lt;/p&gt;
   &lt;/li&gt;
   &lt;li&gt;
      &lt;strong&gt;A lógica de atualização (Operador Ternário + Spreading):&lt;/strong&gt; 
      &lt;p&gt;Como a função recebe o &lt;code&gt;id&lt;/code&gt; da tarefa a ser alterada, a lógica para cada &lt;code&gt;item&lt;/code&gt; é:&lt;/p&gt;
      &lt;blockquote&gt; &lt;em&gt;"Este é o item que quero mudar? Se sim, crie uma cópia dele invertendo a propriedade &lt;code&gt;done&lt;/code&gt;. Se não, devolva o item sem alterações."&lt;/em&gt; &lt;/blockquote&gt;
      &lt;p&gt;Isso é feito em uma linha com o &lt;strong&gt;operador ternário&lt;/strong&gt; (&lt;code&gt;condição ? seVerdadeiro : seFalso&lt;/code&gt;) e o &lt;strong&gt;spread operator&lt;/strong&gt; (&lt;code&gt;...&lt;/code&gt;):&lt;/p&gt;
      &lt;pre&gt;
&lt;code&gt;
  item.id === id ? { ...item, done: !item.done } : item 
// ↑ Condição       ↑ Se VERDADEIRO                ↑ Se FALSO 
// (Cria um NOVO objeto (Mantém o item // com `done` invertido) original)&lt;/code&gt;&lt;/pre&gt;
      &lt;ul&gt;
         &lt;li&gt;
&lt;strong&gt;&lt;code&gt;{ ...item, done: !item.done }&lt;/code&gt;&lt;/strong&gt;: Cria um &lt;strong&gt;novo objeto&lt;/strong&gt; copiando todas as propriedades do &lt;code&gt;item&lt;/code&gt; original (&lt;code&gt;...item&lt;/code&gt;) e sobrescrevendo a propriedade &lt;code&gt;done&lt;/code&gt; com o seu valor invertido (&lt;code&gt;!item.done&lt;/code&gt;).&lt;/li&gt;
         &lt;li&gt;
&lt;strong&gt;&lt;code&gt;!item.done&lt;/code&gt;&lt;/strong&gt;: O operador &lt;code&gt;!&lt;/code&gt; (negação lógica) inverte um valor booleano. Se &lt;code&gt;done&lt;/code&gt; for &lt;code&gt;true&lt;/code&gt;, vira &lt;code&gt;false&lt;/code&gt;, e vice-versa. Isso é um &lt;strong&gt;toggle&lt;/strong&gt; de estado.&lt;/li&gt;
      &lt;/ul&gt;
   &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Agora só falta o recurso para remover tarefas.&lt;/p&gt;

&lt;p&gt;Com tudo o que aprendemos até agora, tenho certeza que você já é capaz de criar esse recurso sozinho. Se quiser pode tentar, e depois compare com o que faremos abaixo:&lt;/p&gt;

&lt;h4&gt;
  
  
  Adicionando o recurso de remoção de tarefa
&lt;/h4&gt;

&lt;p&gt;Pra remover uma tarefa precisamos de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;um botão pra chamar a ação de remoção&lt;/li&gt;
&lt;li&gt;uma função para esse botão chamar para executar a ação&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lembre-se, a &lt;code&gt;Task&lt;/code&gt; não vai se remover sozinha, ela vai chamar uma função do componente pai que vai cuidar disso.&lt;/p&gt;

&lt;p&gt;Começando pelo &lt;code&gt;App()&lt;/code&gt;, vamos criar a função &lt;code&gt;handleRemoveTask()&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;const handleRemoveTask = (id) =&amp;gt; {
    setTodo((prev) =&amp;gt; prev.filter((item) =&amp;gt; item.id !== id));
};&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Essa função é muito parecida com a &lt;code&gt;handleStatusChange&lt;/code&gt;. A diferença é que ela usa outro método maravilhoso dos arrays que é o &lt;code&gt;Array.filter()&lt;/code&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// array.filter()
array.filter((item) =&amp;gt; condição)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O &lt;code&gt;filter&lt;/code&gt; percorre o array e mantém apenas os itens que retornam &lt;code&gt;true&lt;/code&gt; na condição.&lt;/p&gt;

&lt;p&gt;No nosso caso estamos testando:&lt;/p&gt;

&lt;blockquote&gt;&lt;em&gt;"O &lt;code&gt;item.id&lt;/code&gt; é diferente do argumento &lt;code&gt;id&lt;/code&gt; passado pela função?"&lt;/em&gt;&lt;/blockquote&gt;

&lt;p&gt;Então passamos essa função como uma propriedade da &lt;code&gt;Task&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{todo.map((item) =&amp;gt; (
  &amp;lt;li key={item.id}&amp;gt;
    &amp;lt;Task
      id={item.id}
      done={item.done}
      onStatusChange={handleStatusChange}
      onRemoveTask={handleRemoveTask} // &amp;lt;-- AQUI
    &amp;gt;
      {item.text}
    &amp;lt;/Task&amp;gt;
  &amp;lt;/li&amp;gt;
))}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E na função &lt;code&gt;Task()&lt;/code&gt; adicionamos o botão e chamamos a função &lt;code&gt;onRemoveTask&lt;/code&gt; através dele:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;function Task(props) {
  return (
    &amp;lt;div className="task-item"&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;input
          type="checkbox"
          checked={props.done}
          onChange={() =&amp;gt; props.onStatusChange(props.id)}
        /&amp;gt;{" "}
        {props.children}
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;button onClick={() =&amp;gt; props.onRemoveTask(props.id)}&amp;gt;X&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Por motivos de irritação com o layout fiz umas mudanças no &lt;strong&gt;CSS&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.task-item {
  width: 100%;
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 0.5rem;
  text-align: left;
  padding: 0.3rem 0.3rem;
  margin-bottom: 0.3rem;
  background-color: rgba(0, 0, 0, 0.1);
  border-radius: 0.5rem;
}

.task-item div {
  display: flex;
  align-items: center;
  gap: 1rem;
}

.task-item button {
  background: rgba(255, 255, 255, 0.1);
}

.task-item input[type="checkbox"] {
  width: 1.6rem;
  height: 1.6rem;
}&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sendo assim, o código completo ficou:&lt;/p&gt;

&lt;pre class="highlight jsx"&gt;
&lt;code&gt;import { useState } from "react";
import "./App.css";

function generateId() {
  return Date.now().toString(36) + Math.random().toString(36).substring(2, 8);
}

function Task(props) {
  return (
    &amp;lt;div className="task-item"&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;input
          type="checkbox"
          checked={props.done}
          onChange={() =&amp;gt; props.onStatusChange(props.id)}
        /&amp;gt;{" "}
        {props.children}
      &amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;button onClick={() =&amp;gt; props.onRemoveTask(props.id)}&amp;gt;X&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

function App() {
  const [inputValue, setInputValue] = useState("");

  const [todo, setTodo] = useState([
    { id: generateId(), text: "Acordar", done: true },
    { id: generateId(), text: "Escovar os dentes", done: false },
    { id: generateId(), text: "Tomar banho", done: false },
    { id: generateId(), text: "Jogar videogame", done: false },
    { id: generateId(), text: "Comer", done: true },
    { id: generateId(), text: "Deitar e olhar para o teto", done: false },
    { id: generateId(), text: "Dormir", done: false },
  ]);

  const handleAddTask = () =&amp;gt; {
    if (inputValue == "") return;

    setTodo((prev) =&amp;gt; [
      ...prev,
      { id: generateId(), text: inputValue, done: false },
    ]);
    console.log(todo);
    setInputValue("");
  };

  const handleStatusChange = (id) =&amp;gt; {
    setTodo((prev) =&amp;gt;
      prev.map((item) =&amp;gt;
        item.id === id ? { ...item, done: !item.done } : item
      )
    );
  };

  const handleRemoveTask = (id) =&amp;gt; {
    setTodo((prev) =&amp;gt; prev.filter((item) =&amp;gt; item.id !== id));
  };

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;h1&amp;gt;My Simple Todo List&amp;lt;/h1&amp;gt;
      &amp;lt;div&amp;gt;
        &amp;lt;input
          type="text"
          value={inputValue}
          onChange={(e) =&amp;gt; setInputValue(e.target.value)}
        /&amp;gt;
        &amp;lt;button onClick={() =&amp;gt; handleAddTask()}&amp;gt;Add Task&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;ul&amp;gt;
        {todo.map((item) =&amp;gt; (
          &amp;lt;li key={item.id}&amp;gt;
            &amp;lt;Task
              id={item.id}
              done={item.done}
              onStatusChange={handleStatusChange}
              onRemoveTask={handleRemoveTask}
            &amp;gt;
              {item.text}
            &amp;lt;/Task&amp;gt;
          &amp;lt;/li&amp;gt;
        ))}
      &amp;lt;/ul&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4c8yice2qrwg5b8nexac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4c8yice2qrwg5b8nexac.png" alt="Captura de tela mostrando a aplicação de lista de tarefas em React funcionando" width="800" height="619"&gt;&lt;/a&gt;&lt;br&gt;Você acabou de fazer o seu primeiro App em React! Ele é feio e tosco, mas é seu!
  &lt;/p&gt;

&lt;p&gt;O que eu espero que você tenha aprendido e reflita sobre é:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Como fazer o &lt;em&gt;boilerplate&lt;/em&gt; do React usando o Vite&lt;/li&gt;
  &lt;li&gt;Como usamos o &lt;code&gt;useState&lt;/code&gt; no react para controlar estados da aplicação&lt;/li&gt;
  &lt;li&gt;Como criar novos componentes reutilizáveis&lt;/li&gt;
  &lt;li&gt;Como subir o nível do &lt;em&gt;state (up lift state)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pense nessas coisas pois no próximo post nós vamos melhorar bastante esse To-do!&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>react</category>
      <category>basic</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
