<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Caroline Andrade - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Caroline Andrade - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 19:55:28 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/caroline/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Aprenda a criar uma aplicação de bate-papo em React em 10 minutos – um tutorial de React ]]>
                </title>
                <description>
                    <![CDATA[ Clique aqui para acessar o curso completo [https://scrimba.com/g/greactchatkit?utm_source=freecodecamp.org&utm_medium=referral&utm_campaign=greactchatkit_10_minute_article]  (em inglês) no qual este artigo é baseado.Neste artigo, mostrarei a maneira mais fácil possível de se criar uma aplicação de bate-papo usando o React.js. Isso será feito totalmente sem código do lado do servidor, pois deixaremos a API do Chatkit ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/aprenda-a-criar-uma-aplicacao-de-bate-papo-em-react-em-10-minutos-um-tutorial-de-react/</link>
                <guid isPermaLink="false">65ccc78041193b03f653ffa4</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Caroline Andrade ]]>
                </dc:creator>
                <pubDate>Tue, 28 May 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_SUeSr13iO7yJfIf4ipaeFg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-build-a-react-js-chat-app-in-10-minutes-c9233794642b/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Learn to build a React chat app in 10 minutes - React JS tutorial</a>
      </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_NE_xQlf9WZkO3LTpxG5TNA.png" class="kg-image" alt="1_NE_xQlf9WZkO3LTpxG5TNA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_NE_xQlf9WZkO3LTpxG5TNA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_NE_xQlf9WZkO3LTpxG5TNA.png 800w" sizes="(min-width: 720px) 720px" width="800" height="459" loading="lazy"><figcaption><a href="https://scrimba.com/g/greactchatkit?utm_source=freecodecamp.org&amp;utm_medium=referral&amp;utm_campaign=greactchatkit_10_minute_article">Clique aqui para acessar o curso completo</a> (em inglês) no qual este artigo é baseado.</figcaption></figure><p>Neste artigo, mostrarei a maneira mais fácil possível de se criar uma aplicação de bate-papo usando o React.js. Isso será feito totalmente sem código do lado do servidor, pois deixaremos a API do Chatkit cuidar do back-end.</p><p>Presumo que você saiba o básico de JavaScript e que já tenha visto um pouco de React.js antes. Fora isso, não há pré-requisitos.</p><p>Observação: também criei um curso completo e gratuito sobre como criar uma aplicação de bate-papo React.js <a href="https://scrimba.com/g/greactchatkit?utm_source=freecodecamp.org&amp;utm_medium=referral&amp;utm_campaign=greactchatkit_10_minute_article">aqui</a>.</p><p>Se seguir este tutorial, você terá sua própria aplicação de bate-papo no final, que poderá ser melhorada posteriormente, se desejar.</p><p>Vamos começar!</p><h3 id="etapa-1-divis-o-da-interface-do-usu-rio-ui-em-componentes">Etapa 1: divisão da interface do usuário (UI) em componentes</h3><p>O React foi desenvolvido com base em componentes. Portanto, a primeira coisa que você deve fazer ao criar uma aplicação é dividir a interface do usuário em componentes.</p><p>Vamos começar desenhando um retângulo ao redor de toda a aplicação. Esse é o componente raiz e o ancestral comum de todos os outros componentes. Vamos chamá-lo de <code>App</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_66jz6LtljJtOPDouK9PmYA.png" class="kg-image" alt="1_66jz6LtljJtOPDouK9PmYA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_66jz6LtljJtOPDouK9PmYA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/1_66jz6LtljJtOPDouK9PmYA.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/1_66jz6LtljJtOPDouK9PmYA.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_66jz6LtljJtOPDouK9PmYA.png 1940w" sizes="(min-width: 720px) 720px" width="1940" height="810" loading="lazy"></figure><p>Depois de definir o componente raiz, você precisa se fazer a seguinte pergunta:</p><p>Quais filhos diretos esse componente tem?</p><p>No nosso caso, faz sentido dar a ele três componentes filhos, que chamaremos de:</p><ul><li><code>Title</code> (Título)</li><li><code>MessagesList</code> (Lista de mensagens)</li><li><code>SendMessageForm</code> (Formulário de envio de mensagens)</li></ul><p>Vamos desenhar um retângulo para cada um deles:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_SUeSr13iO7yJfIf4ipaeFg--1-.png" class="kg-image" alt="1_SUeSr13iO7yJfIf4ipaeFg--1-" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_SUeSr13iO7yJfIf4ipaeFg--1-.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/1_SUeSr13iO7yJfIf4ipaeFg--1-.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/1_SUeSr13iO7yJfIf4ipaeFg--1-.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_SUeSr13iO7yJfIf4ipaeFg--1-.png 1940w" sizes="(min-width: 720px) 720px" width="1940" height="810" loading="lazy"></figure><p>Isso nos dá uma boa visão geral dos diferentes componentes e da arquitetura por trás da nossa aplicação.</p><p>Poderíamos ter continuado e nos perguntado quais são os filhos desses componentes. Assim, poderíamos ter dividido a interface do usuário em ainda mais componentes, por exemplo, transformando cada uma das mensagens em seus próprios componentes. No entanto, vamos parar por aqui por uma questão de simplicidade.</p><h3 id="etapa-2-configura-o-da-base-de-c-digo">Etapa 2: configuração da base de código</h3><p>Agora, precisamos configurar nosso repositório. Usaremos a estrutura mais simples possível: um arquivo *index.html * com links para um arquivo JavaScript e uma <em>stylesheet</em>. Também estamos importando o Chatkit SDK e o Babel, que é usado para transformar nosso JSX:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_YCcPOlQGBk-dP-UQnyLEMA.png" class="kg-image" alt="1_YCcPOlQGBk-dP-UQnyLEMA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_YCcPOlQGBk-dP-UQnyLEMA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/1_YCcPOlQGBk-dP-UQnyLEMA.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/1_YCcPOlQGBk-dP-UQnyLEMA.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_YCcPOlQGBk-dP-UQnyLEMA.png 2000w" sizes="(min-width: 720px) 720px" width="2000" height="644" loading="lazy"></figure><p>Aqui está um playground do Scrimba com o código final do tutorial. Recomendo que você o abra em uma nova guia e brinque com ele sempre que se sentir confuso.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_xmr7Z2oR1PwJvLq2sHuZbQ.png" class="kg-image" alt="1_xmr7Z2oR1PwJvLq2sHuZbQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_xmr7Z2oR1PwJvLq2sHuZbQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/1_xmr7Z2oR1PwJvLq2sHuZbQ.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_xmr7Z2oR1PwJvLq2sHuZbQ.png 1600w" sizes="(min-width: 720px) 720px" width="1600" height="802" loading="lazy"></figure><p>Como alternativa, você pode fazer o download do projeto do Scrimba como um arquivo .zip e executar um servidor simples para colocá-lo em funcionamento localmente.</p><h3 id="etapa-3-cria-o-do-componente-raiz"><strong>Etapa 3: criação do componente raiz</strong></h3><p>Com o repositório instalado, podemos começar a escrever algum código em React, o que faremos dentro do arquivo *index.js *.</p><p>Vamos começar pelo componente principal, <code>App</code>. Esse será nosso único componente "inteligente", pois tratará dos dados e da conexão com a API. Esta é a configuração básica para ele (antes de adicionarmos qualquer lógica):</p><pre><code class="language-jsx">    class App extends React.Component {
      
      render() {
        return (
          &lt;div className="app"&gt;
            &lt;Title /&gt;
            &lt;MessageList /&gt;
            &lt;SendMessageForm /&gt;
         &lt;/div&gt;
        )
      }
    }
