Gestão Avançada de Estados Globais com Redux e Vuex

Quando desenvolvemos aplicações web complexas, o gerenciamento de dados de forma organizada e a manutenção de estadosCriando Componentes Interativos ReutilizáveisCriando Componentes Interativos ReutilizáveisAprenda como criar e organizar componentes interativos e reutilizáveis com JavaScript, mantendo estados independentes e facilitando a manutenção do código. (informações que precisam ser compartilhadas entre diferentes partes do código) podem se tornar um grande desafio. É exatamente nesse cenário que surgem ferramentas como Redux e Vuex, cujo objetivo é facilitar o fluxo de dados na aplicação, tornando-a mais previsível, organizada e escalável.

Por que Gerenciar Estados Globalmente?🔗

Em projetos menores, é comum gerenciar o estado de forma local, diretamente em componentes ou módulos. Entretanto, conforme as aplicações crescem, a troca de dados entre múltiplos componentesTags e Elementos: Sintaxe e HierarquiaTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. pode ficar confusa. Nessa situação, o risco de inconsistência e manutenção complicada aumenta bastante.

Um gerenciador de estadoCriando Componentes Interativos ReutilizáveisCriando Componentes Interativos ReutilizáveisAprenda como criar e organizar componentes interativos e reutilizáveis com JavaScript, mantendo estados independentes e facilitando a manutenção do código. global, como Redux ou Vuex, busca resolver esses problemas criando uma única fonte de verdade (store) para todas as informações relevantes, além de aplicar padrões bem definidos para ler, atualizar e monitorar os dados.

Introdução ao Redux🔗

O Redux é uma biblioteca popular, conhecida por ser muito utilizada em conjunto com o ReactSingle Page Applications (SPA) com React.jsSingle Page Applications (SPA) com React.jsDescubra como criar SPAs modernas com React.js. Este tutorial aborda criação de componentes, roteamento e gerenciamento de estado para interfaces dinâmicas.. Apesar dessa integração mais frequente, ele funciona perfeitamente em outros ambientes JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente.. Os principais conceitos do Redux são:

1. Store

Armazena todo o estado da aplicação em um objetoFundamentos de Arrays e ObjetosFundamentos de Arrays e ObjetosDomine arrays e objetos em JavaScript com este tutorial narrativo. Aprenda a utilizar métodos e exemplos práticos para aprimorar seu desenvolvimento web. único, conhecido como store.

2. Actions

São objetosFundamentos de Arrays e ObjetosFundamentos de Arrays e ObjetosDomine arrays e objetos em JavaScript com este tutorial narrativo. Aprenda a utilizar métodos e exemplos práticos para aprimorar seu desenvolvimento web. que descrevem “o que aconteceu”. Cada actionIntrodução a Formulários: `<form>`, `action`, `method`Introdução a Formulários: `<form>`, `action`, `method`Explore este tutorial sobre formulários HTML, conhecendo a função dos atributos action e method para envio seguro e organizado dos dados do usuário. possui, pelo menos, um tipo que indica qual é o eventoEventos no JavaScript: onClick, onChange e maisEventos no JavaScript: onClick, onChange e maisDescubra como os eventos em JavaScript, como onClick e onChange, possibilitam interações dinâmicas e melhoram a experiência do usuário em páginas web. (por exemplo, INCREMENT_COUNTER) e, opcionalmente, dados (payload).

3. Reducers

FunçõesFunções e Escopo no JavaScriptFunções e Escopo no JavaScriptAprenda a utilizar funções e escopos em JavaScript com nosso guia prático. Melhore sua organização de código e evolua seus projetos com boas práticas. puras responsáveis por definir como o estado será modificado em resposta às ações. Ex.:

function counterReducer(state = { count: 0 }, action) {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };
    case 'DECREMENT':
      return { count: state.count - 1 };
    default:
      return state;
  }
}

4. Dispatch

Mecanismo para enviar (despachar) as ações para o store. Ao despacharmos uma actionIntrodução a Formulários: `<form>`, `action`, `method`Introdução a Formulários: `<form>`, `action`, `method`Explore este tutorial sobre formulários HTML, conhecendo a função dos atributos action e method para envio seguro e organizado dos dados do usuário., o Redux chamará o(s) reducer(s) responsável(is) e atualizará o estadoCriando Componentes Interativos ReutilizáveisCriando Componentes Interativos ReutilizáveisAprenda como criar e organizar componentes interativos e reutilizáveis com JavaScript, mantendo estados independentes e facilitando a manutenção do código. global.

