Alura > Cursos de Front-end > Cursos de React > Conteúdos de React > Primeiras aulas do curso React: utilizando hooks para gerenciar estados

React: utilizando hooks para gerenciar estados

Criando um Dialog - Apresentação

Apresentando o curso de React

Olá! Seja bem-vindo a este curso de React. Meu nome é Vinícius Neves, o Dev careca barbudo da Alura que você mais gosta, e estou aqui para acompanhar a evolução dos seus estudos de React. Vamos aprender muitos conceitos novos, mas é essencial que já tenhamos domínio do JSX do React, ou seja, saibamos escrever os componentes e utilizar o useState, que é o nosso estado local. Esse é um pré-requisito importante para maximizar o aproveitamento ao longo das aulas.

Com isso em mente, podemos focar no que vamos aprender de interessante. Vamos trabalhar em uma aplicação que está parcialmente construída. Diferente do que fizemos anteriormente, não vamos criar tudo do zero. Estamos simulando o dia a dia de uma pessoa desenvolvedora, que nem sempre inicia projetos novos, mas frequentemente pega algo já em andamento para dar manutenção e evoluir. É isso que faremos com o checklist.

Explorando funcionalidades do checklist

Vamos finalizar este checklist de estudo, abordando conceitos importantes para o desenvolvimento. Vamos trabalhar com uma modal, interagir com o local storage, aprender hooks do React e ver a aplicação em funcionamento.

Conseguimos concluir tarefas, deletá-las, desfazer a conclusão caso tenhamos concluído por engano, editar, trocar de useState para localStorage e salvar. Podemos adicionar novas tarefas, como estudar, e explorar a Context API.

Desafios e expectativas do curso

Há muitas funcionalidades interessantes que podemos implementar na aplicação. Quando recarregamos, a lista de tarefas permanece intacta, exatamente como a deixamos. Podemos publicar isso e há muitos desafios legais ao longo do curso. Sempre deixamos um desafio no final para praticar e aplicar todo o conhecimento adquirido durante o desenvolvimento deste checklist de plano de estudo.

Estamos animados e esperamos que vocês também estejam, para começarmos a codificar nosso checklist. Vamos lá, estamos esperando por vocês!

Criando um Dialog - Iniciando o projeto React

Introduzindo o projeto em andamento

Diferente do que fizemos no curso anterior, agora vamos trabalhar em um projeto que já está em andamento e adicionar novas funcionalidades. Neste caso específico, o projeto já existe e está codificado, mas apenas a parte estática. Vamos analisar esse projeto antes de começarmos a codificar. Existe uma mística no desenvolvimento de software, onde passamos muito tempo lendo o código em vez de escrever algo novo. Vamos colocar isso à prova.

Primeiramente, precisamos baixar o projeto base que está na seção de preparação do ambiente. Eu já fiz o download e, no meu caso, ele está na área de trabalho. O nome do projeto é checklist, e eu o clonei na pasta "checklist". Para colocá-lo em execução, não há mistério em relação ao que fizemos anteriormente. Vamos para o terminal. No terminal, já estou na pasta do projeto. Vou fechar tudo que está aberto e focar no checklist.

Preparando o ambiente de desenvolvimento

No terminal que estou usando, ele indica onde estou. Estou dentro de "Desktop", na pasta "Checklist". Existe um comando de terminal que nos permite ver onde estamos, que é o pwd.

pwd

No meu caso, o caminho é /users/Vinicius Deves/Desktop/checklist. Portanto, já estou no local correto.

Agora, vou abrir o VSCode nesta pasta usando o comando code ., e ele abrirá o VSCode para nós.

code .

A primeira coisa que pensamos é em colocar o projeto para rodar. Para isso, usamos o comando npm run dev.

npm run dev

Instalando dependências e configurando o projeto

No entanto, se fizermos isso imediatamente após clonar o projeto e abrir o terminal, ele dirá que não reconhece o comando que estamos tentando executar, que é o Vite. Vamos fazer o caminho inverso. Sabemos que no arquivo package.json, há uma seção chamada scripts, localizada na linha 6, onde executamos o script de desenvolvimento com npm run dev, que chama o processo do Vite.

"scripts": {
    "dev": "vite",
    "build": "vite build",
    "lint": "eslint .",
    "preview": "vite preview"
}

Por que ele não encontrou isso? Porque, ao clonar ou baixar um projeto, seja por zip ou git clone, precisamos instalar as dependências.