</code></pre><p>Como você pode ver, ele simplesmente renderiza três filhos: os componentes <code>&lt;Title&gt;</code>,<code>&lt;MessageList&gt;</code>, e <code>&lt;SendMessageForm&gt;</code>.</p><p>No entanto, vamos torná-lo um pouco mais complexo, pois as mensagens de bate-papo precisarão ser armazenadas dentro do estado (em inglês, <em>state</em>) desse componente App. Isso nos permitirá acessar as mensagens por meio de <code>this.state.messages</code> e, assim, passá-las para outros componentes.</p><p>Começaremos com o uso de dados fictícios para que possamos entender o fluxo de dados da aplicação. Em seguida, trocaremos esses dados por dados reais da API do Chatkit.</p><p>Vamos criar uma variável <code>DUMMY_DATA</code>:</p><pre><code class="language-jsx">    const DUMMY_DATA = [
      {
        senderId: "perborgen",
        text: "who'll win?"
      },
      {
        senderId: "janedoe",
        text: "who'll win?"
      }
    ]
</code></pre><p>Em seguida, adicionaremos esses dados ao estado da aplicação e os passaremos para o componente MessageList como uma propriedade.</p><pre><code class="language-jsx">    class App extends React.Component {
      
      constructor() {
        super()
        this.state = {
           messages: DUMMY_DATA
        }
      }
      
      render() {
        return (
          &lt;div className="app"&gt;
            &lt;MessageList messages={this.state.messages}/&gt;
            &lt;SendMessageForm /&gt;
         &lt;/div&gt;
        )
      }
    }
