Introdução

Neste tutorial, vamos explorar como desenvolver interfaces altamente responsivas utilizando o framework React juntamente com a biblioteca Redux para gerenciamento eficiente de estado. A responsividade é uma característica essencial para aplicações modernas, permitindo que os usuários tenham uma experiência suave e dinâmica, independentemente do dispositivo que estão usando. Aprenderemos desde a configuração do ambiente de desenvolvimento até a implementação de componentes, gerenciamento de estado com Redux e testes unitários. Este guia é ideal para desenvolvedores que desejam aprofundar seus conhecimentos em React e Redux, criando aplicações interativas e escaláveis.

Etapas

  1. Configuração do Ambiente de Desenvolvimento

    Certifique-se de ter o Node.js e o npm (Node Package Manager) instalados em sua máquina. Você pode verificar se já tem as ferramentas instaladas usando os comandos `node -v` e `npm -v`. Caso não tenha, baixe e instale a versão mais recente do Node.js do site oficial.

    commands
    # Verificar versões instaladas
    node -v
    npm -v

  2. Criação do Projeto React

    Utilize a ferramenta Create React App para gerar um novo projeto React. No terminal, execute o comando abaixo, substituindo ‘minha-aplicacao’ pelo nome da sua aplicação.

    commands
    npx create-react-app minha-aplicacao
    cd minha-aplicacao

  3. Instalação do Redux e React-Redux

    Instale o Redux e a biblioteca React-Redux para gerenciar o estado da sua aplicação de forma eficiente. Execute o comando abaixo para adicionar essas bibliotecas ao seu projeto.

    commands
    npm install redux react-redux

  4. Estrutura do Projeto

    Organize a estrutura do seu projeto para incluir pastas para ações, redutores e componentes. A estrutura pode ser similar a esta:

    – src/
    – actions/
    – reducers/
    – components/
    – App.js
    – index.js

    Essa organização ajuda a manter o projeto escalável e fácil de manter.

    folders
    actions
    reducers
    components

  5. Criação de Ações do Redux

    Crie um arquivo para gerenciar as ações do Redux. No diretório `actions`, crie um arquivo chamado `actions.js` e defina as ações que alteram o estado da aplicação.

    actions.js
    export const ADD_TODO = 'ADD_TODO';
    
    export const addTodo = (todo) => {
        return {
            type: ADD_TODO,
            payload: todo
        };
    };

  6. Criação do Redutor do Redux

    No diretório `reducers`, crie um arquivo chamado `todoReducer.js` e defina o redutor que manipula as ações e atualiza o estado da aplicação.

    todoReducer.js
    import { ADD_TODO } from '../actions/actions';
    
    const initialState = {
        todos: []
    };
    
    const todoReducer = (state = initialState, action) => {
        switch (action.type) {
            case ADD_TODO:
                return {
                    ...state,
                    todos: [...state.todos, action.payload]
                };
            default:
                return state;
        }
    };
    
    export default todoReducer;

  7. Configuração da Store do Redux

    No arquivo `index.js`, configure a store do Redux e forneça-a ao seu aplicativo React. Certifique-se de importar o `Provider` do `react-redux` e o redutor que você criou.

    index.js
    import React from 'react';
    import ReactDOM from 'react-dom';
    import { Provider } from 'react-redux';
    import { createStore } from 'redux';
    import todoReducer from './reducers/todoReducer';
    import App from './App';
    
    const store = createStore(todoReducer);
    
    ReactDOM.render(
        <Provider store={store}>
            <App />
        </Provider>,
        document.getElementById('root')
    );

  8. Criação do Componente de Todo

    Crie um componente que permitirá ao usuário adicionar tarefas (todos) à lista. No diretório `components`, crie um arquivo chamado `Todo.js` e implemente o componente.

    Todo.js
    import React, { useState } from 'react';
    import { useDispatch } from 'react-redux';
    import { addTodo } from '../actions/actions';
    
    const Todo = () => {
        const [inputValue, setInputValue] = useState('');
        const dispatch = useDispatch();
    
        const handleAddTodo = () => {
            if (inputValue) {
                dispatch(addTodo(inputValue));
                setInputValue('');
            }
        };
    
        return (
            <div>
                <input
                    type="text"
                    value={inputValue}
                    onChange={(e) => setInputValue(e.target.value)}
                />
                <button onClick={handleAddTodo}>Adicionar Todo</button>
            </div>
        );
    };
    
    export default Todo;

  9. Renderização da Lista de Todos

    No componente `App.js`, importe o componente `Todo` e renderize a lista de tarefas utilizando o estado gerenciado pelo Redux.

    App.js
    import React from 'react';
    import { useSelector } from 'react-redux';
    import Todo from './components/Todo';
    
    const App = () => {
        const todos = useSelector(state => state.todos);
    
        return (
            <div>
                <h1>Minha Lista de Todos</h1>
                <Todo />
                <ul>{todos.map((todo, index) => <li key={index}>{todo}</li>)}</ul>
            </div>
        );
    };
    
    export default App;

  10. Implementação de Testes Unitários

    Utilize a biblioteca Jest, que já vem configurada com o Create React App, para criar testes unitários. Crie um arquivo chamado `Todo.test.js` para validar a lógica do componente todo.

    Todo.test.js
    import React from 'react';
    import { render, fireEvent } from '@testing-library/react';
    import { Provider } from 'react-redux';
    import { createStore } from 'redux';
    import todoReducer from '../reducers/todoReducer';
    import Todo from './Todo';
    
    const renderWithRedux = (
        component,
        { initialState, store = createStore(todoReducer, initialState) } = {}
    ) => {
        return { ...render(<Provider store={store}>{component}</Provider>), store };
    };
    
    test('adiciona um todo', () => {
        const { getByText, getByRole } = renderWithRedux(<Todo />);
    
        fireEvent.change(getByRole('textbox'), { target: { value: 'Novo Todo' } });
        fireEvent.click(getByText(/adicionar todo/i));
    
        expect(getByText('Novo Todo')).toBeInTheDocument();
    });

  11. Executando a Aplicação e Testes

    Use o comando npm para compilar e executar a aplicação. Utilize também ferramentas como Postman ou o console do navegador para interagir com a aplicação e verificar se o estado está sendo gerenciado adequadamente. Para executar os testes unitários, utilize o comando abaixo.

    commands
    # Compilar e executar a aplicação
    npm start
    # Executar os testes unitários
    npm test

Conclusão

Neste tutorial, você aprendeu a desenvolver uma interface altamente responsiva utilizando React e Redux. Desde a configuração do ambiente de desenvolvimento até a criação de ações e redutores, você agora tem a base necessária para criar aplicações escaláveis e interativas. A capacidade de gerenciar o estado de forma eficiente utilizando Redux é uma habilidade vital para qualquer desenvolvedor front-end. Com as dicas e códigos apresentados, você pode continuar a expandir suas aplicações e explorar mais recursos do React e Redux.

Hashtags

#React #Redux #DesenvolvimentoWeb #JavaScript #APIs #UIUX