En aplicaciones grandes, la gestión del estado puede volverse compleja y difícil de manejar. Vuex proporciona una solución a este problema mediante el uso de módulos. Los módulos permiten dividir el estado y la lógica de Vuex en partes más pequeñas y manejables. Cada módulo puede tener su propio estado, mutaciones, acciones, getters e incluso módulos anidados.
- ¿Qué son los Módulos en Vuex?
 
Los módulos en Vuex son una forma de dividir el estado de la aplicación en partes más pequeñas y específicas. Cada módulo puede contener su propio estado, mutaciones, acciones y getters, lo que facilita la organización y el mantenimiento del código.
Ventajas de Usar Módulos:
- Organización: Facilita la organización del código al dividir el estado en partes más pequeñas y manejables.
 - Reutilización: Permite reutilizar módulos en diferentes partes de la aplicación.
 - Escalabilidad: Mejora la escalabilidad de la aplicación al permitir agregar nuevos módulos sin afectar el estado global.
 
- Creación de Módulos en Vuex
 
Estructura Básica de un Módulo
Un módulo en Vuex es simplemente un objeto con las mismas propiedades que el store principal: state, mutations, actions y getters.
// store/modules/counter.js
const state = {
  count: 0
};
const mutations = {
  increment(state) {
    state.count++;
  }
};
const actions = {
  increment({ commit }) {
    commit('increment');
  }
};
const getters = {
  count: state => state.count
};
export default {
  state,
  mutations,
  actions,
  getters
};Registro de Módulos en el Store Principal
Para usar un módulo, debes registrarlo en el store principal.
// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import counter from './modules/counter';
Vue.use(Vuex);
export default new Vuex.Store({
  modules: {
    counter
  }
});
- Acceso al Estado y Getters de Módulos
 
Acceso al Estado
Para acceder al estado de un módulo en un componente, puedes usar this.$store.state.moduleName.property.
Acceso a los Getters
Para acceder a los getters de un módulo, puedes usar this.$store.getters['moduleName/getterName'].
- Mutaciones y Acciones en Módulos
 
Mutaciones
Las mutaciones en un módulo se definen y se llaman de la misma manera que en el store principal.
Acciones
Las acciones en un módulo también se definen y se llaman de la misma manera que en el store principal.
- Módulos Anidados
 
Vuex permite anidar módulos dentro de otros módulos. Esto es útil para aplicaciones muy grandes donde la organización del estado es crucial.
// store/modules/nestedModule.js
const state = {
  nestedCount: 0
};
const mutations = {
  incrementNested(state) {
    state.nestedCount++;
  }
};
const actions = {
  incrementNested({ commit }) {
    commit('incrementNested');
  }
};
const getters = {
  nestedCount: state => state.nestedCount
};
export default {
  state,
  mutations,
  actions,
  getters
};// store/modules/parentModule.js
import nestedModule from './nestedModule';
const state = {
  parentCount: 0
};
const mutations = {
  incrementParent(state) {
    state.parentCount++;
  }
};
const actions = {
  incrementParent({ commit }) {
    commit('incrementParent');
  }
};
const getters = {
  parentCount: state => state.parentCount
};
export default {
  state,
  mutations,
  actions,
  getters,
  modules: {
    nestedModule
  }
};// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import parentModule from './modules/parentModule';
Vue.use(Vuex);
export default new Vuex.Store({
  modules: {
    parentModule
  }
});Ejercicio Práctico
Ejercicio
- 
Crea un módulo llamado
userque gestione el estado de un usuario con las siguientes propiedades:name: Nombre del usuario.email: Correo electrónico del usuario.
 - 
Define las siguientes mutaciones en el módulo
user:setName: Establece el nombre del usuario.setEmail: Establece el correo electrónico del usuario.
 - 
Define las siguientes acciones en el módulo
user:updateName: Actualiza el nombre del usuario.updateEmail: Actualiza el correo electrónico del usuario.
 - 
Define los siguientes getters en el módulo
user:userName: Devuelve el nombre del usuario.userEmail: Devuelve el correo electrónico del usuario.
 - 
Registra el módulo
useren el store principal. 
Solución
// store/modules/user.js
const state = {
  name: '',
  email: ''
};
const mutations = {
  setName(state, name) {
    state.name = name;
  },
  setEmail(state, email) {
    state.email = email;
  }
};
const actions = {
  updateName({ commit }, name) {
    commit('setName', name);
  },
  updateEmail({ commit }, email) {
    commit('setEmail', email);
  }
};
const getters = {
  userName: state => state.name,
  userEmail: state => state.email
};
export default {
  state,
  mutations,
  actions,
  getters
};// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
import user from './modules/user';
Vue.use(Vuex);
export default new Vuex.Store({
  modules: {
    user
  }
});Uso en un Componente
<template>
  <div>
    <p>Nombre: {{ userName }}</p>
    <p>Email: {{ userEmail }}</p>
    <input v-model="newName" placeholder="Nuevo Nombre" />
    <button @click="updateName">Actualizar Nombre</button>
    <input v-model="newEmail" placeholder="Nuevo Email" />
    <button @click="updateEmail">Actualizar Email</button>
  </div>
</template>
<script>
export default {
  data() {
    return {
      newName: '',
      newEmail: ''
    };
  },
  computed: {
    userName() {
      return this.$store.getters['user/userName'];
    },
    userEmail() {
      return this.$store.getters['user/userEmail'];
    }
  },
  methods: {
    updateName() {
      this.$store.dispatch('user/updateName', this.newName);
    },
    updateEmail() {
      this.$store.dispatch('user/updateEmail', this.newEmail);
    }
  }
};
</script>Conclusión
En esta sección, hemos aprendido cómo los módulos en Vuex pueden ayudar a organizar y gestionar el estado de aplicaciones grandes. Hemos visto cómo crear, registrar y utilizar módulos, así como cómo anidar módulos dentro de otros módulos. Con esta base, estarás mejor preparado para manejar aplicaciones Vue.js más complejas y escalables. En el próximo módulo, exploraremos cómo usar Vuex en componentes para gestionar el estado de manera efectiva.
Curso de Vue.js
Módulo 1: Introducción a Vue.js
- ¿Qué es Vue.js?
 - Configuración del Entorno de Desarrollo
 - Creando Tu Primera Aplicación Vue
 - Entendiendo la Instancia de Vue
 
Módulo 2: Conceptos Básicos de Vue.js
- Sintaxis de Plantillas
 - Vinculación de Datos
 - Propiedades Computadas y Observadores
 - Vinculación de Clases y Estilos
 - Renderizado Condicional
 - Renderizado de Listas
 
Módulo 3: Componentes de Vue.js
- Introducción a los Componentes
 - Props y Eventos Personalizados
 - Slots
 - Componentes Dinámicos y Asíncronos
 - Comunicación entre Componentes
 
Módulo 4: Vue Router
- Introducción a Vue Router
 - Configuración de Vue Router
 - Rutas Dinámicas
 - Rutas Anidadas
 - Guardias de Navegación
 
Módulo 5: Gestión de Estado con Vuex
- Introducción a Vuex
 - Estado, Getters, Mutaciones y Acciones
 - Módulos en Vuex
 - Usando Vuex en Componentes
 - Patrones Avanzados de Vuex
 
Módulo 6: Directivas de Vue.js
Módulo 7: Plugins de Vue.js
Módulo 8: Pruebas en Vue.js
- Pruebas Unitarias con Vue Test Utils
 - Pruebas de Extremo a Extremo con Cypress
 - Simulación de Dependencias
 
Módulo 9: Conceptos Avanzados de Vue.js
- Funciones de Renderizado y JSX
 - Renderizado del Lado del Servidor (SSR) con Nuxt.js
 - API de Composición de Vue 3
 - Optimización del Rendimiento
 
Módulo 10: Construcción y Despliegue de Aplicaciones Vue.js
- Construcción para Producción
 - Despliegue de Aplicaciones Vue.js
 - Integración y Despliegue Continuos (CI/CD)
 
