<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Aldcejam</title>
    <description>The latest articles on DEV Community by Aldcejam (@aldcejam).</description>
    <link>https://dev.to/aldcejam</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1074386%2F7eecc263-af78-4e58-8482-6021ebcdf520.jpg</url>
      <title>DEV Community: Aldcejam</title>
      <link>https://dev.to/aldcejam</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aldcejam"/>
    <language>en</language>
    <item>
      <title>POR QUE e COMO USAR o Redux??</title>
      <dc:creator>Aldcejam</dc:creator>
      <pubDate>Wed, 31 May 2023 13:50:16 +0000</pubDate>
      <link>https://dev.to/aldcejam/por-que-e-como-usar-o-redux-5cco</link>
      <guid>https://dev.to/aldcejam/por-que-e-como-usar-o-redux-5cco</guid>
      <description>&lt;p&gt;&lt;em&gt;Redux com Toolkit no ReactJS/NextJS&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quer aprender apenas analisando um código?
&lt;/h2&gt;

&lt;p&gt;Vá ao repositório: &lt;em&gt;&lt;a href="https://github.com/aldcejam/Tutorial_Redux-toolkit"&gt;https://github.com/aldcejam/Tutorial_Redux-toolkit&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;O README do projeto diz quais os arquivos necessários para que o Redux funcione&lt;/em&gt;&lt;br&gt;
Os commits do projeto seguem a sequência deste tutorial pós instalação&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Os porquês:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Organização do estado: O Redux ajuda a manter todas as informações importantes do seu aplicativo organizadas em um só lugar, facilitando o controle e a compreensão.&lt;/li&gt;
&lt;li&gt;Fluxo de dados controlado: Com o Redux, você tem um fluxo de dados bem definido, o que torna mais fácil entender como as coisas funcionam e evita problemas inesperados.&lt;/li&gt;
&lt;li&gt;Escalabilidade: Se o seu aplicativo está ficando grande e complexo, o Redux oferece uma maneira de gerenciar tudo de forma mais estruturada, facilitando a manutenção e o desenvolvimento contínuo.&lt;/li&gt;
&lt;li&gt;Compatibilidade com outras bibliotecas: O Redux é amplamente utilizado em projetos JavaScript e funciona bem com várias bibliotecas e frameworks populares, como React, Angular e Vue.js.&lt;/li&gt;
&lt;li&gt;Ferramentas para desenvolvedores: O Redux oferece ferramentas que ajudam no desenvolvimento, depuração e monitoramento do estado do aplicativo, tornando o processo mais fácil e eficiente.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;ADENDO: Não é preciso utilizar o Redux para gerenciar todos os estados globais da sua aplicação. Se você tiver um caso simples, como configurar o tema do seu aplicativo, recomendo usar o Context do React.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Como usar:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Etapa 1: Instalação
&lt;/h3&gt;

&lt;p&gt;yarn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yarn add react-redux @reduxjs/toolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;npm&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install react-redux @reduxjs/toolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Etapa 2: Configurações:
&lt;/h3&gt;

&lt;p&gt;Crie uma pasta para conter os arquivos hook.ts e o store.ts do Redux&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|-- src
    |-- redux.config
        |-- hook.ts
        |-- store.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arquivo hook.ts&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Este arquivo será responsável pela tipagem dos estados do Redux.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'
import type { RootState, AppDispatch } from './store'

export const useAppDispatch: () =&amp;gt; AppDispatch = useDispatch
export const useAppSelector: TypedUseSelectorHook&amp;lt;RootState&amp;gt; = useSelector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Arquivo store.ts&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Este arquivo será responsável por centralizar os estados Redux.&lt;br&gt;
Neste arquivo você só precisa entender que cada item em reducer é um Estado Redux, ou seja, cada novo estado redux que criar, o adicione no objeto reducer.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { configureStore,ThunkAction,Action } from '@reduxjs/toolkit' 
/* import EstadoRedux from "caminho" */

export const Store = configureStore({
  reducer: {
    /* NomeDoEstado: EstadoRedux, */
  },
});

export type AppDispatch = typeof Store.dispatch;
export type RootState = ReturnType&amp;lt;typeof Store.getState&amp;gt;;
export type AppThunk&amp;lt;ReturnType = void&amp;gt; = ThunkAction&amp;lt;
  ReturnType,
  RootState,
  unknown,
  Action&amp;lt;string&amp;gt;
&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Agora vamos configurar o provider para que todos os nossos componentes e páginas possam acessar os estados do Redux.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;caso não esteja utilizando o diretório app com layouts do NextJS &lt;br&gt;
 versão 13+, apenas coloque o provider no arquivo _app.ts.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;o layout pai de todos ficará assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"use client"
import { Provider } from 'react-redux'
import { Store } from '@/redux.config/store'
import './globals.css' 


