DEV Community

Cover image for Mastering Vue 3: A Comprehensive Guide to Building Modern Web Applications <Part 11 />
Hany Taha
Hany Taha

Posted on • Updated on

Mastering Vue 3: A Comprehensive Guide to Building Modern Web Applications <Part 11 />


  1. Mastering Vue 3 - Part 1 [Introduction and key features]

2. Mastering Vue 3 - Part 2 [Benefits of using Vue 3 for web development]

3. Mastering Vue 3 - Part 3 [Template syntax in Vue 3]

4. Mastering Vue 3 - Part 4 [Reactivity Fundamentals]

5. Mastering Vue 3 - Part 5 [Class and Style Bindings]

6. Mastering Vue 3 - Part 6 [Lifecycle Hooks]

7. Mastering Vue 3 - Part 7 [Understanding components]

8. Mastering Vue 3 - Part 8 [Installing Vue project and file structure]

9. Mastering Vue 3 - Part 9 [Vue Router in Vue 3]

10. Mastering Vue 3 - Part 10 [Animation in Vue 3]

11. Mastering Vue 3 - Part 11 [State Management with Pinia]

12. Mastering Vue 3 - Part 12 [Teleport in Vue 3]

13. Mastering Vue 3 - Part 13 [Working with API Calls ]

14. Mastering Vue 3 - Part 14 [Forms and Form Validation ]

State Management with Pinia

State management plays a crucial role in Vue 3 applications, especially when dealing with complex and shared data across multiple components. It helps in maintaining a single source of truth for the application's data, making it easier to manage and update.

One popular state management solution for Vue 3 is Pinia. Pinia is a modern and lightweight state management library specifically built for Vue 3 applications. It provides a centralized store pattern, similar to Vuex in Vue 2, but with enhanced TypeScript support and improved performance.

Using Pinia for Centralized State Management:
To use Pinia for centralized state management in your Vue 3 application, follow these steps:

1- Install Pinia: Start by installing Pinia via npm or yarn:

npm install pinia
Enter fullscreen mode Exit fullscreen mode

2- Create a Store: Create a new store file, for example store.js, and import Pinia:

import { createPinia } from 'pinia';

export const pinia = createPinia();
Enter fullscreen mode Exit fullscreen mode

3- Register the Store: In your main application file, import the Pinia instance and register the store:

import { createApp } from 'vue';
import { pinia } from './store.js';
import App from './App.vue';

const app = createApp(App);
Enter fullscreen mode Exit fullscreen mode

4- Define State, Actions, and Getters: In your store file, define the state, actions, and getters:

import { defineStore } from 'pinia';

export const useCounterStore = defineStore('counter', {
  state: () => ({
    count: 0

  getters: {
    doubleCount() {
      return this.count * 2;

  actions: {
    increment() {
Enter fullscreen mode Exit fullscreen mode

In this example, we create a store called counter using defineStore(). The store includes a state object with a count property. It also defines a getter called doubleCount, which returns the double of the count value, and an action called increment that increments the count value.

5- Access the Store in Components: To use the store in your components, import it and access the state, actions, or getters:

    <p>Count: {{ counter.count }}</p>
    <p>Double Count: {{ counter.doubleCount }}</p>
    <button @click="counter.increment()">Increment</button>

import { useCounterStore } from './store.js';

export default {
  setup() {
    const counter = useCounterStore();
    return { counter };
Enter fullscreen mode Exit fullscreen mode

In this example, we import the useCounterStore function from the store file and call it in the setup() function. This provides us with access to the counter store instance, which we can use in the template and methods.

Organizing State, Actions, and Getters in Pinia:
In Pinia, you can organize your state, actions, and getters within a store. This helps in maintaining a clear structure and separation of concerns. You can define them using the state, actions, and getters properties in the store definition.

  • State: The state represents the data managed by the store. It can be defined as a function that returns an object containing the initial state values.

  • Actions: Actions are the equivalent of methods in components. They can be defined with the actions property in defineStore() and they are perfect to define business logic.
    Like getters, actions get access to the whole store instance through this with full typing (and autocompletion ✨) support. Unlike getters, actions can be asynchronous, you can await inside of actions any API call or even other actions!. Note the library you use doesn't matter as long as you get a Promise, you could even use the native fetch function (browser only)

  • Getters: Getters provide computed properties based on the state. They can be used to derive values from the state or perform calculations. Getters are defined within the getters property of the store.

By organizing your state, actions, and getters in separate sections, you can maintain a clear structure and easily understand and manage your application's data flow.

Pinia provides a simple and intuitive API for state management in Vue 3 applications. It promotes a centralized store pattern, making it easier to share and manage data across components. With TypeScript support and improved performance, Pinia is a robust choice for state management in Vue 3.

Top comments (0)