</code></pre><p>Aqui, estamos inicializando o estado no <code>constructor</code> e também estamos passando <code>this.state.messages</code> para <code>MessageList</code>.</p><p>Observe que estamos chamando <code>super()</code> no construtor. Você deve fazer isso se quiser criar um componente com estado (em inglês, <em>stateful</em>).</p><h3 id="etapa-4-renderiza-o-de-mensagens-fict-cias"><strong>Etapa 4: renderização de mensagens fictícias</strong></h3><p>Vamos ver como podemos renderizar essas mensagens no componente MessageList. Veja como fica:</p><pre><code class="language-jsx">    class MessageList extends React.Component {
      render() {
        return (
          &lt;ul className="message-list"&gt;                 
            {this.props.messages.map(message =&gt; {
              return (
               &lt;li key={message.id}&gt;
                 &lt;div&gt;
                   {message.senderId}
                 &lt;/div&gt;
                 &lt;div&gt;
                   {message.text}
                 &lt;/div&gt;
               &lt;/li&gt;
             )
           })}
         &lt;/ul&gt;
        )
      }
    }
</code></pre><p>Esse é o chamado componente estúpido. Ele usa uma propriedade, <code>messages</code>, que contém um <em>array</em> de objetos. Então, estamos simplesmente renderizando as propriedades <code>text</code> e <code>senderId</code> dos objetos.</p><p>Com nossos dados fictícios fluindo para esse componente, ele renderizará o seguinte:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_Nf12vqc4Ti_GWY0FwqmQKw.png" class="kg-image" alt="1_Nf12vqc4Ti_GWY0FwqmQKw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_Nf12vqc4Ti_GWY0FwqmQKw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_Nf12vqc4Ti_GWY0FwqmQKw.png 916w" sizes="(min-width: 720px) 720px" width="916" height="234" loading="lazy"></figure><p>Portanto, agora temos a estrutura básica da nossa aplicação e também podemos renderizar mensagens. Excelente trabalho!</p><p><strong>Agora, vamos substituir nossos dados fictícios por mensagens reais de uma sala de bate-papo!</strong></p><h3 id="etapa-5-obten-o-de-chaves-de-api-do-chatkit"><strong>Etapa 5: obtenção de chaves de API do Chatkit</strong></h3><p>Para buscar mensagens, precisaremos nos conectar à API do Chatkit. Para isso, precisamos obter as chaves da API.</p><p>Neste ponto, quero incentivá-lo a seguir minhas etapas para que você possa colocar sua própria aplicação de bate-papo em funcionamento. Você pode usar meu <a href="https://scrimba.com/c/crVznf6?utm_source=freecodecamp.org&amp;utm_medium=referral&amp;utm_campaign=greactchatkit_10_minute_article">playground do Scrimba</a> para testar suas próprias chaves de API.</p><p>Comece criando uma conta gratuita <a href="https://dashboard.pusher.com/accounts/sign_up?utm_medium=Website&amp;utm_source=Homepage_Signup_CTA&amp;utm_campaign=Homepage_CTA">aqui</a>. Depois de fazer isso, você verá seu painel de controle. É aqui que você cria instâncias do Chatkit. Crie uma e dê a ela o nome que você quiser:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-72.png" class="kg-image" alt="image-72" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/image-72.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/image-72.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/image-72.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/image-72.png 2000w" sizes="(min-width: 720px) 720px" width="2000" height="1072" loading="lazy"></figure><p>Em seguida, você será direcionado para a instância recém-criada. Aqui, você precisará copiar quatro valores:</p><ul><li>O localizador de instâncias (<em>instance locator</em>)</li><li>O provedor do token de teste (<em>test token provider</em>)</li><li>O ID da sala (<em>room ID</em>)</li><li>O nome de usuário</li></ul><p>Começaremos com o <strong>localizador de instâncias</strong>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_AkbH5NfvHfwHAxiun37k9g.png" class="kg-image" alt="1_AkbH5NfvHfwHAxiun37k9g" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_AkbH5NfvHfwHAxiun37k9g.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/1_AkbH5NfvHfwHAxiun37k9g.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_AkbH5NfvHfwHAxiun37k9g.png 1200w" sizes="(min-width: 720px) 720px" width="1200" height="645" loading="lazy"></figure><p><em>Você pode copiar usando o ícone no lado direito do localizador de instâncias.</em></p><p>Se você rolar a tela um pouco para baixo, encontrará o <strong>provedor do token de teste</strong>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_uSvabQgYrppTGsWKXQsJSQ.png" class="kg-image" alt="1_uSvabQgYrppTGsWKXQsJSQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_uSvabQgYrppTGsWKXQsJSQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/1_uSvabQgYrppTGsWKXQsJSQ.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/1_uSvabQgYrppTGsWKXQsJSQ.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_uSvabQgYrppTGsWKXQsJSQ.png 2000w" sizes="(min-width: 720px) 720px" width="2000" height="1075" loading="lazy"></figure><p>O próximo passo é criar um <strong><strong>Us</strong>uário </strong>e uma <strong>Sala</strong>, o que é feito na mesma página. Observe que, <em>primeiro</em>, será necessário criar um usuário e, em seguida, você poderá criar uma sala, o que dará a você acesso ao identificador da sala.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_hCXjDJ3PQJ_emU4WfJRQEQ.png" class="kg-image" alt="1_hCXjDJ3PQJ_emU4WfJRQEQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_hCXjDJ3PQJ_emU4WfJRQEQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/1_hCXjDJ3PQJ_emU4WfJRQEQ.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/1_hCXjDJ3PQJ_emU4WfJRQEQ.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_hCXjDJ3PQJ_emU4WfJRQEQ.png 2000w" sizes="(min-width: 720px) 720px" width="2000" height="1193" loading="lazy"><figcaption>No segundo círculo vermelho, você vê o identificador da sala</figcaption></figure><p>Agora, você encontrou os seus quatro identificadores. Muito bem!</p><p>No entanto, antes de voltarmos à base de código, quero que você também envie manualmente uma mensagem do painel do Chatkit, pois isso nos ajudará no próximo capítulo.</p><p>Veja como fazer isso:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_HU3mzUknYj8_MwY7ceK2Ow.png" class="kg-image" alt="1_HU3mzUknYj8_MwY7ceK2Ow" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_HU3mzUknYj8_MwY7ceK2Ow.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/1_HU3mzUknYj8_MwY7ceK2Ow.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/1_HU3mzUknYj8_MwY7ceK2Ow.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_HU3mzUknYj8_MwY7ceK2Ow.png 2000w" sizes="(min-width: 720px) 720px" width="2000" height="1194" loading="lazy"></figure><p>Isso é para que tenhamos de fato uma mensagem para renderizar na próxima etapa.</p><h3 id="etapa-6-renderiza-o-de-mensagens-reais-de-bate-papo"><strong>Etapa 6: renderização de mensagens reais de bate-papo</strong></h3><p>Agora, vamos voltar ao nosso arquivo <em>index.js</em> e armazenar esses quatro identificadores como variáveis na parte superior do nosso arquivo.</p><p>Aqui estão as minhas, mas eu o encorajo a criar as suas próprias:</p><pre><code class="language-jsx">    const instanceLocator = "v1:us1:dfaf1e22-2d33-45c9-b4f8-31f634621d24"

    const testToken = "https://us1.pusherplatform.io/services/chatkit_token_provider/v1/dfaf1e22-2d33-45c9-b4f8-31f634621d24/token"

    const username = "perborgen"

    const roomId = 9796712
