Instalando e Configurando o Redux

Instalando e Configurando o Redux

Olá leitor, seja bem vindo a segunda lição da sub-jornada do ReactJS + Redux 🥳

Aqui você vai aprender a instalar a biblioteca Redux e fazer as configurações inciais!

O que muda com a chegada do Redux?

Na jornada anterior (ReactJS + Javascript), você aprendeu a fazer a estruturação inicial das suas pastas em praticamente todas as lições.

Ainda se lembra dessa mensagem aqui?

Nossos projetos de testes sempre contavam com a seguinte estrutura de pastas:

A pasta components armazenava os componentes, a pasta de pages às páginas, routes nossas rotas e por aí vai...

Daí você se perguntar "Com a chegada dessa nova biblioteca (Redux), muda muita coisa?".

A resposta é NÃO, dê uma olhada em um projeto feito com Redux:

Conseguiu notar a diferença?

Exatamente 🤣

A única diferença é a existência de uma nova pasta chamada redux dentro da pasta src. E vai ser alí dentro que iremos configurar nosso redux store, reducers, actions e entre outras funcionalidades da biblioteca, ou seja, a lógica do estado global estará toda contida alí dentro.

E é claro, nossos components e services deverão importar alguns dos arquivos alí existentes de modo a chamar a lógica da biblioteca do Redux.

Sendo assim, pode ficar tranquilo que nada de muito diferente mudou 😄

E a instalação, ainda usamos o create-react-app? Sim! Vejamos...

Criando seu projeto de testes

Antes de começarmos, vamos criar um novo projeto em ReactJS dedicado a esta lição. No meu caso criei um novo projeto chamado de reactjs-com-redux:  

npx create-react-app reactjs-com-redux

Após isso, não se esqueça de fazer aquela limpeza do código, e também aquela organizada nas pastas do src (organização por funcionalidade) 😁

Feito isso, vamos instalar o REDUX 💜

Instalando o Redux em seu projeto ReactJS

Para instalar a biblioteca, o procedimento é mesmo que vimos em lições passadas.

Abra o terminal (prompt de comando) do seu sistema operacional, navegue até a pasta raiz do seu projeto (reactjs-com-redux) e execute os seguintes comandos:

npm install redux

npm install react-redux

npm install @reduxjs/toolkit

Observação: Se preferir você pode instalar esses 3 pacotes de uma só vez da seguinte forma:

npm install redux react-redux @reduxjs/toolkit

Após concluir a instalação, a sua aplicação já esta pronta para usar o Redux 🤓

Configurando o Redux

Dentro da pasta src do seu projeto, a primeira coisa que você precisa fazer é criar uma nova pasta chamada de redux:

Essa é a pasta que iremos armazenar toda a lógica de gerenciamento dos estados globais da nossa aplicação.

Em seguida, dentro da pasta redux, vamos criar dois novos arquivos, chamados de:

  • root-reducer.js
  • store.js

store.js: é o arquivo que será usado para configurar às nossas stores, que armazenam os dados dentro de um único objeto.

root-reducer.js: é o arquivo responsável por chamar todos os nossos reducers que teremos na nossa aplicação. Como podemos ter diversos controles usando redux, a estratégia desse arquivo se faz essêncial para um gerencimanto melhor.

A configuração inicial de ambos os arquivos é a seguinte:

Redux > root-reducer.js:

import { combineReducers } from "redux";
//import { userSlice } from "./user/slice";

export default combineReducers({
 //user: userSlice
});

Redux > store.js:

import { configureStore } from "@reduxjs/toolkit";
import rootReducer from "./root-reducer";

export const store = configureStore({
 reducer: rootReducer
});

Agora vamos às explicações.

A primeira linha importa a função combineReducers do pacote redux. Essa função é usada para combinar vários reducers individuais em um único reducer raiz.

