DEV Community

Cover image for Redux com React
Henrique Vital
Henrique Vital

Posted on

Redux com React

Claro, Henrique! O Módulo 30: Introdução ao Redux com React é um dos módulos essenciais para entender como gerenciar o estado de aplicações React de forma eficiente, especialmente quando elas se tornam complexas e o uso do prop drilling (passagem de dados entre componentes) começa a ser um problema.

O que é o Redux?

O Redux é uma biblioteca de gerenciamento de estado que foi criada para resolver problemas como:

  • Prop Drilling: Quando você precisa passar dados entre vários componentes, criando uma árvore de componentes cada vez mais complexa.
  • Controle de estado em aplicações grandes: O Redux ajuda a centralizar o estado da aplicação, tornando-o previsível e fácil de debugar.

No Redux, o estado global da aplicação é gerido por uma Store (loja), e o fluxo de dados é feito através de Actions (ações) e Reducers (redutores). O Redux segue o padrão de fluxo unidirecional de dados, o que ajuda a ter um controle mais claro de como o estado é modificado.


Passo a Passo do Módulo 30

1. O Problema do Prop Drilling

Prop drilling ocorre quando você precisa passar dados de um componente pai para um componente filho, e depois para um outro componente, até chegar ao componente mais profundo que precisa desses dados. Isso pode se tornar um problema quando sua árvore de componentes é profunda, o que dificulta o controle e a manutenção do código.

Exemplo de prop drilling:

function Pai() {
  const [nome, setNome] = useState("Henrique");
  return <Filho nome={nome} />;
}

function Filho({ nome }) {
  return <Neto nome={nome} />;
}

function Neto({ nome }) {
  return <h1>{nome}</h1>;
}
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, o valor de nome precisa ser passado do componente Pai para Filho e depois para Neto. Quando temos muitos níveis de componentes, esse processo de passagem de dados se torna difícil de gerenciar.

2. A Solução: Redux

Redux resolve esse problema criando uma Store centralizada onde o estado global da aplicação fica armazenado. Em vez de passar dados através de props entre vários componentes, o Redux permite que qualquer componente acesse o estado diretamente da Store, facilitando a gestão do estado da aplicação.


3. Fluxo de Dados no Redux

O fluxo de dados no Redux é unidirecional, o que significa que as mudanças de estado seguem um caminho bem definido:

  1. Ação (Action): Uma ação é um objeto JavaScript simples que descreve o que aconteceu. Uma ação tem pelo menos uma propriedade type, que descreve o tipo da ação, e pode ter outras propriedades com dados adicionais.
   const minhaAcao = {
     type: 'ADICIONAR_ITEM',
     payload: 'Novo item',
   };
Enter fullscreen mode Exit fullscreen mode
  1. Dispatcher: A dispatcher é responsável por enviar as ações para o reducer. Isso é feito usando o método dispatch, geralmente através de hooks como useDispatch() no React.
   dispatch(minhaAcao);
Enter fullscreen mode Exit fullscreen mode
  1. Reducer: O reducer é uma função que recebe o estado atual e a ação, e retorna um novo estado. Ele não deve modificar o estado atual, mas sempre retornar uma nova versão dele. Cada ação tem um tipo, e o reducer decide como modificar o estado com base nesse tipo.

Exemplo de um reducer:

   const estadoInicial = {
     itens: [],
   };

   const reducer = (estado = estadoInicial, acao) => {
     switch (acao.type) {
       case 'ADICIONAR_ITEM':
         return {
           ...estado,
           itens: [...estado.itens, acao.payload],
         };
       default:
         return estado;
     }
   };
Enter fullscreen mode Exit fullscreen mode
  1. Store: A store é o local onde o estado da aplicação é armazenado. A store pode ser configurada usando o createStore do Redux.

Exemplo de configuração de store:

   import { createStore } from 'redux';

   const store = createStore(reducer);
Enter fullscreen mode Exit fullscreen mode
  1. View: A view (geralmente, os componentes do React) escuta as mudanças de estado na Store e atualiza a interface do usuário conforme necessário.

4. Integrando o Redux com React

