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ó
decrementastore.jsque decrements el valor decount. - Afegiu un botó a
App.vueque cridi a la mutaciódecrementquan 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ó
decrementAsyncastore.jsque decrements el valor decountdesprés d'un segon. - Afegiu un botó a
App.vueque cridi a l'acciódecrementAsyncquan 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
