DEV Community

Cover image for Vuex 101 Snippet
yonas
yonas

Posted on

Vuex 101 Snippet

Vuex 101

Vuex is a state management library for Vue.js.
It has five main concepts:

  1. State - App level state container
  2. Getter - Used to access state data in the component
  3. Action - perform computations on state and fetch data from remote API
  4. Mutation - Commonly called by Action to change State's data
  5. Module - containerized for of the above 4. For example: Todos Module, Auth Module...

Code Snippets

  • create a folder named store inside src.

File /src/main.js

import Vue from 'vue';
import App from './App.vue';
import store from './store';

new Vue({
    store,
    render: h => h(App)
}).$mount('#app');

File /src/store/index.js

import Vuex from 'vuex';
import Vue from 'vue';
import todos from './module/todos';

// Load Vuex
Vue.use(Vuex);

// Create store

export default new Vuex({
    modules: {
        todos
    }
});

File /src/store/modules/todos.js

import axios from 'axios'; 
// we use axios to fetch data from remote API

const state = {
    todos: []
};

const getters = {
    allTodos: (state) => state.todos;
};

const actions = {
    async fetchTodos({commit}) {
        const reponse = await axios.get('jsonplaceholder.typicode.com/todos');

        commit('setTodos', reponse.data);
    }
};

const mutations = {
    setTodos: (state, todos) => (state.todos = todos);
};


export default {
    state,
    getters,
    actions,
    muations
};

File /src/components/todos.vue

<template>
    <div>
        <h3> Todos </h3>
        <div class="todos">
            <div v-for="todo in allTodos" :key="todo.id">
                {{ todo.title  }}
            </div>
        </div>
    </div>
</template>

<script>
import { mapGetters, mapActions } from 'vuex';

export default {
    name: 'Todos',
    methods: {
        ...mapActions(['fetchTodos'])
    },
    computed: {
        ...mapGetters(['allTodos'])
    },
    created() {
        this.fetchTodos()
    }
}
</script>

<style>
</style>

Top comments (0)