export default function RootLayout({
  children,
}: {
  children: React.ReactNode
}) {
  return (
    &amp;lt;html lang="pt-br"&amp;gt;
      &amp;lt;Provider store={Store}&amp;gt;
        &amp;lt;body&amp;gt;{children}&amp;lt;/body&amp;gt;
      &amp;lt;/Provider&amp;gt;
    &amp;lt;/html&amp;gt;
  )
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Etapa 3: Criar estado redux
&lt;/h3&gt;

&lt;p&gt;O nome do estado será "ShoppingCartData" e terá dois estados, um de string ID e outro de objeto com itens de compra e sua quantidade.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
   id: string
   itens: {
      carne: string
      arroz: string
   }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Siga estas etapas para se manter organizado:&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vamos criar a pasta &lt;a class="mentioned-user" href="https://dev.to/core"&gt;@core&lt;/a&gt; em src para centralizar os estados&lt;/li&gt;
&lt;li&gt;Vamos criar uma pasta com o nome do nosso estado&lt;/li&gt;
&lt;li&gt;Agora vamos criar um arquivo ShoppingCartData.ts e ShoppingCartData.d.ts para a tipagem
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|-- src
    |-- @core
        |-- ShoppingCartData
            |-- ShoppingCartData.ts
            |-- IShoppingCartData.d.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;no arquivo &lt;strong&gt;ShoppingCartData.ts&lt;/strong&gt; podemos fazer o seguinte código inicial padrão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { RootState } from "@/redux.config/store";
import { createSlice, PayloadAction } from "@reduxjs/toolkit";

const initialState = {

}

export const ShoppingCartDataSlice = createSlice({
    name: "ShoppingCartData",
    initialState,
    reducers: {
    }
})

export const { } = ShoppingCartDataSlice.actions

export const ShoppingCartDataStates = (state: RootState) =&amp;gt; state.ShoppingCartData

export default ShoppingCartDataSlice.reducer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;O objeto InitialStates é o responsável por ter todos os estados deste Redux&lt;br&gt;
  O objeto reducers será o responsável por ter todos os &lt;em&gt;setState&lt;/em&gt; dos estados em InitialStates&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora para fazer toda tipagem para o arquivo ShoppingCartData.ts vamos usar o arquivo &lt;em&gt;&lt;strong&gt;IShoppingCartData.d.ts&lt;/strong&gt;&lt;/em&gt;. Dado os estados previamente previstos temos a seguinte tipagem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;type IDProps = string
type ShoppingCartItemsProps = {
    [itemName: string]: string;
}

interface IShoppingCartDataProps {
    ID: IDProps;
    shoppingCartItems: ShoppingCartItemsProps;
}

export { IShoppingCartDataProps, IDProps, ShoppingCartItemsProps}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;A tipagem dos itens de IShoppingCartDataProps não são atoa, brevemente você entenderá o motivo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Agora, com a tipagem estabelecida podemos adicionar os estados de initialStates e os reducers no nosso arquivo ShoppingCartData.ts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { RootState } from "@/redux.config/store";
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
import { IDProps, IShoppingCartDataProps, ShoppingCartItemsProps } from "./IShoppingCartData"

const initialState: IShoppingCartDataProps = {
    ID: "" as IDProps,
    shoppingCartItems: {} as ShoppingCartItemsProps
}

export const ShoppingCartDataSlice = createSlice({
    name: "ShoppingCartData",
    initialState,
    reducers: {
        setID: (state, action: PayloadAction&amp;lt;IDProps&amp;gt;) =&amp;gt; {
            state.ID = action.payload
        },
        setShoppingCartItems: (state, action: PayloadAction&amp;lt;ShoppingCartItemsProps&amp;gt;) =&amp;gt; {
            state.shoppingCartItems = action.payload
        }
    }
})

export const {
    setID,
    setShoppingCartItems

} = ShoppingCartDataSlice.actions

export const ShoppingCartDataStates = (state: RootState) =&amp;gt; state.ShoppingCartData

export default ShoppingCartDataSlice.reducer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Perceba as seguintes etapas&lt;br&gt;
etapa 1: importação das tipagens do arquivo ShoppingCartData.d.ts.&lt;br&gt;
etapa 2: atribuição da tipagem "IShoppingCartDataProps" em InitialStates.&lt;br&gt;
etapa 3: implementação de valores iniciais para os estados de InitialStates (agora obrigatórios devido a tipagem).&lt;br&gt;
etapa 4: criação dos reducers para cada item de InitialStates. Perceba que tipamos o valor a ser recebido na função set quando colocamos "action: PayloadAction&amp;lt; IDProps&amp;gt;", logo, o state a ser passado para o setID terá que ser um valor do tipo IDProps.&lt;br&gt;
etapa 5: para finalizar exportamos os Set do reducers&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;para finalizar a etapa 3 podemos importar nosso ShoppingCartData para o store.ts. O arquivo ficará assim:&lt;/strong&gt;&lt;br&gt;
store.ts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import ShoppingCartData from '@/@core/ShoppingCartData/ShoppingCartData';
import { configureStore, ThunkAction, Action } from '@reduxjs/toolkit'


export const Store = configureStore({
    reducer: {
        ShoppingCartData,
    },
});

export type AppDispatch = typeof Store.dispatch;
export type RootState = ReturnType&amp;lt;typeof Store.getState&amp;gt;;
export type AppThunk&amp;lt;ReturnType = void&amp;gt; = ThunkAction&amp;lt;
    ReturnType,
    RootState,
    unknown,
    Action&amp;lt;string&amp;gt;
&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;O ShoppingCartData importado é o export default do arquivo ShoppingCartData.ts&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Etapa 4: Como MODIFICAR e CONSUMIR os estados
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Consumir:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"use client"
import { ShoppingCartDataStates } from '@/@core/ShoppingCartData/ShoppingCartData'
import { useAppSelector } from '@/redux.config/hook'

const id = useAppSelector(ShoppingCartDataStates).ID
const shoppingCartItems = useAppSelector(ShoppingCartDataStates).shoppingCartItems
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Modificar:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"use client"
import { setID, setShoppingCartItems } from '@/@core/ShoppingCartData/ShoppingCartData'
import { useAppDispatch } from '@/redux.config/hook'

const dispatch = useAppDispatch();
const modificarID = ()=&amp;gt; dispatch(setID("999"))
const modificarShoppingCartItems = () =&amp;gt; dispatch(setShoppingCartItems({
    carne: "2kg",
    arroz: "1kg"
}))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>redux</category>
      <category>react</category>
      <category>nextjs</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