A pasta NodeModules nunca deve ser incluída no git, pois ela varia de acordo com o sistema operacional. Por exemplo, ao usar o macOS, ela será configurada para funcionar nesse sistema. Se estivermos utilizando Linux ou Windows, o processo será ajustado conforme o sistema operacional correspondente.

Antes de executar o comando npm run start, devemos realizar um npm install.

npm install

Esse comando pode ser abreviado para npm i, que é um atalho útil para quem prefere digitar menos.

npm i

Executando o projeto e verificando funcionalidades

Após pressionar "Enter", o npm install baixará todas as dependências do projeto. Quando esse processo for concluído, podemos executar o npm run dev.

npm run dev

Nesse ponto, o Vite, que anteriormente não estava disponível, agora está presente na pasta NodeModules e pronto para ser utilizado.

O projeto estará disponível no localhost na porta 5173. Ao abrir o Chrome e recarregar a página, veremos que a camada visual está pronta. No entanto, ainda há funcionalidades a serem implementadas. Por exemplo, ao clicar em adicionar, nada acontece, e ao alternar o valor entre concluído ou não, ele não muda de lugar. Portanto, há bastante trabalho a ser feito.

Planejando o desenvolvimento de novas funcionalidades

No Figma, temos uma pequena modal que precisaremos abrir quando clicarmos no ícone de adicionar uma nova tarefa. Vamos começar pela modal, mas nosso projeto base já está funcionando corretamente.

Para garantir a compatibilidade entre o que está acontecendo em nossa máquina e na de outras pessoas, recomendamos o uso da mesma versão do Node que estamos utilizando, que é a 22.12.0. Podemos verificar a versão do Node instalada com o seguinte comando:

node -v

Alterações na versão secundária, como 12.0, geralmente não causam problemas, mas para uma experiência idêntica, a versão 22 do Node é a mais indicada.

Com o ambiente pronto, podemos começar a desenvolver a nossa modal ou dialog, criando esse componente para adicionar itens à lista de estudo. Vamos continuar esse processo no próximo vídeo.

Criando um Dialog - Utilizando elemento dialog nativo

Discutindo a criação do componente dialog

No nosso último encontro, discutimos a criação de um componente dialog para uma interface modal, que obscurece o fundo. No Figma, já temos a modal escura, mas precisamos implementá-la no estilo React.

Para isso, podemos abrir o VS Code, que já está com o projeto aberto. Vamos fechar tudo que está aberto e, dentro da pasta "components", criar uma nova pasta chamada "dialog". Dentro dela, criaremos o arquivo index.jsx.

Criando a função Dialog

Vamos criar uma função e exportá-la: export function Dialog, que será nosso componente. Lembrando que componentes em React são funções que começam com letra maiúscula, por isso usamos "Dialog" com letra maiúscula.

export function Dialog() {

}

Podemos então adicionar o nosso return e, ao invés de chaves, usaremos parênteses para retornar o código JSX, ou seja, nossa marcação.

export function Dialog() {
    return (

    )
}

Explorando a tag dialog no HTML

Existe uma tag semântica no HTML, que já vem com várias funcionalidades por padrão, chamada dialog, que é ideal para modais. Vamos pesquisar no Google por "HTML tag dialog" e acessar a documentação da Mozilla. A versão em português não contém todos os exemplos, então usaremos a versão em inglês.

Na documentação, encontramos um exemplo que utiliza Javascript para manipular o elemento dialog. Ele busca o elemento, assim como os botões de mostrar e fechar, e realiza ações com eles. Quando clicamos em "show the dialog", ele exibe a modal com um fundo colorido, e ao clicar em "close", ele fecha. Esse exemplo é um bom ponto de partida para nosso projeto.

Implementando o exemplo no projeto

Vamos copiar o HTML do exemplo, que inclui a dialog, um botão de fechar e um botão de mostrar, e colá-lo no return dentro dos parênteses no VS Code.

export function Dialog() {
    return (
        <dialog>
            <button autofocus>Close</button>
            <p>This modal dialog has a groovy backdrop!</p>
        </dialog>
        <button>Show the dialog</button>
    )
}

Ao formatar o código, o VS Code nos alerta que expressões JSX devem retornar um único elemento pai. Isso significa que não podemos retornar uma dialog ao lado de um button sem um elemento pai.

Utilizando fragmentos do React

Para resolver isso, podemos envolver tudo em uma div, mas uma solução mais elegante é usar um fragmento do React. Basta abrir e fechar com os sinais de maior e menor, sem nenhum elemento, e o React saberá lidar com isso. Isso é equivalente a usar React.Fragment.

