En aquest tema, aprendrem com integrar Vuex en els components de Vue.js per gestionar l'estat de l'aplicació de manera eficient. Vuex és una llibreria de gestió d'estat per a aplicacions Vue.js, que permet centralitzar l'estat en un únic lloc i facilitar la comunicació entre components.
Objectius
- Entendre com accedir a l'estat de Vuex des dels components.
- Aprendre a utilitzar getters, mutacions i accions en components.
- Veure exemples pràctics d'ús de Vuex en components.
Accedint a l'estat de Vuex
Per accedir a l'estat de Vuex des d'un component, utilitzem la propietat this.$store.state
. Vegem un exemple:
// store.js import Vue from 'vue'; import Vuex from 'vuex'; Vue.use(Vuex); export default new Vuex.Store({ state: { count: 0 } });
// main.js import Vue from 'vue'; import App from './App.vue'; import store from './store'; new Vue({ render: h => h(App), store }).$mount('#app');
<!-- App.vue --> <template> <div> <p>Count: {{ count }}</p> </div> </template> <script> export default { computed: { count() { return this.$store.state.count; } } }; </script>
Utilitzant Getters
Els getters són funcions que permeten accedir a l'estat de manera derivada. Són similars a les propietats computades en Vue.js. Vegem com utilitzar-los:
// store.js export default new Vuex.Store({ state: { count: 0 }, getters: { doubleCount: state => state.count * 2 } });
<!-- App.vue --> <template> <div> <p>Double Count: {{ doubleCount }}</p> </div> </template> <script> export default { computed: { doubleCount() { return this.$store.getters.doubleCount; } } }; </script>
Utilitzant Mutacions
Les mutacions són l'única manera de modificar l'estat en Vuex. Són funcions síncrones que reben l'estat com a primer argument. Vegem un exemple:
// store.js export default new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++; } } });
<!-- App.vue --> <template> <div> <p>Count: {{ count }}</p> <button @click="increment">Increment</button> </div> </template> <script> export default { computed: { count() { return this.$store.state.count; } }, methods: { increment() { this.$store.commit('increment'); } } }; </script>
Utilitzant Accions
Les accions són similars a les mutacions, però poden ser asíncrones. S'utilitzen per a operacions que poden trigar temps, com ara sol·licituds HTTP. Vegem un exemple:
// store.js export default new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++; } }, actions: { incrementAsync({ commit }) { setTimeout(() => { commit('increment'); }, 1000); } } });
<!-- App.vue --> <template> <div> <p>Count: {{ count }}</p> <button @click="incrementAsync">Increment Async</button> </div> </template> <script> export default { computed: { count() { return this.$store.state.count; } }, methods: { incrementAsync() { this.$store.dispatch('incrementAsync'); } } }; </script>
Exercicis Pràctics
Exercici 1: Afegir un Decrement
- Afegiu una mutació
decrement
astore.js
que decrements el valor decount
. - Afegiu un botó a
App.vue
que cridi a la mutaciódecrement
quan es faci clic.
Solució
// store.js export default new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++; }, decrement(state) { state.count--; } } });
<!-- App.vue --> <template> <div> <p>Count: {{ count }}</p> <button @click="increment">Increment</button> <button @click="decrement">Decrement</button> </div> </template> <script> export default { computed: { count() { return this.$store.state.count; } }, methods: { increment() { this.$store.commit('increment'); }, decrement() { this.$store.commit('decrement'); } } }; </script>
Exercici 2: Afegir una Acció Asíncrona per Decrementar
- Afegiu una acció
decrementAsync
astore.js
que decrements el valor decount
després d'un segon. - Afegiu un botó a
App.vue
que cridi a l'acciódecrementAsync
quan es faci clic.
Solució
// store.js export default new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++; }, decrement(state) { state.count--; } }, actions: { incrementAsync({ commit }) { setTimeout(() => { commit('increment'); }, 1000); }, decrementAsync({ commit }) { setTimeout(() => { commit('decrement'); }, 1000); } } });
<!-- App.vue --> <template> <div> <p>Count: {{ count }}</p> <button @click="incrementAsync">Increment Async</button> <button @click="decrementAsync">Decrement Async</button> </div> </template> <script> export default { computed: { count() { return this.$store.state.count; } }, methods: { incrementAsync() { this.$store.dispatch('incrementAsync'); }, decrementAsync() { this.$store.dispatch('decrementAsync'); } } }; </script>
Conclusió
En aquesta secció, hem après com utilitzar Vuex en components de Vue.js per gestionar l'estat de l'aplicació. Hem vist com accedir a l'estat, utilitzar getters, mutacions i accions, i hem practicat amb exercicis. Amb aquests coneixements, estem preparats per gestionar l'estat de les nostres aplicacions Vue.js de manera més eficient i organitzada.
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