How to Use Vuex Store

Introduction Vuex is a state management pattern and library specifically designed for Vue.js applications. It serves as a centralized store for all the components in an application, enabling developers to manage shared state in a predictable and efficient way. Using Vuex is essential in complex Vue applications where multiple components need to share and update state, ensuring data consistency and

Nov 17, 2025 - 11:18
Nov 17, 2025 - 11:18
 0

Introduction

Vuex is a state management pattern and library specifically designed for Vue.js applications. It serves as a centralized store for all the components in an application, enabling developers to manage shared state in a predictable and efficient way. Using Vuex is essential in complex Vue applications where multiple components need to share and update state, ensuring data consistency and easier debugging.

This tutorial will walk you through how to effectively use the Vuex store, from basic setup to advanced usage, incorporating best practices and real-world examples. Whether you are a beginner or an experienced Vue developer, understanding Vuex will significantly enhance your ability to manage state in your projects.

Step-by-Step Guide

1. Installing Vuex

Before using Vuex, you need to install it. If you are using Vue CLI, Vuex is often included by default. Otherwise, you can install it via npm or yarn:

npm install vuex --save

or

yarn add vuex

2. Setting Up the Vuex Store

Create a store.js file in your project directory. This file will define and export the Vuex store instance.

import Vue from 'vue';

import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({

state: {

count: 0

},

mutations: {

increment(state) {

state.count++;

}

},

actions: {

increment({ commit }) {

commit('increment');

}

},

getters: {

getCount: state => state.count

}

});

3. Integrating Vuex Store with Vue Instance

In your main application file (e.g., main.js), import and add the store to your Vue instance:

import Vue from 'vue';

import App from './App.vue';

import store from './store';