export function Dialog() {
    return (
        <>
            <dialog>
                <button autofocus>Close</button>
                <p>This modal dialog has a groovy backdrop!</p>
            </dialog>
            <button>Show the dialog</button>
        </>
    )
}

No React, podemos utilizar React.Fragment ou deixar o JSX vazio. Se deixarmos vazio, o JSX consegue resolver, e se importarmos dessa forma, o React também sabe lidar. Vamos deixar explícito, pois é melhor do que implícito.

import React from "react";

export function Dialog() {
    return (
        <React.Fragment>
            <dialog>
                <button autofocus>Close</button>
                <p>This modal dialog has a groovy backdrop!</p>
            </dialog>
            <button>Show the dialog</button>
        </React.Fragment>
    )
}

Integrando o componente Dialog no app

Agora, temos o dialog com os botões relacionados. Vamos salvar e colocar isso no app.jsx.

Vamos colapsar a estrutura de todo, que seria um afazer, e completed, que seria o completo, e posicioná-los no final do container. Vou colocá-los no início para facilitar a visualização, logo abaixo do header, chamando nosso dialog. O VSCode já identificou e importou esse componente na linha 3: import { Dialog } from './components/Dialog';.

import { Dialog } from "./components/Dialog";

Testando a aplicação e corrigindo erros

Vamos verificar se isso já está aparecendo na tela. No Chrome, no localhost na porta 5173, ao recarregar a página, ele não conseguiu carregar. Precisamos executar npm run dev no terminal, pois o processo foi interrompido para discutirmos a versão do Node e não foi reiniciado.

npm run dev

Voltando ao navegador, agora sim, o show dialog aparece, mas ao clicar, nada acontece. Precisamos implementar os mecanismos que a Mozilla disponibiliza para interagir com esses botões.

Adicionando interatividade ao dialog

Vamos copiar o que está na documentação, que utiliza document.querySelector para buscar uma tag dialog ou um botão dentro dela. Vamos colar isso no JSX e pedir ao VSCode para formatar o documento, colapsando a estrutura de pastas.

const dialog = document.querySelector("dialog");
const showButton = document.querySelector("dialog + button");
const closeButton = document.querySelector("dialog button");

// "Show the dialog" button opens the dialog modally
showButton.addEventListener("click", () => {
  dialog.showModal();
});

// "Close" button closes the dialog
closeButton.addEventListener("click", () => {
  dialog.close();
});

Estamos buscando os elementos dialog, showbutton e closebutton. Quando alguém clica no showbutton, mostramos o modal com dialog.showModal(), e ao clicar em close, usamos dialog.close(). Esses são eventos nativos do elemento dialog, por isso é importante utilizá-los em vez de uma div com muitos estilos.

Estilizando o componente dialog

Vamos criar um novo arquivo dentro da pasta "dialog", chamado dialog.style.css. Vamos importar esse arquivo no index.jsx com import './dialog.style.css';.

import './dialog.style.css';

Podemos agora aplicar os estilos disponíveis no exemplo, como o .backdrop, no dialog.style.css.

::backdrop {
  background-image: linear-gradient(
    45deg,
    magenta,
    rebeccapurple,
    dodgerblue,
    green
  );
  opacity: 0.75;
}

Identificando e abordando problemas no React

Ao testar a aplicação, encontramos um erro não tratado: não conseguimos ler propriedades de nulo no index.jsx nas linhas 11 e 16. Isso significa que o showbutton é nulo, pois o React não o encontrou. Estamos usando a documentação da Mozilla como base, mas ao trabalhar com React, precisamos seguir a abordagem correta.

No curso anterior, discutimos programação declarativa e imperativa. A programação imperativa é quando especificamos exatamente o que o navegador deve fazer, como interagir com a API document. No entanto, o React não espera que escrevamos esse tipo de comportamento dessa forma. O erro ocorreu porque, quando o código foi executado, o dialog não existia no HTML, impossibilitando a execução do addEventListener.

Estamos no caminho certo ao utilizar o dialog, que é o elemento adequado para essa funcionalidade. No entanto, precisamos traduzir essa abordagem. Não podemos usar a API do document dessa maneira em situações como essa dentro do React. No próximo vídeo, veremos como corrigir esse problema. Até lá!

Sobre o curso React: utilizando hooks para gerenciar estados

O curso React: utilizando hooks para gerenciar estados possui 194 minutos de vídeos, em um total de 51 atividades. Gostou? Conheça nossos outros cursos de React em Front-end, ou leia nossos artigos de Front-end.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda React acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas