DEV Community

Roberson Miguel
Roberson Miguel

Posted on

Gerenciamento de estados da Api React - Rails

Após implementar as rotas e configurar os componentes React básicos para trabalhar com o Rails, o próximo passo é a integração.

1. Gerenciamento de Estado com Redux ou Context API:

Se sua aplicação React começar a crescer em complexidade, é útil utilizar uma ferramenta de gerenciamento de estado, como Redux ou a Context API. Isso ajuda a gerenciar dados compartilhados entre componentes de maneira eficiente.

  • Redux: Ideal para aplicações grandes com muita lógica de estado. Permite centralizar o estado da aplicação em uma única store.
  • Context API: Útil para gerenciamento de estado mais simples e localizado.

Exemplo com Context API:

   import React, { createContext, useContext, useState } from 'react';

   const AppContext = createContext();

   export const AppProvider = ({ children }) => {
     const [state, setState] = useState(initialState);

     return (
       <AppContext.Provider value={{ state, setState }}>
         {children}
       </AppContext.Provider>
     );
   };

   export const useAppContext = () => useContext(AppContext);
Enter fullscreen mode Exit fullscreen mode

2. Integração com APIs e Comunicação com Backend:

Para que os componentes React interajam com o backend Rails, você precisará configurar chamadas a APIs. Use bibliotecas como Axios para realizar essas requisições HTTP.

Exemplo com Axios:

   import axios from 'axios';

   const fetchData = async () => {
     try {
       const response = await axios.get('/api/v1/some_endpoint');
       console.log(response.data);
     } catch (error) {
       console.error('Error fetching data:', error);
     }
   };

   fetchData();
Enter fullscreen mode Exit fullscreen mode

3. Autenticação e Autorização:

Se sua aplicação requer controle de acesso, você precisará integrar autenticação e autorização. Isso pode ser feito utilizando bibliotecas como Devise para Rails e JWT (JSON Web Tokens) para o lado do cliente.

Exemplo de uso de JWT:

   import axios from 'axios';

   const login = async (credentials) => {
     try {
       const response = await axios.post('/api/v1/login', credentials);
       localStorage.setItem('token', response.data.token);
     } catch (error) {
       console.error('Login error:', error);
     }
   };

   const getToken = () => localStorage.getItem('token');
Enter fullscreen mode Exit fullscreen mode

4. Componentização e Reutilização:

Ao desenvolver sua interface, busque criar componentes reutilizáveis. Isso não só economiza tempo, mas também mantém o código organizado e fácil de manter.

Exemplo de componente reutilizável:

   const Button = ({ label, onClick }) => (
     <button onClick={onClick} className="btn">
       {label}
     </button>
   );
Enter fullscreen mode Exit fullscreen mode

5. Testes:

Garantir a qualidade do código é essencial. Utilize ferramentas de teste como Jest para testes unitários e Enzyme ou Testing Library para testes de integração e componentes.

Exemplo básico de teste com Jest:

   import { render, screen } from '@testing-library/react';
   import AdminPage from './AdminPage';

   test('renders Admin Page title', () => {
     render(<AdminPage />);
     const titleElement = screen.getByText(/Admin Page/i);
     expect(titleElement).toBeInTheDocument();
   });
Enter fullscreen mode Exit fullscreen mode

6. Estilização e Temas:

Decida como será feita a estilização dos componentes. Você pode usar CSS tradicional, CSS-in-JS (como styled-components), ou frameworks como Bootstrap ou Material-UI para acelerar o desenvolvimento.

Exemplo com styled-components:

   import styled from 'styled-components';

   const StyledButton = styled.button`
     background-color: #007bff;
     color: white;
     border: none;
     padding: 10px 20px;
     border-radius: 5px;
     cursor: pointer;

     &:hover {
       background-color: #0056b3;
     }
   `;
Enter fullscreen mode Exit fullscreen mode

7. Otimização de Performance:

À medida que a aplicação cresce, otimize a performance utilizando técnicas como lazy loading, memoization e virtualização de listas para evitar renderizações desnecessárias.

Exemplo de lazy loading:

   import React, { Suspense, lazy } from 'react';

   const LazyComponent = lazy(() => import('./LazyComponent'));

   const App = () => (
     <Suspense fallback={<div>Loading...</div>}>
       <LazyComponent />
     </Suspense>
   );
Enter fullscreen mode Exit fullscreen mode

8. Documentação e Boas Práticas:

Como um bom DevRel, sempre digo, documente a arquitetura da aplicação, padrões de código e convenções utilizadas. Isso facilita a colaboração e manutenção por parte de outros desenvolvedores.

É importante manter o foco na experiência do usuário e na manutenção do código para garantir que a aplicação continue escalável e fácil de gerenciar.

Top comments (0)