5. Selectors (opcional, mas comum)

Padrão para obter dados específicos do estadoCriando Componentes Interativos ReutilizáveisCriando Componentes Interativos ReutilizáveisAprenda como criar e organizar componentes interativos e reutilizáveis com JavaScript, mantendo estados independentes e facilitando a manutenção do código. global, ajudando a manter a lógica de leitura centralizada.

Introdução ao Vuex🔗

O Vuex foi criado para o Vue.jsTrabalhando com Vue.js para Front-EndTrabalhando com Vue.js para Front-EndAprenda a desenvolver aplicações dinâmicas com Vue.js, explorando reatividade, componentes e hooks para interfaces intuitivas e organizadas., mas segue princípios similares ao Redux. Ele fornece uma estrutura para gerenciar estadosCriando Componentes Interativos ReutilizáveisCriando Componentes Interativos ReutilizáveisAprenda como criar e organizar componentes interativos e reutilizáveis com JavaScript, mantendo estados independentes e facilitando a manutenção do código. usando:

1. State

Armazena o estadoCriando Componentes Interativos ReutilizáveisCriando Componentes Interativos ReutilizáveisAprenda como criar e organizar componentes interativos e reutilizáveis com JavaScript, mantendo estados independentes e facilitando a manutenção do código. centralizado (única fonte de verdade).

2. Mutations

Responsáveis por alterar o estado de forma síncrona. Em Vuex, não se modifica o estadoCriando Componentes Interativos ReutilizáveisCriando Componentes Interativos ReutilizáveisAprenda como criar e organizar componentes interativos e reutilizáveis com JavaScript, mantendo estados independentes e facilitando a manutenção do código. diretamente – é preciso usar mutations.

3. Actions

Chamam mutations e podem conter operações assíncronas (chamadas a APIsConsumindo APIs com Fetch e AxiosConsumindo APIs com Fetch e AxiosDescubra como integrar APIs com Fetch e Axios em JavaScript. Aprenda a fazer requisições HTTP, tratar erros e usar métodos GET e POST com exemplos práticos., por exemplo).

4. GettersClasses e Herança em ES6+Classes e Herança em ES6+Aprenda a dominar classes e herança em ES6+: escreva códigos JavaScript claros e eficientes com métodos, getters e setters.

São como computed properties para o estado, permitindo filtrar ou formatar dados antes de entregá-los aos componentesTags e Elementos: Sintaxe e HierarquiaTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis..

5. Modules

Permitem organizar o estadoCriando Componentes Interativos ReutilizáveisCriando Componentes Interativos ReutilizáveisAprenda como criar e organizar componentes interativos e reutilizáveis com JavaScript, mantendo estados independentes e facilitando a manutenção do código. em pedaços menores, cada um com seu próprio state, mutations e actions, mas ainda conectados a um store único.

Comparando Redux e Vuex🔗

AspectoReduxVuex
Integração mais comumReactVue.js
EstruturaStore, Actions, ReducersState, Mutations, Actions, Getters
Atualização de estadoFeita via dispatch de ações que acionam reducersFeita via actions que acionam mutations
Código boilerplateGeralmente maior (por ser mais genérico)Menor (muito integrado ao Vue.js)
OrganizaçãoPadrões de fluxo unidirecionalFluxo unidirecional e orientado a módulos

Ambas as soluções seguem a arquitetura de fluxo unidirecional, mas a forma de fazer as atualizações muda de acordo com cada biblioteca. O Redux tende a ser mais genérico e pode ser utilizado em diversos contextos do JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente.. O Vuex é mais focado no ecossistema VueTrabalhando com Vue.js para Front-EndTrabalhando com Vue.js para Front-EndAprenda a desenvolver aplicações dinâmicas com Vue.js, explorando reatividade, componentes e hooks para interfaces intuitivas e organizadas., oferecendo recursos que aproveitam os recursos reativos nativos do framework.

Exemplo Básico com Redux🔗

Suponha que queremos gerenciar um contador global simples. Primeiro, definimos nossa actionIntrodução a Formulários: `<form>`, `action`, `method`Introdução a Formulários: `<form>`, `action`, `method`Explore este tutorial sobre formulários HTML, conhecendo a função dos atributos action e method para envio seguro e organizado dos dados do usuário.:

// actions.js
export const increment = () => {
  return {
    type: 'INCREMENT'
  };
};

Depois, criamos o reducer:

// reducers.js
const initialState = { count: 0 };
export function counterReducer(state = initialState, action) {
  switch (action.type) {
    case 'INCREMENT':
      return {
        ...state,
        count: state.count + 1
      };
    default:
      return state;
  }
}

Em seguida, configuramos a store:

// store.js
import { createStore } from 'redux';
import { counterReducer } from './reducers';
const store = createStore(counterReducer);
export default store;

Por fim, despachamos a ação do contador por meio de:

store.dispatch(increment());
console.log(store.getState()); // { count: 1 }

Com isso, o estadoCriando Componentes Interativos ReutilizáveisCriando Componentes Interativos ReutilizáveisAprenda como criar e organizar componentes interativos e reutilizáveis com JavaScript, mantendo estados independentes e facilitando a manutenção do código. global do contador é atualizado e pode ser acessado por qualquer parte de nossa aplicação.

Exemplo Básico com Vuex🔗

Em um projeto VueTrabalhando com Vue.js para Front-EndTrabalhando com Vue.js para Front-EndAprenda a desenvolver aplicações dinâmicas com Vue.js, explorando reatividade, componentes e hooks para interfaces intuitivas e organizadas., instalamos o Vuex e configuramos num arquivo store.js:

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    // Síncrono
    increment(state) {
      state.count++;
    }
  },
  actions: {
    // Assíncrono ou combina múltiplas mutations
    incrementAsync({ commit }) {
      setTimeout(() => {
        commit('increment');
      }, 1000);
    }
  },
  getters: {
    currentCount: state => state.count
  }
});

Nos componentesTags e Elementos: Sintaxe e HierarquiaTags e Elementos: Sintaxe e HierarquiaDescubra os fundamentos do HTML: aprenda sobre tags, elementos, hierarquia e boas práticas para criar páginas bem estruturadas e acessíveis. Vue, podemos ler o estado e despachar ações usando:

<template>
  <div>
    <p>Contador: {{ currentCount }}</p>
    <button @click="incrementAsync">Incrementar</button>
  </div>
</template>
<script>
import { mapActions, mapGetters } from 'vuex';
export default {
  computed: {
    ...mapGetters(['currentCount'])
  },
  methods: {
    ...mapActions(['incrementAsync'])
  }
};
</script>

Dessa forma, o valor do contador é sincronizado com a store global, facilitando a manutenção e a expansão da aplicação.

Conclusão🔗

Redux e Vuex resolvem o mesmo problema em cenários de aplicações JavaScriptIntrodução ao JavaScript e Configuração do AmbienteIntrodução ao JavaScript e Configuração do AmbienteDescubra neste tutorial narrativo como configurar seu ambiente de desenvolvimento e começar a programar em JavaScript de maneira prática e eficiente.: fornecer uma forma coerente de gerenciar estadosCriando Componentes Interativos ReutilizáveisCriando Componentes Interativos ReutilizáveisAprenda como criar e organizar componentes interativos e reutilizáveis com JavaScript, mantendo estados independentes e facilitando a manutenção do código. e dados em grande escalaTransformações: translate(), rotate(), scale(), skew()Transformações: translate(), rotate(), scale(), skew()Aprenda a aplicar transformações em CSS como translate, rotate, scale e skew para criar layouts dinâmicos e visuais impactantes sem alterar o fluxo da página.. Ambos impõem um fluxo ordenado de atualizações e leitura do estado, prevenindo espalhar lógica não estruturada por toda a aplicação.

O mais importante!important e Boas Práticas!important e Boas PráticasDescubra como o !important afeta a cascata do CSS e aprenda boas práticas para evitar conflitos, facilitando a manutenção e depuração do código. é que o uso de um gerenciador de estado diminui a complexidade de projetos maiores e padroniza o modo como dados são acessados e modificados, tornando mais simples a expansão, o teste e a manutenção do seu código.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

  • Documentação oficial do MDN sobre JavaScript, útil para fundamentar os conceitos de programação aplicados no tutorial: developer.mozilla.org/pt-BR/docs/Web/JavaScript
  • Documentação oficial do React, importante para compreender o contexto em que o Redux é frequentemente utilizado: react.dev

Compartilhar artigo