O Redux funciona bem com o React quando usamos a biblioteca react-redux, que fornece hooks e componentes para integrar a Store do Redux aos componentes do React.

5. Passos para Integrar Redux no React

Passo 1: Instalar as dependências

Para começar a usar o Redux com React, você precisa instalar duas dependências:

npm install redux react-redux
Enter fullscreen mode Exit fullscreen mode
  • redux: A biblioteca central do Redux.
  • react-redux: A biblioteca que conecta o Redux ao React.

Passo 2: Criar um Reducer

Crie um reducer que irá gerenciar o estado da aplicação:

const estadoInicial = {
  contador: 0,
};

const contadorReducer = (estado = estadoInicial, acao) => {
  switch (acao.type) {
    case 'INCREMENTAR':
      return {
        ...estado,
        contador: estado.contador + 1,
      };
    default:
      return estado;
  }
};
Enter fullscreen mode Exit fullscreen mode

Passo 3: Configurar a Store

Crie a store, que vai armazenar o estado central da aplicação:

import { createStore } from 'redux';
import { Provider } from 'react-redux';

const store = createStore(contadorReducer);
Enter fullscreen mode Exit fullscreen mode

Passo 4: Conectar o Redux ao React com o Provider

Para conectar a Store ao React, você envolve o componente raiz da aplicação com o Provider, passando a store como propriedade:

import { Provider } from 'react-redux';
import { store } from './store'; // onde a store está configurada

function App() {
  return (
    <Provider store={store}>
      <MeuComponente />
    </Provider>
  );
}
Enter fullscreen mode Exit fullscreen mode

Passo 5: Usar useDispatch e useSelector no React

Agora, no seu componente React, você pode acessar e modificar o estado usando os hooks useSelector e useDispatch do react-redux.

  • useSelector: Esse hook permite acessar o estado global da aplicação.
  • useDispatch: Esse hook é usado para disparar ações e atualizar o estado.

Exemplo de como usar esses hooks:

import { useSelector, useDispatch } from 'react-redux';

function MeuComponente() {
  const contador = useSelector((estado) => estado.contador);
  const dispatch = useDispatch();

  const incrementar = () => {
    dispatch({ type: 'INCREMENTAR' });
  };

  return (
    <div>
      <h1>{contador}</h1>
      <button onClick={incrementar}>Incrementar</button>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

6. Conceito de Slices e Reducers no Redux Toolkit

O Redux Toolkit é uma versão aprimorada e mais fácil de usar do Redux. Ele fornece métodos como createSlice e createAsyncThunk, que facilitam a criação de reducers e ações.

Exemplo usando Redux Toolkit:

import { createSlice } from '@reduxjs/toolkit';

const contadorSlice = createSlice({
  name: 'contador',
  initialState: { contador: 0 },
  reducers: {
    incrementar: (state) => {
      state.contador += 1;
    },
  },
});

export const { incrementar } = contadorSlice.actions;
export default contadorSlice.reducer;
Enter fullscreen mode Exit fullscreen mode

7. Seletores e Atualizando o Estado no Redux

Um seletor é uma função que permite acessar partes específicas do estado na store. Em vez de acessar o estado diretamente, você usa um seletor para obter as informações de forma mais organizada.

const selectContador = (estado) => estado.contador;
Enter fullscreen mode Exit fullscreen mode

8. Redux Toolkit Query

O Redux Toolkit Query é uma ferramenta para facilitar a realização de requisições HTTP e o gerenciamento de dados relacionados ao servidor. Ele permite que você configure facilmente endpoints e trate requisições assíncronas.


Conclusão

Aprendemos os conceitos fundamentais do Redux e como ele ajuda a gerenciar o estado em aplicações React. Vimos o fluxo de dados unidirecional do Redux, a criação de actions, reducers, e store, e como integrá-los com o React utilizando o react-redux. Também discutimos o Redux Toolkit, que simplifica ainda mais o uso do Redux, e como fazer requisições assíncronas com o Redux Toolkit Query.

O Redux é uma ferramenta poderosa, especialmente para grandes aplicações com estados complexos. Com ele, você consegue centralizar e gerenciar o estado de forma previsível e fácil de debugar.

Top comments (0)