Vue: Catatan Belajar Vuex Namespaced
Pada tulisan sebelumnya yang tentang modular ada satu yang kurang sreg bagi saya, mengenai penamaan getters, mutations, dan actions yagn tidak boleh sama.
Bagi saya ( dan bisa beda bagi yang lain ) misal jika saya sudah memisahkan satu alur katakanlah crud ke dalam satu berkas/module lalu module itu saya beri nama product.js maka mayoritas fungsi mengacu ke nama berkas atau module, misal karena sudah di dalam module product mendingan saya bikin fungsi setTitle() dari pada setTitleProduct(), setidaknya mengurangi jumlah karakter yang diketik.
Agar si modular yang sebelumnya bisa seperti itu, vuex menyediakan fitur lainnya, namanya namespaced.
Konfigurasi
Untuk konfigurasinya sangat mudah, cukup tambahkan properti namespaced dan beri nilai true.
export default {
namespaced: true,
...state, getters, mutations, actions
}
Sudah
Oh iya saya tidak mengubah apapun selain menambahkan “namespaced:true” di dalam product.js
State
Untuk state sama dengan tulisan sebelumnya tidak ada perubahan apapun.
..script
computed: {
moduleTitle() {
return this.$store.state.product.title;
},
globalTitle() {
return this.$store.state.title;
},
},
...template
{{ moduleTitle }}
<hr>
{{ globalTitle }}
// hasil
product title
-------
Global title
Getters
Agak sedikit berbeda ketika module kita dibuat namespace
...script
computed: {
usingDirectGetters() {
return this.$store.getters['product/getTitle'];
},
},
...template
{{ usingDirectGetters }}
// output
Selamat datang di: product title
Sedikit berbeda kan? memanggil getters dengan kurung sikut dengan format ‘namaModule/namaGetters’.
Kalau menggunakan mapGetters, kita bisa kasih argumen pertama sebagai moduleName dan argumen berikutnya objek atau array berisi getters.
...script
computed: {
...mapGetters('product', {
productTitle: 'getTitle',
}),
},
...template
{{ productTitle }}
// output
Selamat datang di: product title
Mutations
Jika langsung tanpa mapMutations
...script
methods: {
changeTitle() {
this.$store.commit('product/setTitle', 'change title product');
},
},
Jika menggunakan mapMutations
methods: {
...mapMutations('product', {
updateTitle: 'setTitle',
}),
changeTitle() {
this.updateTitle('change title product');
},
},
Actions
Tanpa mapActions
methods: {
changeActionTitle() {
this.$store.dispatch('product/changeTitle', 'Change Action Titile');
},
},
Dengan mapActions
methods: {
...mapActions('product', {
changeTitleAction: 'changeTitle',
}),
changeTitle() {
this.changeTitleAction('Change Action Titile');
},
},
Contoh dalam”crud” bisa dilihat di sini https://gitlab.com/ariesmaulana/learn-vuex-part2/tree/part4-namespaced