new Vue({

store,

render: h => h(App) }).$mount('

app');

4. Accessing State in Components

Within your Vue components, you can access the Vuex state using this.$store.state or map state helpers.

<template>

<div>Count: {{ count }}</div>

</template>

<script>

import { mapState } from 'vuex';

export default {

computed: {

...mapState(['count'])

}

};

</script>

5. Committing Mutations

Mutations are the only way to directly change Vuex state. Use this.$store.commit('mutationName') inside your methods:

<template>

<button @click="increment">Increment</button>

</template>

<script>

export default {

methods: {

increment() {

this.$store.commit('increment');

}

}

};

</script>

6. Dispatching Actions

Actions are used to commit mutations asynchronously or to handle complex logic:

<script>

export default {

methods: {

increment() {

this.$store.dispatch('increment');

}

}

};

</script>

7. Using Getters

Getters allow you to compute derived state based on store state:

<template>

<div>Current Count: {{ count }}</div>

</template>

<script>

import { mapGetters } from 'vuex';

export default {

computed: {

...mapGetters(['getCount'])

}

};

</script>

8. Modules for Large Applications

For scalability, Vuex supports modules to split the store into smaller pieces:

const moduleA = {

state: () => ({ value: 10 }),

mutations: { increment(state) { state.value++ } },

actions: { increment({ commit }) { commit('increment') } },

getters: { value: state => state.value }

}

export default new Vuex.Store({

modules: {

a: moduleA

}

});

Best Practices

1. Keep State Minimal and Focused

Store only the essential shared state in Vuex. Avoid duplicating local component state or unnecessary data to keep the store lightweight and maintainable.

2. Use Mutations for State Changes Only

Mutations should be synchronous and only responsible for changing the state. Keep complex logic inside actions or components.

3. Organize Store with Modules

Divide the store into modules based on features or domains of your application. This improves readability and maintainability, especially in large projects.

4. Use Map Helpers

Use mapState, mapGetters, mapActions, and mapMutations to keep your components clean and concise.

5. Avoid Direct State Modification Outside Mutations

Never modify state directly outside mutations to prevent unpredictable bugs and ensure Vuex’s reactivity system works correctly.

6. Use Namespaced Modules

Enable namespacing in modules to avoid naming collisions and clarify the origin of actions, getters, and mutations.

Tools and Resources

1. Vue Devtools

Vue Devtools is an essential browser extension that allows you to inspect and debug Vuex state, mutations, and actions in real time, greatly enhancing the development experience.

2. Vuex Documentation

The official Vuex documentation (https://vuex.vuejs.org) is comprehensive and regularly updated, providing in-depth explanations and examples.

3. Vue CLI

Vue CLI scaffolds projects with Vuex integration options, enabling you to start developing with Vuex easily.

4. ESLint Plugin for Vuex

Using ESLint plugins can enforce best practices and consistent coding style when working with Vuex.

5. Vuex ORM

Vuex ORM is a plugin that enables managing complex data models in Vuex, particularly useful for applications with relational data.

Real Examples

Example 1: Simple Counter Application

This example demonstrates a basic counter using Vuex to manage the count state.

// store.js

export default new Vuex.Store({

state: { count: 0 },

mutations: { increment(state) { state.count++ } },

actions: { increment({ commit }) { commit('increment') } },

getters: { count: state => state.count }

});

// Counter.vue

<template>

<div>

<p>Count: {{ count }}</p>

<button @click="increment">Increment</button>

</div>

</template>

<script>

import { mapGetters, mapActions } from 'vuex';

export default {

computed: {

...mapGetters(['count'])

},

methods: {

...mapActions(['increment'])

}

};

</script>

Example 2: Todo List with Modules

This example shows how to manage a todo list with a Vuex module:

// store/modules/todos.js

const state = () => ({

todos: []

});

const mutations = {

addTodo(state, todo) {

state.todos.push(todo);

},

removeTodo(state, index) {

state.todos.splice(index, 1);

}

};

const actions = {

addTodo({ commit }, todo) {

commit('addTodo', todo);

},

removeTodo({ commit }, index) {

commit('removeTodo', index);

}

};

const getters = {

allTodos: state => state.todos

};

export default {

namespaced: true,

state,

mutations,

actions,

getters

};

// store/index.js

import Vue from 'vue';

import Vuex from 'vuex';

import todos from './modules/todos';

Vue.use(Vuex);

export default new Vuex.Store({

modules: {

todos

}

});

// TodoList.vue

<template>

<div>

<input v-model="newTodo" @keyup.enter="addNewTodo" placeholder="Add todo" />

<ul>

<li v-for="(todo, index) in todoList" :key="index">

{{ todo }}

<button @click="removeTodo(index)">Remove</button>

</li>

</ul>

</div>

</template>

<script>

import { mapGetters, mapActions } from 'vuex';

export default {

data() {

return {

newTodo: ''

};

},

computed: {

...mapGetters('todos', ['allTodos']),

todoList() {

return this.allTodos;

}

},

methods: {

...mapActions('todos', ['addTodo', 'removeTodo']),

addNewTodo() {

if(this.newTodo.trim()) {

this.addTodo(this.newTodo.trim());

this.newTodo = '';

}

}

}

};

</script>

FAQs

What is Vuex and why use it?

Vuex is a centralized state management library for Vue.js applications. It helps manage shared state between components predictably and efficiently, which is especially useful in medium to large-scale applications.

Can I use Vuex with Vue 3?

Yes, Vuex is compatible with Vue 3. The latest Vuex version supports Vue 3's composition API and other improvements.

How does Vuex differ from local component state?

Local component state is confined to the component itself, while Vuex manages global shared state accessible by multiple components, enabling consistent data flow and easier debugging.

Are there alternatives to Vuex?

Yes, alternatives include Pinia, the new recommended state management solution for Vue 3, and other libraries like MobX or Redux (though Redux is more common in React applications).

How do I debug Vuex state changes?

Use Vue Devtools, which allows you to inspect state, view mutation history, and time travel debug your Vuex store in real time.

Conclusion

Mastering Vuex is crucial for developing scalable and maintainable Vue.js applications. By centralizing your application's state, Vuex simplifies data sharing, debugging, and state management across components. This tutorial covered the fundamentals of setting up Vuex, best practices to follow, essential tools, and practical examples to help you get started.

With a solid understanding of Vuex, you can confidently build complex applications with predictable and efficient state management, improving both developer productivity and application quality.