</code></pre><p>Com isso pronto, finalmente estamos prontos para nos conectar ao Chatkit. Isso ocorrerá no componente <code>App</code> e, mais especificamente, no método <code>componentDidMount</code>. Esse é o método que você deve usar ao conectar componentes React.js a APIs.</p><p>Primeiro, criaremos um <code>chatManager</code>:</p><pre><code class="language-jsx">    componentDidMount() {
      const chatManager = new Chatkit.ChatManager({
        instanceLocator: instanceLocator,
        userId: userId,
        tokenProvider: new Chatkit.TokenProvider({
          url: testToken
        })
     })  
</code></pre><p>Em seguida, usaremos <code>chatManager.connect()</code> para nos conectarmos à API:</p><pre><code class="language-jsx">      chatManager.connect().then(currentUser =&gt; {
          currentUser.subscribeToRoom({
          roomId: roomId,
          hooks: {
            onNewMessage: message =&gt; {
              this.setState({
                messages: [...this.state.messages, message]
              })
            }
          }
        })
      })
    }
</code></pre><p>Isso nos dá acesso ao objeto <code>currentUser</code>, que é a interface para interagir com a API.</p><p>Observação: como precisaremos usar o <code>currentUser</code> mais tarde, vamos armazená-lo na instância, com <code>this.currentUser = ``currentUser</code>.</p><p>Em seguida, chamamos <code>currentUser.subscribeToRoom()</code> e passamos a ele nosso <code>roomId</code> e um <em>hook</em> <code>onNewMessage</code>.</p><p>O <em>hook</em> <code>onNewMessage</code> é acionado toda vez que uma nova mensagem é transmitida para a sala de bate-papo. Portanto, toda vez que isso acontecer, simplesmente adicionaremos a nova mensagem no final de <code>this.state.messages</code>.</p><p>Isso faz com que a aplicação busque dados da API e depois os renderize na página.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_EAi9TyUba39xN3fciic3aA.png" class="kg-image" alt="1_EAi9TyUba39xN3fciic3aA" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_EAi9TyUba39xN3fciic3aA.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/1_EAi9TyUba39xN3fciic3aA.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_EAi9TyUba39xN3fciic3aA.png 1488w" sizes="(min-width: 720px) 720px" width="1488" height="776" loading="lazy"></figure><p>Isso é fantástico, pois agora temos o esqueleto da nossa conexão <em>client</em>-servidor.</p><p>Uau!</p><h3 id="etapa-7-manipula-o-de-entrada-do-usu-rio"><strong>Etapa 7: manipulação de entrada do usuário</strong></h3><p>A próxima coisa que precisaremos criar é o componente <code>SendMessageForm</code>. Esse será o chamado <em>componente controlado</em>, o que significa que o componente controla o que está sendo renderizado no campo de entrada por meio de seu estado.</p><p>Dê uma olhada no método <code>render()</code>:</p><pre><code class="language-jsx">    class SendMessageForm extends React.Component {
      render() {
        return (
          &lt;form
            className="send-message-form"&gt;
            &lt;input
              onChange={this.handleChange}
              value={this.state.message}
              placeholder="Type your message and hit ENTER"
              type="text" /&gt;
          &lt;/form&gt;
        )
      }
    }
</code></pre><p>Estamos fazendo duas coisas:</p><ol><li>Ouvir as entradas do usuário com o ouvinte de eventos <code>onChange</code>, de modo que possamos acionar o método <code>handleChange</code> </li><li>Definir o <code>value</code> do campo de entrada explicitamente usando <code>this.state.message</code></li></ol><p>A conexão entre essas duas etapas é encontrada dentro do método <code>handleChange</code>. Ele simplesmente atualiza o estado para o que quer que o usuário digite no campo de entrada:</p><pre><code class="language-jsx">    handleChange(e) {
      this.setState({
        message: e.target.value
      })
    }
</code></pre><p>Isso aciona uma nova renderização e, como o campo de entrada é definido explicitamente a partir do estado usando <code>value={this.state.message}</code>, &nbsp;o campo de entrada será atualizado.</p><p>Portanto, mesmo que a aplicação pareça instantânea para o usuário quando ele digita algo no campo de entrada, <strong>os dados realmente passam pelo estado antes que o React atualize a interface do usuário.</strong></p><p>Para encerrar esse recurso, precisamos dar ao componente um <code>constructor</code>. Nele, inicializaremos o estado e vincularemos <code>this</code> no método <code>handleChange</code>:</p><pre><code class="language-jsx">    constructor() {
        super()
        this.state = {
           message: ''
        }
        this.handleChange = this.handleChange.bind(this)
    }
</code></pre><p>Precisamos vincular o método <code>handleChange</code> para que tenhamos acesso à palavra-chave <code>this</code> dentro dele. É assim que o JavaScript funciona: a palavra-chave <code>this</code> é, por padrão, <em>indefinida</em> dentro do corpo de uma função.</p><h3 id="etapa-8-envio-de-mensagens"><strong>Etapa 8: envio de mensagens</strong></h3><p>Nosso componente <code>SendMessageForm</code> está quase pronto, mas também precisamos cuidar do envio do formulário. Precisamos buscar as mensagens e enviá-las!</p><p>Para fazer isso, conectaremos um manipulador uniforme <code>handleSubmit</code> ao ouvinte de eventos <code>onSubmit</code> no <code>&lt;form&gt;</code>.</p><pre><code class="language-jsx">    render() {
        return (
          &lt;form
            onSubmit={this.handleSubmit}
            className="send-message-form"&gt;
            &lt;input
              onChange={this.handleChange}
              value={this.state.message}
              placeholder="Type your message and hit ENTER"
              type="text" /&gt;
        &lt;/form&gt;
        )
      }
</code></pre><p>Como temos o valor do campo de entrada armazenado em <code>this.state.message</code>, é muito fácil passar os dados corretos junto com o envio. Basta fazer isso:</p><pre><code class="language-jsx">    handleSubmit(e) {
      e.preventDefault()
      this.props.sendMessage(this.state.message)
      this.setState({
        message: ''
      })
    }
