Vue: Belajar Vuex Lagi

Belajar Lagi:
Tulisan ini dibuat setelah saya menggunakan vuex dan terlalu “dipaksakan” lalu setelah baca-baca lagi dokumentasi masih ada beberapa fitur dari vuex yang belum saya gunakan untuk memudahkan saya.

Apa itu vuex?

Menurut saya, vuex merupakan sentralisasi “data” atau kumpulan state yang memudahkan kita saat data atau state tersebut digunakan lintas komponen. Di vuex terdapat setidaknya 4 properti, state, getters, mutations, dan actions.

Bagi yang ingin tahu definisi yang benerannya silahkan kunjungi dokumentasi resmi vuex

Di tulisan yang pertama ini saya coba untuk cara paling standar dalam menggunakan vuex.

Untuk memasang vuex cukup menggunakan perintah:

npm i vuex

Dalam folder /src buat lagi folder store dan di dalamnya buat berkas dengan nama index.js, isi dengan script seperti berikut:

import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    
  },
  getters: {
    
  },
  mutations: {
    
  },
  actions: {
    
  },
});

Lalu di main.js kita tambahkan store yang telah disiapkan tadi, sehingga isi dari main.js menjadi

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

Vue.config.productionTip = false;

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

jika enggan konfigurasi manual, saat memasang aplikasi vue dengan vue-cli kita sudah dapat memasang plugin yang diinginkan, misalnya vue-route, vuex, dan sebagainya.

STATE

State dalam vuex merupakan objek yang properti di dalamnya bisa digunakan lintas komponen, misal kita punya state “name” maka di vuex ( saat saya tulis vuex berarti mengacu kepada store/index.js ) state nya kita ubah jadi seperti berikut

state: {
    name: 'John Doe',
  },

Maka di component manapun kita bisa memanggil state tersebut dengan cara:

...template
{{ this.$store.state.name }}

//outputnya
John Doe

Atau jika ingin lebih tertib bisa kita panggil melalui computed

...script
computed: {
   displayName() {
      return this.$store.state.name;
   }
}

...template
{{ displayName }}

//outputnya
John Doe

GETTERS

Getters ini mirip dengan computed properti, daripada memanggil langsung state dengan memanggil melalui getters kita bisa memanipulasi dulu datanya.

Untuk menggunakan getters kita cukup  tambahkan method di getters pada vuex

getters: {
    getName(state) {
      return `Selamat Datang: ${state.name}`;
    },
  },

Parameter state di sana wajib ya agar kita bisa memanggil state yang ada. Cara menggunakan getters di template/komponen hampir mirip dengan sebelumnya

...script
computed: {
   displayName() {
      return this.$store.state.name;
   },
   greetName() {
    return this.$store.getters.getName;
  }
}

...template
{{ greetName }}

//outputnya
Selamat Datang: John Doe

MUTATIONS

Mutation bertanggung jawab untuk mengubah nilai state, kita tidak boleh mengubah langsung nilai state, kalau mau ubah wajib melalu mutations. Caranya hampir mirip dengan getters, tambahkan method pada mutations yang ada.

 mutations: {
    setName(state, payload) {
      state.name = payload;
    },
},

Parameter state di sana untuk kita bisa mengakses state yang ada, sedangkan parameter kedua yaitu payload merupakan data yang dikirimkan ke dalam method setName()

Cara pakai di komponen sebagai berikut:

...script
methods: {
changeName() {
      this.$store.commit('setName', 'John Tor');
    },
},
computed: {
   greetName() {
    return this.$store.getters.getName;
  }
}

...template
{{ greetName }}

//outputnya
Selamat Datang: John Tor

ACTIONS

Actions ini hampir mirip dengan mutation, jika mutation langsung mengubah state, maka action memicu mutation. Jika digambarkan sederhana seperti berikut.

Methods -> mutations -> state berubah

Methods->actions->mutations->state berubah.

Selain itu actions mendukung operasi asynchronous sehingga umumnya actions digunakan untuk komunikasi ke luar, nge-hit API misalnya.

Untuk membuat actions mirip juga yaitu tambahkan method di actions.

actions: {
    async fetchUserList({ commit }) {
      await axios.get('http://jsonplaceholder.typicode.com/users')
        .then((res) => {
          commit('someMutation', res.data);
        })
        .catch((e) => {
          commit('someMutation', e.message);
        });
    },
  },

Saya menambahkan method fetchUserlist dengan argument commit agar kita bisa memicu sebuah mutation. Saya di sana menggunakan axios untuk nge-hit API jsonplaceholder.

Cara pakai di komponen sebagai berikut

...script
methods: {
changeName() {
      this.$store.dispatch('fetchUserList');
    },
},

Untuk contoh lebih detail bisa lihat di sini:

https://gitlab.com/ariesmaulana/learn-vuex-part2