DEV Community

Cover image for React Redux
Henrique Vital
Henrique Vital

Posted on

React Redux

Vamos explorar Redux e useState detalhadamente, duas ferramentas essenciais para o gerenciamento de estado em aplicações React. Vamos começar com useState, que é mais simples e utilizado diretamente no React, e depois vamos para Redux, que é uma solução mais robusta para gerenciamento de estado em aplicações maiores.


1. useState (Hook do React)

O useState é um hook que permite adicionar e manipular estado em componentes funcionais do React. Anteriormente, o estado era uma característica exclusiva dos componentes de classe, mas com a introdução dos hooks, o useState trouxe uma maneira simples de usar estado em componentes funcionais.

Como Usar o useState:

  1. Importação: O hook useState deve ser importado do React.
 import React, { useState } from 'react'; 
Enter fullscreen mode Exit fullscreen mode
  1. Declarando o Estado: Dentro de um componente funcional, usamos useState para declarar o estado. Ele retorna dois valores:
    • O valor do estado (o valor atual).
    • Uma função para atualizar esse estado.

Exemplo básico de uso:

 const [count, setCount] = useState(0); // 0 é o valor inicial const increment = () => setCount(count + 1); // Função para atualizar o estado 
Enter fullscreen mode Exit fullscreen mode
  1. Como Funciona:

    • useState(0) define o valor inicial do estado como 0.
    • count é o valor atual do estado.
    • setCount é a função que atualiza o valor de count.
    • Quando setCount é chamado, o componente é re-renderizado com o novo valor do estado.
  2. Exemplo Completo:

 import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0); const increment = () => { setCount(count + 1); // Atualiza o estado }; return ( <div> <p>Contagem: {count}</p>  <button onClick={increment}>Incrementar</button>  </div>  ); } export default Counter; 
Enter fullscreen mode Exit fullscreen mode

Nesse exemplo, sempre que o botão for clicado, o contador (count) será incrementado, e o componente será re-renderizado com o novo valor.


2. Redux

O Redux é uma biblioteca de gerenciamento de estado previsível para JavaScript, comumente usada em aplicações React. Ele é particularmente útil em grandes aplicações onde o estado precisa ser compartilhado entre diferentes componentes de maneira eficiente e previsível.

Como o Redux Funciona:

O Redux segue um fluxo de dados unidirecional e é baseado em três princípios principais:

  1. Uma Única Fonte de Verdade:
    O estado da aplicação é armazenado em um único objeto (store). Isso significa que todo o estado da aplicação é centralizado e acessado a partir de um único ponto.

  2. O Estado é Somente Leitura:
    O estado só pode ser alterado por meio de ações. Essas ações são objetos que descrevem o que aconteceu na aplicação.

  3. Mudanças Através de Funções Puras (Reducers):
    Para alterar o estado, você usa reducers, que são funções puras (funções que retornam um novo valor sem modificar o estado original).

Passos para Configurar o Redux:

  1. Instalação: Primeiro, você precisa instalar o Redux e o React-Redux (para integrar o Redux ao React):
 npm install redux react-redux 
Enter fullscreen mode Exit fullscreen mode
  1. Criando a Store: A store centraliza o estado da aplicação. Você cria a store com o createStore() do Redux e passa o reducer como argumento.
 import { createStore } from 'redux'; // Exemplo de um reducer simples const initialState = { count: 0 }; function counterReducer(state = initialState, action) { switch (action.type) { case 'INCREMENT': return { count: state.count + 1 }; case 'DECREMENT': return { count: state.count - 1 }; default: return state; } } const store = createStore(counterReducer); 
Enter fullscreen mode Exit fullscreen mode
  1. Criando Ações (Actions): As ações são objetos que descrevem a intenção de mudar o estado. Uma ação deve ter uma propriedade type que descreve a ação.
 const incrementAction = { type: 'INCREMENT' }; const decrementAction = { type: 'DECREMENT' }; 
Enter fullscreen mode Exit fullscreen mode
  1. Usando o Provider do React-Redux: Para conectar o Redux com o React, você usa o Provider para passar a store para o restante da sua aplicação.
 import React from 'react'; import { Provider } from 'react-redux'; import { store } from './store'; // Importando a store criada function App() { return ( <Provider store={store}> <Counter /> </Provider>  ); } 
Enter fullscreen mode Exit fullscreen mode
  1. Conectando Componentes com o Redux: Para conectar um componente ao estado global, você usa a função connect. O connect conecta o estado da store ao seu componente React.
 import React from 'react'; import { connect } from 'react-redux'; function Counter({ count, increment, decrement }) { return ( <div> <p>Contagem: {count}</p>  <button onClick={increment}>Incrementar</button>  <button onClick={decrement}>Decrementar</button>  </div>  ); } const mapStateToProps = (state) => ({ count: state.count }); const mapDispatchToProps = (dispatch) => ({ increment: () => dispatch({ type: 'INCREMENT' }), decrement: () => dispatch({ type: 'DECREMENT' }) }); export default connect(mapStateToProps, mapDispatchToProps)(Counter); 
Enter fullscreen mode Exit fullscreen mode
  • mapStateToProps: Mapeia o estado global da store para as props do componente.
  • mapDispatchToProps: Mapeia as funções de envio de ações (dispatch) para as props do componente.
  1. Fluxo de Dados no Redux:
    • Store: Contém o estado da aplicação.
    • Actions: Objetos que descrevem o que aconteceu.
    • Reducers: Funções que atualizam o estado com base nas ações recebidas.

Exemplo Completo de Redux com React:

// Redux - Store e Reducer import { createStore } from 'redux'; const initialState = { count: 0 }; function counterReducer(state = initialState, action) { switch (action.type) { case 'INCREMENT': return { count: state.count + 1 }; case 'DECREMENT': return { count: state.count - 1 }; default: return state; } } const store = createStore(counterReducer); // React Component - Counter.js import React from 'react'; import { connect } from 'react-redux'; function Counter({ count, increment, decrement }) { return ( <div> <p>Contagem: {count}</p>  <button onClick={increment}>Incrementar</button>  <button onClick={decrement}>Decrementar</button>  </div>  ); } const mapStateToProps = (state) => ({ count: state.count }); const mapDispatchToProps = (dispatch) => ({ increment: () => dispatch({ type: 'INCREMENT' }), decrement: () => dispatch({ type: 'DECREMENT' }) }); export default connect(mapStateToProps, mapDispatchToProps)(Counter); // App.js - Provider import React from 'react'; import { Provider } from 'react-redux'; import { store } from './store'; // Importando a store criada import Counter from './Counter'; function App() { return ( <Provider store={store}> <Counter /> </Provider>  ); } export default App; 
Enter fullscreen mode Exit fullscreen mode

Diferenças Entre useState e Redux:

  • Escopo: useState é ideal para gerenciar estados locais dentro de um componente, enquanto o Redux é melhor para gerenciar estados globais compartilhados por múltiplos componentes.
  • Simplicidade: useState é simples e direto, enquanto o Redux exige mais configuração (como actions, reducers e store) e é melhor para estados mais complexos e escaláveis.
  • Reatividade: O Redux permite que diferentes componentes da aplicação compartilhem um único estado global, tornando o gerenciamento de dados mais previsível em grandes aplicações.

Espero que essa explicação tenha ficado clara! Se você tiver dúvidas em algum ponto ou quiser mais detalhes, estou à disposição para ajudar. 😊

Top comments (0)