</code></pre><p>Aqui, estamos chamando a propriedade <code>sendMessage</code> e passando <code>this.state.message</code> como parâmetro. Talvez você esteja um pouco confuso com isso, pois ainda não criamos o método <code>sendMessage</code>. No entanto, faremos isso na próxima seção, pois esse método está dentro do componente <code>App</code>. Portanto, não se preocupe!</p><p>Em segundo lugar, estamos limpando o campo de entrada definindo <code>this.state.message</code> como uma <em>string </em>vazia.</p><p>Aqui está o componente <code>SendMessageForm</code> completo. Observe que também vinculamos o <code>this</code> ao método <code>handleSubmit</code>:</p><pre><code class="language-jsx">    class SendMessageForm extends React.Component {
      constructor() {
        super()
        this.state = {
          message: ''
        }
        this.handleChange = this.handleChange.bind(this)
        this.handleSubmit = this.handleSubmit.bind(this)
      }

      handleChange(e) {
        this.setState({
          message: e.target.value
        })
      }

      handleSubmit(e) {
        e.preventDefault()
        this.props.sendMessage(this.state.message)
        this.setState({
          message: ''
        })
      }

      render() {
        return (
          &lt;form
            onSubmit={this.handleSubmit}
            className="send-message-form"&gt;
            &lt;input
              onChange={this.handleChange}
              value={this.state.message}
              placeholder="Type your message and hit ENTER"
              type="text" /&gt;
          &lt;/form&gt;
        )
      }
    }
</code></pre><h3 id="etapa-9-envio-de-mensagens-para-o-chatkit"><strong>Etapa 9: envio de mensagens para o Chatkit</strong></h3><p>Agora, estamos prontos para enviar as mensagens para o Chatkit. Isso é feito no componente <code>App</code>, onde criaremos um método chamado <code>this.sendMessage</code>:</p><pre><code class="language-jsx">    sendMessage(text) {
      this.currentUser.sendMessage({
        text: text,
        roomId: roomId
      })
    }
</code></pre><p>Ele recebe um parâmetro (o texto) e simplesmente chama <code>this.currentUser.sendMessage()</code>.</p><p>A etapa final é passar isso para o componente <code>&lt;SendMessageForm&gt;</code> como uma propriedade:</p><pre><code class="language-jsx">    /* App component */
      
    render() {
      return (
        &lt;div className="app"&gt;
          &lt;Title /&gt;
          &lt;MessageList messages={this.state.messages} /&gt;
          &lt;SendMessageForm sendMessage={this.sendMessage} /&gt;
      )
    }
</code></pre><p>Com isso, passamos o manipulador para que <code>SendMessageForm</code> possa invocá-lo quando o formulário for enviado.</p><h3 id="etapa-10-criando-o-componente-title"><strong>Etapa 10: criando o componente Title</strong></h3><p>Para finalizar, vamos criar também o componente Title. Ele é apenas um componente funcional simples, ou seja, uma função que retorna uma expressão JSX.</p><pre><code class="language-jsx">    function Title() {
      return &lt;p class="title"&gt;My awesome chat app&lt;/p&gt;
    }
</code></pre><p>É uma boa prática usar componentes funcionais, pois eles têm mais restrições do que os componentes de classe, o que os torna menos propensos a <em>bugs</em>.</p><h3 id="o-resultado">O resultado</h3><p>Com isso, você tem sua própria aplicação de bate-papo, que pode ser usada para conversar com seus amigos!</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_KQzdlJJLMGyq5IdZu6cZ1Q.png" class="kg-image" alt="1_KQzdlJJLMGyq5IdZu6cZ1Q" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_KQzdlJJLMGyq5IdZu6cZ1Q.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/1_KQzdlJJLMGyq5IdZu6cZ1Q.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_KQzdlJJLMGyq5IdZu6cZ1Q.png 1490w" sizes="(min-width: 720px) 720px" width="1490" height="776" loading="lazy"></figure><p>Dê a si mesmo um tapinha nas costas se tiver programado toda a aplicação até o fim.</p><p>Se você quiser saber como desenvolver esse exemplo, <a href="https://scrimba.com/g/greactchatkit?utm_source=freecodecamp.org&amp;utm_medium=referral&amp;utm_campaign=greactchatkit_10_minute_article">então confira meu curso gratuito sobre como criar uma aplicação de bate-papo</a> com o React aqui.</p><p>Obrigado pela leitura e boa programação! 😀</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
