En aplicacions grans, gestionar l'estat global pot esdevenir complex i difícil de mantenir. Vuex ofereix una solució elegant a aquest problema mitjançant l'ús de mòduls. Els mòduls permeten dividir l'estat de l'aplicació en submòduls més petits i independents, cadascun amb el seu propi estat, mutacions, accions, getters i fins i tot mòduls fills.
Continguts
Què són els mòduls a Vuex?
Els mòduls a Vuex permeten dividir l'estat de l'aplicació en submòduls més petits i independents. Cada mòdul pot tenir el seu propi estat, getters, mutacions i accions, i fins i tot altres mòduls fills.
Beneficis dels mòduls
- Organització: Faciliten l'organització del codi en aplicacions grans.
 - Escalabilitat: Permeten escalar l'aplicació de manera més fàcil i mantenible.
 - Reutilització: Els mòduls poden ser reutilitzats en diferents parts de l'aplicació.
 
Creació d'un mòdul
Per crear un mòdul, simplement definim un objecte amb les propietats state, getters, mutations i actions, i després l'afegim a l'objecte modules en la instància de Vuex.
// store/modules/counter.js
const state = {
  count: 0
};
const getters = {
  doubleCount: state => state.count * 2
};
const mutations = {
  increment: state => state.count++
};
const actions = {
  incrementAsync: ({ commit }) => {
    setTimeout(() => {
      commit('increment');
    }, 1000);
  }
};
export default {
  state,
  getters,
  mutations,
  actions
};// 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
  }
});Nesting de mòduls
Els mòduls poden contenir altres mòduls, permetent una estructura jeràrquica. Això és útil per a aplicacions molt grans on es necessita una organització més detallada.
// store/modules/nestedModule.js
const state = {
  nestedCount: 0
};
const mutations = {
  incrementNested: state => state.nestedCount++
};
export default {
  state,
  mutations
};
// store/modules/parentModule.js
import nestedModule from './nestedModule';
const state = {
  parentCount: 0
};
const mutations = {
  incrementParent: state => state.parentCount++
};
export default {
  state,
  mutations,
  modules: {
    nestedModule
  }
};Accés a l'estat i getters de mòduls
Quan accedim a l'estat o als getters d'un mòdul, utilitzem el nom del mòdul com a prefix.
// Accés a l'estat this.$store.state.counter.count; // Accés als getters this.$store.getters['counter/doubleCount'];
Exemple pràctic
A continuació, es mostra un exemple pràctic d'una aplicació Vue que utilitza mòduls Vuex per gestionar l'estat.
// store/modules/user.js
const state = {
  user: null
};
const getters = {
  isAuthenticated: state => !!state.user
};
const mutations = {
  setUser: (state, user) => state.user = user
};
const actions = {
  login: ({ commit }, user) => {
    // Simulació d'un login
    setTimeout(() => {
      commit('setUser', user);
    }, 1000);
  }
};
export default {
  state,
  getters,
  mutations,
  actions
};// 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
  }
});<!-- App.vue -->
<template>
  <div>
    <p v-if="isAuthenticated">Benvingut, {{ user.name }}</p>
    <button v-else @click="login">Iniciar Sessió</button>
  </div>
</template>
<script>
export default {
  computed: {
    isAuthenticated() {
      return this.$store.getters['user/isAuthenticated'];
    },
    user() {
      return this.$store.state.user.user;
    }
  },
  methods: {
    login() {
      this.$store.dispatch('user/login', { name: 'John Doe' });
    }
  }
};
</script>Exercicis
- 
Crear un mòdul de productes:
- Crea un mòdul 
productsamb l'estatproducts(una llista de productes). - Afegeix una mutació 
setProductsper establir la llista de productes. - Afegeix una acció 
fetchProductsque simuli la recuperació de productes d'una API i cridi a la mutaciósetProducts. 
 - Crea un mòdul 
 - 
Nesting de mòduls:
- Crea un mòdul 
cartamb l'estatitems(una llista d'articles al carret). - Afegeix una mutació 
addItemper afegir un article al carret. - Afegeix el mòdul 
cartcom a submòdul del mòdulproducts. 
 - Crea un mòdul 
 
Solucions
- Mòdul de productes:
 
// store/modules/products.js
const state = {
  products: []
};
const mutations = {
  setProducts: (state, products) => state.products = products
};
const actions = {
  fetchProducts: ({ commit }) => {
    // Simulació d'una crida a una API
    setTimeout(() => {
      const products = [
        { id: 1, name: 'Producte 1' },
        { id: 2, name: 'Producte 2' }
      ];
      commit('setProducts', products);
    }, 1000);
  }
};
export default {
  state,
  mutations,
  actions
};- Nesting de mòduls:
 
// store/modules/cart.js
const state = {
  items: []
};
const mutations = {
  addItem: (state, item) => state.items.push(item)
};
export default {
  state,
  mutations
};
// store/modules/products.js
import cart from './cart';
const state = {
  products: []
};
const mutations = {
  setProducts: (state, products) => state.products = products
};
const actions = {
  fetchProducts: ({ commit }) => {
    // Simulació d'una crida a una API
    setTimeout(() => {
      const products = [
        { id: 1, name: 'Producte 1' },
        { id: 2, name: 'Producte 2' }
      ];
      commit('setProducts', products);
    }, 1000);
  }
};
export default {
  state,
  mutations,
  actions,
  modules: {
    cart
  }
};Conclusió
Els mòduls a Vuex són una eina poderosa per organitzar i gestionar l'estat en aplicacions grans. Permeten dividir l'estat en submòduls més petits i independents, facilitant l'escalabilitat i mantenibilitat del codi. Amb la pràctica, els mòduls esdevenen una part essencial del desenvolupament d'aplicacions Vue.js complexes.
Curs de Vue.js
Mòdul 1: Introducció a Vue.js
- Què és Vue.js?
 - Configuració de l'entorn de desenvolupament
 - Creant la teva primera aplicació Vue
 - Entenent la instància de Vue
 
Mòdul 2: Conceptes bàsics de Vue.js
- Sintaxi de plantilles
 - Enllaç de dades
 - Propietats computades i observadors
 - Enllaços de classes i estils
 - Renderització condicional
 - Renderització de llistes
 
Mòdul 3: Components de Vue.js
- Introducció als components
 - Props i esdeveniments personalitzats
 - Slots
 - Components dinàmics i asíncrons
 - Comunicació entre components
 
Mòdul 4: Vue Router
- Introducció a Vue Router
 - Configuració de Vue Router
 - Rutes dinàmiques
 - Rutes niades
 - Guàrdies de navegació
 
Mòdul 5: Gestió d'estat amb Vuex
- Introducció a Vuex
 - Estat, getters, mutacions i accions
 - Mòduls a Vuex
 - Utilitzant Vuex en components
 - Patrons avançats de Vuex
 
Mòdul 6: Directives de Vue.js
Mòdul 7: Plugins de Vue.js
Mòdul 8: Proves en Vue.js
Mòdul 9: Conceptes avançats de Vue.js
- Funcions de renderització i JSX
 - Renderització del costat del servidor (SSR) amb Nuxt.js
 - API de composició de Vue 3
 - Optimització del rendiment
 
