O React JS é interessante para o desenvolvimento de aplicações web modernas e escaláveis. Conheça as principais ferramentas da biblioteca. 

O React é uma das bibliotecas JavaScript mais populares por conta de suas ferramentas que melhoram o processo de desenvolvimento de aplicações web.  

Este guia se destina a desenvolvedores experientes que desejam explorar o ecossistema do React JS e descobrir maneiras de aprimorar suas habilidades. 

Vamos tratar desde bibliotecas para navegação e gerenciamento de estado até ferramentas para estilização de componentes e desenvolvimento de componentes isolados. 

Boa leitura! 

Navegue pelo índice

    Como gerenciar a navegação com o React Router? 

    Homem trabalhando em escritório sobreposto por diversas linhas de código

    As bibliotecas do React JS facilitam o desenvolvimento de aplicações web. 

    O React Router é uma biblioteca que permite gerenciar a navegação entre diferentes componentes da sua aplicação React JS de forma declarativa. Confira as principais ferramentas usadas com exemplos práticos. 

    Rotas dinâmicas 

    Quando uma aplicação web precisa lidar com diferentes URLs que podem conter parâmetros variáveis, como IDs de usuário ou produto, o React Router permite definir padrões para usar em seus componentes.  

    Vamos lidar com rotas dinâmicas para exibir detalhes de produtos.  

    import { BrowserRouter as Router, Route, Switch } from ‘react-router-dom’; 

    const App = () => ( 

      <Router> 

        <div> 

          <Header /> 

          <Switch> 

            <Route exact path=”/” component={Home} /> 

            <Route exact path=”/about” component={About} /> 

            <Route exact path=”/contact” component={Contact} /> 

            <Route exact path=”/products” component={Products} /> 

            <Route path=”/products/:id” component={ProductDetails} /> 

            <Route component={NotFound} /> 

          </Switch> 

          <Footer /> 

        </div> 

      </Router> 

    ); 

    const Products = () => ( 

      <div> 

        <h2>Products</h2> 

        <ul> 

          <li><Link to=”/products/1″>Product 1</Link></li> 

          <li><Link to=”/products/2″>Product 2</Link></li> 

          <li><Link to=”/products/3″>Product 3</Link></li> 

        </ul> 

      </div> 

    ); 

    const ProductDetails = ({ match }) => { 

      const productId = match.params.id; 

      // Aqui você poderia fazer uma requisição para obter os detalhes do produto com o ID fornecido 

      return ( 

        <div> 

          <h3>Product Details – ID: {productId}</h3> 

          {/* Renderizar os detalhes do produto */} 

        </div> 

      ); 

    }; 

    const NotFound = () => ( 

      <div> 

        <h2>404 Not Found</h2> 

        <p>Oops! Página não encontrada.</p> 

      </div> 

    ); 

    // Resto dos componentes, como Header, Footer, Home, About, Contact etc. 

    A rota /products/:id é dinâmica e corresponderá a qualquer URL /products/ seguida por um ID de produto.  

    O componente ProductDetails é responsável por renderizar os detalhes do produto com base no ID fornecido na URL.  

    Assim, conseguimos criar uma interface escalável para exibir informações específicas de cada produto em sua aplicação. 

    Navegação aninhada 

    Às vezes, é necessário organizar suas rotas de forma hierárquica, com rotas aninhadas dentro de outras rotas, correspondendo à hierarquia de componentes em sua aplicação. 

    Isso é útil para criar interfaces de usuário complexas, como painéis de administração ou aplicativos com várias seções, em que certas partes da interface do usuário dependem da rota atual.  

    Em um exemplo de um painel de administração, você pode ter uma rota principal /admin que contém várias subrotas para diferentes seções, como /admin/dashboard, /admin/users, /admin/settings etc. 

    import { BrowserRouter as Router, Route, Link } from ‘react-router-dom’; 

    const Dashboard = () => ( 

      <div> 

        <h2>Dashboard</h2> 

        {/* Links para as subrotas */} 

        <ul> 

          <li><Link to=”/admin/dashboard/analytics”>Analytics</Link></li> 

          <li><Link to=”/admin/dashboard/reports”>Reports</Link></li> 

        </ul> 

        {/* Rotas aninhadas */} 

        <Route path=”/admin/dashboard/analytics” component={Analytics} /> 

        <Route path=”/admin/dashboard/reports” component={Reports} /> 

      </div> 

    ); 

    const Analytics = () => ( 

      <div> 

        <h3>Analytics</h3> 

        {/* Conteúdo da página de Analytics */} 

      </div> 

    ); 

    const Reports = () => ( 

      <div> 

        <h3>Reports</h3> 

        {/* Conteúdo da página de Reports */} 

      </div> 

    ); 

    const App = () => ( 

      <Router> 

        <div> 

          {/* Rota principal para o painel de administração */} 

          <Route path=”/admin” component={Dashboard} /> 

        </div> 

      </Router> 

    ); 

    export default App; 

    Na rota principal, temos a rota /admin/dashboard, que é renderizada pelo componente Dashboard

    Ele contém links para as subrotas /admin/dashboard/analytics e /admin/dashboard/reports, e também define rotas aninhadas para cada uma dessas subrotas, renderizando os componentes Analytics e Reports, respectivamente.  

    Gestão de estado 

    O React Router oferece opções para gerenciar a navegação, como o uso do componente <Link> e parâmetros de rota para passar dados entre componentes. 

    Podemos implementar, por exemplo, uma aplicação de lista de tarefas com o Redux. Primeiro, definimos ações para atualizar o estado, como adicionar uma nova tarefa ou alternar o estado de uma tarefa. 

    Em seguida, criamos um reducer para lidar com essas ações, atualizando o estado conforme necessário. 

    O store é criado utilizando a função createStore do Redux, passando o reducer como argumento.  

    O componente App é envolvido pelo componente Provider para disponibilizar o store para todos os componentes filhos.  

    Dentro do App, incluímos o componente TodoList, responsável por exibir a lista de tarefas e permitir a adição de novas tarefas. 

    Ele recebe o estado da aplicação (lista de tarefas) e as ações (addTask e toggleTask) como props, exibindo a lista de tarefas e permitindo a interação do usuário.  

    Essas estruturas permitem uma gestão eficaz do estado em aplicações React JS, mantendo a consistência e facilitando a interação do usuário com a aplicação. 

    Lazy Loading 

    O Lazy Loading permite carregar de forma assíncrona, quando temos aplicações com muitos componentes ou rotas no JavaScript

    Ao integrá-lo ao React Router, é possível dividir sua aplicação em partes menores e carregar apenas o código necessário para renderizar a página atual.  

    Dessa forma, os componentes e recursos de rotas que não são imediatamente necessários não são carregados até que o usuário os solicite, reduzindo significativamente o tempo de carregamento inicial da aplicação e melhorando a responsividade geral. 

    Para implementar o Lazy Loading com o React Router, você pode usar a função React.lazy() para importar dinamicamente seus componentes de rota.  

    Por exemplo: 

    import { Suspense } from ‘react’; 

    import { BrowserRouter as Router, Route, Switch } from ‘react-router-dom’; 

    const LazyComponent = React.lazy(() => import(‘./LazyComponent’)); 

    function App() { 

      return ( 

        <Router> 

          <Suspense fallback={<div>Loading…</div>}> 

            <Switch> 

              <Route path=”/lazy” component={LazyComponent} /> 

              {/* Outras rotas aqui */} 

            </Switch> 

          </Suspense> 

        </Router> 

      ); 

    } 

    O componente LazyComponent será carregado apenas quando a rota correspondente for acessada.  

    Já o componente Suspense exibe uma mensagem de carregamento enquanto o componente está sendo carregado de forma assíncrona. 

    Como manipular formulários com Formik? 

    A biblioteca Formik simplifica a manipulação em aplicações React JS, oferecendo uma abordagem eficiente e intuitiva para lidar com a lógica por trás dos formulários. 

    Ao contrário de abordagens que geralmente envolvem o uso de estado local e manipulação manual de eventos, ela oferece uma solução mais abrangente

    Afinal, abstrai muitos dos aspectos complicados da interação com formulários, como controle de estado, validação de entrada e tratamento de eventos de envio. 

    O padrão de renderização de propriedades (prop render) renderiza os componentes de formulário diretamente dentro do Formik, mantendo o controle de estado e validação associados. 

    Com isso, o processo de criação e manutenção de formulários é simplificado, reduzindo a necessidade de acompanhar manualmente o estado em todo o aplicativo. 

    Vamos explorar como manipular formulários com o Formik em uma aplicação React. 

    Uso do Formik para manipular formulários 

    Suponhamos que temos um formulário de login com campos para e-mail e senha. Criamos um componente LoginForm e utilizamos o Formik para gerenciar o estado e lidar com as ações de envio: 

    import React from ‘react’; 

    import { Formik, Form, Field, ErrorMessage } from ‘formik’; 

    const LoginForm = () => { 

      const handleSubmit = (values, { setSubmitting }) => { 

        // Simulação de envio de dados para um servidor 

        setTimeout(() => { 

          console.log(values); 

          setSubmitting(false); 

        }, 1000); 

      }; 

      return ( 

        <div> 

          <h2>Login</h2> 

          <Formik 

            initialValues={{ email: ”, password: ” }} 

            validate={values => { 

              const errors = {}; 

              if (!values.email) { 

                errors.email = ‘Campo obrigatório’; 

              } 

              if (!values.password) { 

                errors.password = ‘Campo obrigatório’; 

              } 

              return errors; 

            }} 

            onSubmit={handleSubmit} 

          > 

            {({ isSubmitting }) => ( 

              <Form> 

                <div> 

                  <Field type=”email” name=”email” placeholder=”Email” /> 

                  <ErrorMessage name=”email” component=”div” /> 

                </div> 

                <div> 

                  <Field type=”password” name=”password” placeholder=”Senha” /> 

                  <ErrorMessage name=”password” component=”div” /> 

                </div> 

                <button type=”submit” disabled={isSubmitting}> 

                  Enviar 

                </button> 

              </Form> 

            )} 

          </Formik> 

        </div> 

      ); 

    }; 

    export default LoginForm; 

    No código, estamos utilizando os componentes Formik, Form, Field e ErrorMessage para criar um formulário de login.  

    O initialValues define os valores iniciais dos campos, validate é uma função de validação que verifica se os campos estão preenchidos e onSubmit é a função que será chamada quando o formulário for enviado. 

    Validação de entrada 

    Quando se trata de lidar com validação, envio de dados e tratamento de erros em formulários utilizando o Formik, existem várias estratégias para garantir uma experiência de usuário suave e confiável. 

    Na validação de entrada, podemos utilizar as props validate ou validationSchema para definir as regras para cada campo. 

    Além disso, é possível implementar funções personalizadas para validar formatos específicos, como e-mails, números de telefone ou códigos postais. 

    Também é recomendado aproveitar os esquemas de validação fornecidos por bibliotecas externas, como Yup, para simplificar a definição de regras complexas. 

    Feedback de validade 

    Para fornecer feedback de validade, é essencial exibir mensagens de erro relevantes ao lado de cada campo do formulário para indicar ao usuário quando uma entrada é inválida. 

    Isso pode ser feito utilizando a prop error fornecida pelo Formik para acessar as mensagens de erro associadas a cada campo do formulário e exibi-las dinamicamente com base no estado de validação. 

    Envio de dados 

    Devemos implementar a função handleSubmit para lidar com o envio de dados do formulário. 

    É importante realizar qualquer validação adicional ou processamento de dados antes de enviar os dados para o servidor. 

    Usamos métodos assíncronos como chamadas de API dentro do handleSubmit para enviar os dados para o servidor e lidar com a resposta dele de forma adequada. 

    Tratamento de erros 

    A lógica de tratamento de erros dentro do handleSubmit lida com casos em que o envio de dados falha. 

    É essencial exibir mensagens apropriadas para informar ao usuário quando ocorrer um erro durante o envio de dados. 

    Essa mensagem tem de ser visual também. Manter o design do feedback alinhado com o da aplicação resulta em uma experiência coesa. 

    Integração do Formik com outras bibliotecas 

    A integração do Formik com outras bibliotecas pode proporcionar uma experiência de formulário ainda mais eficiente, aproveitando as funcionalidades complementares oferecidas. 

    Ao utilizar o Yup juntamente com o Formik, é possível definir esquemas de validação complexos de forma declarativa.  

    Com a prop validationSchema, dá para especificar um esquema de validação Yup para o formulário, aproveitando funcionalidades poderosas como validação condicional, validação assíncrona e mensagens de erro personalizadas. 

    Já a integração com o React Select permite criar campos de seleção personalizados e avançados.  

    Ao encapsular o componente React Select dentro do componente Field do Formik, é possível sincronizar automaticamente o estado do formulário com o componente de seleção.  

    Dessa maneira, aproveitamos funcionalidades avançadas como filtragem, pesquisa, agrupamento e controle de múltipla seleção para melhorar a experiência do usuário ao lidar com campos de seleção em formulários. 

    Leia mais

    Por usar o Styled Components? 

    A biblioteca Styled Components oferece praticidade na estilização de componentes React JS. 

    Ela pode criar estilos dinâmicos com base em props ou estado, permitindo gerar componentes personalizáveis e reutilizáveis, adaptando conforme condições ou dados específicos. 

    Por exemplo, é possível alterar a cor de um botão com base no estado de um formulário ou personalizar um componente de acordo com diferentes propriedades. 

    A ferramenta também simplifica a organização e manutenção de estilos em componentes React. 

    Ao encapsular os estilos diretamente nos componentes, você elimina a necessidade de arquivos separados, reduzindo a complexidade e melhorando a legibilidade do código

    O Styled Components oferece suporte à estilização global e à definição de temas, permitindo a criação de estilos consistentes em toda a aplicação e a fácil personalização de design. 

    Como fazer gerenciamento de estado com React Query? 

    O React Query é uma biblioteca desenvolvida para simplificar o gerenciamento de estado em aplicações React que lidam com dados remotos

    Uma de suas principais vantagens é a simplificação da integração com APIs. Ele fornece ganchos e utilitários para fazer solicitações de forma fácil e eficiente, gerenciando automaticamente o ciclo de vida e atualizando o estado conforme necessário. 

    Além disso, o React Query conta com um sistema integrado de gerenciamento de cache automático.  

    Assim, os resultados das solicitações de API podem ser armazenados automaticamente, permitindo que sejam recuperados do cache, em vez de fazer uma nova solicitação quando necessário. 

    A biblioteca também oferece ganchos para acessar e manipular os dados de forma eficiente, além de funções para atualizar, invalidar e refetch dados conforme a necessidade, o que simplifica o gerenciamento do estado. 

    O React Query tem suporte para uma variedade de recursos avançados, como paginação, refetching manual e prefetching de dados, permitindo personalizar o comportamento do gerenciamento de estado segundo as necessidades específicas da aplicação. 

    Apesar de ser uma biblioteca independente, ele pode ser facilmente integrado a outras bibliotecas de estado, como Redux, se necessário. 

    Estratégias para realizar consultas, atualizações e invalidação de cache 

    Para realizar consultas, atualizações e invalidação de cache de forma prática com o React Query, é importante entender os principais conceitos e estratégias oferecidos pela biblioteca.  

    • Consultas (queries): utilize o useQuery para buscar dados de uma API, passando a função que realiza a solicitação como argumento. 
    • Atualizações (mutations): com o useMutation, defina uma função que faz a operação de atualização na API. Em seguida, chame-a quando necessário, por exemplo, em resposta a um evento de clique em um botão de envio de formulário. 
    • Invalidação de cache: você pode chamar a função refetch em resposta a eventos específicos, como uma ação de atualização bem-sucedida. 
    • Atualização otimista: a opção optimisticUpdate chama a função mutate em uma operação para atualizar localmente os dados antes de enviar a solicitação para o servidor.  
    • Gestão de erros: onError e onSettled lidam com problemas de solicitação, exibindo mensagens ao usuário ou executando ações de limpeza, como redefinir o estado da aplicação. 

    Integração com outras bibliotecas de estado 

    Integrar o React Query a outras bibliotecas de estado, como o Redux, pode ser necessário em cenários onde já há um uso extensivo dessas bibliotecas e é crucial manter a consistência do estado global.  

    Para realizar essa integração de forma eficaz, siga um passo a passo prático. 

    1. Configure o Redux Toolkit para criar uma store com reducers para o estado global e utilize o React Query para consultas e atualizações de dados remotos. 
    1. Configure um middleware Redux que intercepte ações específicas do React Query, como solicitações de consulta ou atualização, e execute lógica adicional, como atualizações no estado global ou disparo de outras ações. 
    1. Defina selectors Redux que extraiam e formatem dados obtidos por meio das consultas do React Query, tornando-os disponíveis para serem usados em componentes React conectados ao Redux. 
    1. Defina ações Redux que encapsulem operações relacionadas ao React Query, como iniciar ou finalizar uma consulta, atualizar o estado de carregamento ou lidar com erros, e despache essas ações nos momentos apropriados dentro da lógica do React Query. 

    Quais são as vantagens do Storybook no desenvolvimento de componentes React? 

    O Storybook simplifica o desenvolvimento e a documentação de componentes React JS de forma isolada, oferecendo diversas funcionalidades. 

    No desenvolvimento iterativo, podemos criar e iterar rapidamente sobre componentes, sem a necessidade de configurar toda a aplicação.  

    Isso permite um foco mais direcionado na implementação e na visualização individual deles. 

    A capacidade de gerar documentação automaticamente para os componentes é outra vantagem importante do Storybook. 

    Por meio da adição de anotações (stories) que descrevem comportamento, propriedades e casos de uso, as pessoas desenvolvedoras podem simplificar significativamente a compreensão e a utilização correta. 

    Além disso, o Storybook oferece suporte a testes visuais, permitindo que devs comparem visualmente as alterações nos componentes ao longo do tempo. 

    Por fim, o Storybook facilita a visualização e reutilização de componentes em outros projetos, promovendo a consistência e padronização no desenvolvimento. 

    Criação de uma biblioteca usando Storybook 

    Para criar uma biblioteca de componentes visualmente atraente e funcional utilizando o Storybook, é essencial estabelecer diretrizes claras de design e estilo para aplicar de forma consistente, garantindo uma experiência de usuário coesa.  

    Antes de tudo, divida a interface do usuário em componentes reutilizáveis e modulares, facilitando sua manutenção e reutilização em diferentes partes da aplicação. 

    Uma dica é utilizar o Storybook para documentar cada componente de maneira clara e detalhada, incluindo exemplos de uso e descrições de propriedades. Isso torna mais fácil para a equipe de desenvolvimento entender como utilizá-los corretamente. 

    Os testes visuais garantem que os componentes sejam renderizados e mantenham a consistência visual esperada ao longo do tempo. 

    Projete os componentes para serem facilmente personalizáveis e estendidos, oferecendo flexibilidade para adaptar o Storybook às necessidades específicas do projeto. 

    Extensão das capacidades com addons 

    O uso de addons e plugins para estender as capacidades do Storybook permite adicionar funcionalidades como visualização de ações, interação dinâmica com knobs, testes automatizados e documentação automática, proporcionando uma experiência mais completa e eficiente. 

    Além disso, possibilita personalizar o Storybook com plugins específicos que atendam às necessidades do projeto, oferecendo flexibilidade e adaptabilidade às demandas do desenvolvimento de componentes React JS. 

    Quais são os benefícios de usar bibliotecas no React JS? 

    Ao adotar estrategicamente as bibliotecas em projetos com React JS, podemos simplificar a implementação de funcionalidades complexas, melhorar a qualidade do código e garantir a facilidade de manutenção. 

    A capacidade de integrar eficientemente essas ferramentas no fluxo de trabalho resulta em um ciclo de desenvolvimento mais rápido e com menos bugs, além de uma boa experiência para usuários. 

    Pronto para levar sua aplicação para o próximo nível? Experimente a Hospedagem Dedicada Locaweb com sites ilimitados, disco SSD, muito mais estabilidade e performance. 

    Mantenha o seu site no ar mesmo com picos de acesso, sem compartilhar memória, processamento e disco. Conheça a Hospedagem Dedicada Locaweb!

    Clique aqui!