A segunda linha que está comentada (//), ela é um exemplo de importação de um userSlice.

Um slice no Redux é uma forma de definir parte do estado e as funções que podem modificar esse estado.

A terceira parte (export default combineReducers({...});) exporta um reducer combinado.

No Redux, um reducer é uma função que especifica como o estado da aplicação muda em resposta a ações enviadas para a store do Redux.

O combineReducers combina vários reducers em um único reducer raiz, que pode então ser fornecido à função createStore do Redux.

Note que ali dentro eu simulei a exportação de um possível reducer chamado de user, que por sua vez armazena o slice.

Caso tivéssemos mais reducers a serem implementados, fariamos algo do tipo:

import { combineReducers } from "redux";
//import { userSlice } from "./user/slice";
//import { playerSlice } from "./player/slice";

export default combineReducers({
 //user: userSlice,
 //player: playerSlice
});

No exemplo acima, eu simulei a importação de um novo slice chamado de Player. Fiz isso para que esteja em conformância com a ilustração da arquitetura que vimos na lição passada 😉

No exemplo dado, não há nenhum reducer específico sendo combinado. O objeto dentro de combineReducers({}) está vazio ({}), e isso significa que, atualmente, não há nenhum estado sendo gerenciado por reducers neste ponto do código (veremos como fazer isso mais tarde).

Já no store.js, a primeira linha importa a função configureStore do pacote @reduxjs/toolkit. Essa função é uma maneira conveniente de configurar uma store Redux com recursos adicionais fornecidos pelo Redux Toolkit.

A segunda linha importa o rootReducer do arquivo ./root-reducer. No contexto do Redux, o rootReducer é o reducer principal que combina todos os outros reducers da aplicação.

Ele é o resultado da função combineReducers, que vimos no exemplo anterior, onde múltiplos reducers são combinados em um único reducer raiz.

A terceira parte (export const store = configureStore({...});) configura a store Redux. Aqui, configureStore é invocado com um objeto de configuração como argumento. O objeto de configuração especifica o reducer, que é o rootReducer importado anteriormente.

Por fim, não se esqueça de chamar o provider do redux dentro do index.js da sua aplicação, de modo a englobar e compartilhar seus slices:

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';

import { store } from './redux/store';
import { Provider } from 'react-redux';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
 <React.StrictMode>
 <Provider store={store}>
 <App />
 </Provider>
 </React.StrictMode>
);

No código acima estamos passando pelo componente <Provider /> o parâmetro chamado store que armazena o store.js que criamos dentro da pasta redux.

"Em vez de importar o <Provider /> dentro do index.js, será que não daria para importá-lo dentro do App.js ou em rotas específicas?"

Sim, você pode fazer isso da mesma forma como fez com seus contextos e a biblioteca do TanStackQuery. O único porém é que a ideia de termos a biblioteca Redux instalada em nosso projeto, é que consigamos controlar O ESTADO GLOBAL DA APLICAÇÃO.

Sendo assim, não faz muuuuuuuuito sentido colocar o <Provider /> dentro do app.js ou englobando algum componente ou rota, pois se fosse assim o uso de contextos já seria o suficiente, não?

Portanto, o <Provider /> do Redux sempre deve estar dentro do index.js, ok?

Feito isso, você já tem a configuração inicial do Redux 😄

Onde ficam armazenados os arquivos que representam os reducers?

De acordo com a ilustração acima, nós temos dois reducers, o Player e o User.

Em aulas futuras veremos que cada um desses reducers, deverão estar separados em suas respectivas pastas dentro da pasta principal (redux), por exemplo:

Será dessa forma que iremos separar nossos reducers!

"Como podemos consumir os dados que estão no store dentro da minha aplicação?" 

Bem, isso é um conteúdo que veremos na próxima lição 😉

Arquivos da lição

Os arquivos dessa lição podem ser encontrados neste repositório do GitHub.

Conclusão

Nesta lição você aprendeu a instalar e configurar a biblioteca do Redux.

Na próxima lição aprendemos a criar nossos reducers e consumir os dados que eles armazenam 🙃