Vuex is a state management library for Vue.js applications. It helps manage the state of your application in a centralized way, making it easier to handle complex data flow and state changes. Here's a basic guide on how to use Vuex in a Vue.js application along with some additional resource links:
You can install Vuex using npm or yarn:
bash# Using npm
npm install vuex
# Using yarn
yarn add vuex
Create a new file, usually named store.js
, to set up your Vuex store. The store contains the application state, mutations, actions, and getters.
javascript// store.js
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({
state: {
// Your application state goes here
counter: 0,
},
mutations: {
// Mutations are used to modify the state
increment(state) {
state.counter++;
},
decrement(state) {
state.counter--;
},
},
actions: {
// Actions are used to perform asynchronous operations and commit mutations
asyncIncrement({ commit }) {
setTimeout(() => {
commit('increment');
}, 1000);
},
},
getters: {
// Getters are used to compute derived state
doubleCounter: (state) => state.counter * 2,
},
});
export default store;
In your main application file (usually main.js
), import and use the Vuex store:
javascript// main.js
import Vue from 'vue';
import App from './App.vue';
import store from './store';
new Vue({
render: (h) => h(App),
store, // Register the Vuex store
}).$mount('#app');
You can access Vuex features in your Vue components using mapState
, mapMutations
, mapActions
, and mapGetters
helpers or by directly using this.$store
.
Example using mapState
and mapActions
in a component:
javascript// MyComponent.vue
<template>
<div>
<p>Counter: {{ counter }}</p>
<p>Double Counter: {{ doubleCounter }}</p>
<button @click="increment">Increment</button>
<button @click="asyncIncrement">Async Increment</button>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
export default {
computed: {
...mapState(['counter', 'doubleCounter']),
},
methods: {
...mapActions(['increment', 'asyncIncrement']),
},
};
</script>