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
:
- Importação: O hook
useState
deve ser importado do React.
import React, { useState } from 'react';
- 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
-
Como Funciona:
-
useState(0)
define o valor inicial do estado como0
. -
count
é o valor atual do estado. -
setCount
é a função que atualiza o valor decount
. - Quando
setCount
é chamado, o componente é re-renderizado com o novo valor do estado.
-
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;
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:
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.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.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:
- Instalação: Primeiro, você precisa instalar o Redux e o React-Redux (para integrar o Redux ao React):
npm install redux react-redux
- 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);
- 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' };
- Usando o
Provider
do React-Redux: Para conectar o Redux com o React, você usa oProvider
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> ); }
- Conectando Componentes com o Redux: Para conectar um componente ao estado global, você usa a função
connect
. Oconnect
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);
-
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.
- 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;
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)