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)