Actualizar el estado de forma segura y trazable en Vuex es sencillo cuando entiendes las mutations, el commit y la reactividad. Aquí verás cómo registrar cambios, depurar con confianza y reducir código con mapMutations, sin romper el flujo de datos.
¿Qué son las mutations y por qué importan para el estado global?
Las mutations son la única vía para cambiar el estado en Vuex. No se actualiza el estado directamente: se registra cada cambio para facilitar el debug y saber qué componente disparó la actualización.
Funcionan similar a eventos: el store define el handler y el componente hace commit para notificar el cambio.
Soportan múltiples componentes cambiando el estado simultáneamente sin perder trazabilidad.
Integran con Vue DevTools: se ve una línea de tiempo de commits y valores en cada momento.
Son reactivas: cuando cambia el estado, todos los componentes que lo usan se renderizan automáticamente.
Idea clave: el estado es una “variable global reactiva”; al modificarse, la vista se refresca sola en cada componente que depende de él.
¿Cómo usar commit desde el componente para actualizar el estado?
El patrón es directo: defines las mutations en el store y las invocas con this.$store.commit(...) desde el componente. Así mantienes el flujo claro: componente → estado → vista actualizada.
commit('increment') o commit('decrement') registran el cambio y actualizan el estado.
La vista se refresca en automático gracias a la reactividad.
En DevTools ves cada commit listado y puedes inspeccionar los valores a lo largo del tiempo.
¿Cómo fluye la reactividad y el render?
El componente hace commit hacia el estado.
El estado actualiza count y propaga el cambio.
El componente se vuelve a renderizar con el valor actualizado.
¿Cómo pasar payload y reutilizar con mapMutations?
Puedes extender una mutation con un payload para configurar el cambio y, además, evitar duplicación de código con mapMutations.
¿Cómo agregar payload y valores por defecto?
Puedes recibir un objeto payload y definir un valor default de ES2015 para no romper si no se pasa nada.
// store.js (increment con payload y default)exportdefaultnewVuex.Store({state:{count:0},mutations:{increment(state, payload ={}){ state.count+= payload.number||1;// usa 1 si no viene number},decrement(state){ state.count--;}}});
payload = {} evita errores cuando no se envía información extra.
payload.number || 1 permite incrementar por un número custom o por 1.
¿Cómo crear acciones personalizadas como increment diez?
Está super útil este concepto. Buenisimo y tiene muchas aplicaciones.
seee
Mutaciones, La única forma de cambiar realmente el estado en una tienda Vuex es cometiendo una mutación. Las mutaciones de Vuex son muy similares a los eventos: cada mutación tiene un tipo de cadena y un controlador. La función de controlador es donde realizamos modificaciones de estado reales, y recibirá el estado como primer argumento
Prácticamente el commit es una manera de mandar a llamar a una función definida en el store, y las mutaciones son como los métodos, y al ser reactivas pueden propagarse los cambios cada que estas cambien
++GENIAL++
++Demasiado++
Por fin logro entender Mutations, excelente Profesor.
Muy buena explicación, muchas gracias, una pregunta, ¿como se hace esa linea que funciona como loader al cambiar las vistas? así como la que tienes en tu página web, la encontré a través de tu twitter, gracias de antemano.
Hola, muchas gracias!
Lo que ves en mi sitio personal es la barra de carga que trae el framework Nuxt.js. Cuando utilizas ese framework eso se configura por defecto y lo tienes integrado en tu sitio. Vas a poder verlo en proximos videos.
Para lograr algo similar sin usar Nuxt podes ver un poco esta libereria de JavaScript que se llama Pace. Espero que te sirva!
Muchísimas gracias
Hola, Tengo un inconveniente realizando mutation con un array de objetos, cuando realizo push al array el state se actualiza en el componente que ejecuto la acción y disparo el commit pero en el componente que lista la información de este array no se actualiza.
Muestra el código, para ver donde esta el problema.
Gracias ! Explicas super claro todo, vengo de react y justo ahora estoy trabajando en un proyecto con Vue y queria implementar flux, redux o algo parecido
Esto es genial.
seee
Tengo una duda, si quisiera enviar los payload con mapMutation, cómo lo haría ?
En la documentacion oficila de vuex al final explican como utilizar el mapMutation con payloads.
import{ mapMutations }from'vuex'exportdefault{// ...methods:{...mapMutations(['increment',// map `this.increment()` to `this.$store.commit('increment')`// `mapMutations` also supports payloads:'incrementBy'// map `this.incrementBy(amount)` to `this.$store.commit('incrementBy', amount)`]),...mapMutations({add:'increment'// map `this.add()` to `this.$store.commit('increment')`})}}
Así mismo si tu aplicación es de mediana a gran escala no te recomiendo usar los maps
Ya que en un futuro cuando tengas muchos componentes y muchas mutaciones, al intentar mapear los que ocupes podrías tener un código poco legible.
Si sabes ingles aquí te dejo un articulo el cual es el primero de una serie muy buena para usar vue y vuex a gran escala
Genial!
Explicación puntal del { } para importar cosas específicas del módulo, y de los MapMutation y MapSatate.
Este curso y el de Laravel 2017 son de los mejores
Saludos. De casualidad el código de este ejemplo está en un repositorio?
in Aplication
<template><div class="hello"><h1>{{ msg }}</h1><p>{{ count }}</p><input type="number" placeholder="Escoge el número" v-model="chooseYourNumber"><br><br><button @click="decrementNum(1000)">-1000</button><button @click="decrementNum(100)">-100</button><button @click="decrementNum(10)">-10</button><button @click="minus">-1</button><button @click="init()">Choose</button><button @click="increment">+1</button><button @click="incrementNum(10)">+10</button><button @click="incrementNum(100)">+100</button><button @click="incrementNum(1000)">+1000</button></div></template><script>import{ mapState, mapMutations }from"vuex";exportdefault{name:"HelloWorld",props:{msg:String},data(){return{chooseYourNumber:''}},computed:{...mapState(['count'])},methods:{...mapMutations(['increment','minus']),incrementNum(num){this.$store.commit('incrementPLUS',{number: num
});},decrementNum(num){this.$store.commit('minusPLUS',{number: num
});},init(){this.$store.commit('init',parseFloat(this.chooseYourNumber));}}};</script>
Store
importVuexfrom"vuex";importVuefrom'vue';Vue.use(Vuex);//https://www.instagram.com/p/B-pmB-5BTRX/const vueX =newVuex.Store({state:{count:0},mutations:{increment(state){ state.count++;},minus(state){ state.count--;},incrementPLUS(state, ten ={}){ state.count+= ten.number||1},minusPLUS(state, asa ={}){ state.count-= asa.number||1},init(state, num){ state.count= num
}}});exportdefault vueX;
Había escuchado o tenía entendido que las mutaciones eran como buenas prácticas en vez de modificar directamente el state pero ahora veo que el commit es lo que lo hace tan importante.
Me parece super útil los map que trae Vuex! 💚
Esto en la version 3 de vue modifica?
Si quieren revisar el codigo de esta clase y de las siguientes pueden hacerlo en este codesandbox
Solo a mí me pasa o este vídeo se toma la vida en cargar?
Me quedó todo claro, a excepción de esto:
Supongamos que cargo mis mutations con …mapMutations, tengo un metedo set que recibe el state y el payload, pero en mi componente …mapMutation(['nameMutation]) cómo paso el payload a esa mutación?
@GOLLUM23 creo que se refiere a usar el propio mapMutation, de manera que se usa solo lo que se importa en la cabecera, si es parte del array y declarado como string, cómo envías los payload ? O sea, sin crear un metodo a parte