Tutorial Vuex #1: Manajemen State

Tutorial Vuex #1: Manajemen State

Pendahuluan

Vuex adalah library Vue.js yang dapat digunakan untuk meng-handle state (state manajemen), dimana data yang ada dapat didefinisikan dan dipusatkan pada sebuah file sehingga bisa digunakan oleh semua component yang ada.

Dengan menggunakan Vuex, komunikasi antar component menjadi lebih mudah. Sebagaimana yang kita ketahui bahwasanya dalam interaksi antar component agar dapat saling bertukar data adalah dengan menggunakan props, maka dengan Vuex kamu cukup mengakses state yang telah didefinisikan pada Vuex Store.

manajemen state vuex

Baca Juga: Membuat Fitur Bulk Import Data CSV Laravel 5.6

Persiapan & Install Vuex

Artikel ini merupakan bagian pertama, maka kita memulainya dengan project yang masih fresh install. Install Vue.js dengan menggunakan vue cli:

vue create tutorial-vuex

Tunggu hingga proses instalasi selesai

cara install vuejs

Kemudian install library dari Vuex dengan command:

npm install vuex --save

Note: Pastikan kamu telah berada di dalam root directory project kamu (baca: dalam hal ini folder tutorial-vuex)

Buka file pubic/index.html, kemudian tambahkan code didalam tag <head> untuk me-load bootstrap:

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">

Buka file src/App.vue, kemudian modifikasi menjadi

<template>
	<div id="app" class="container">
		<div class="row py-4">
			<agenda-input />
			<agenda-show />
		</div>
	</div>
</template>

<script>
	import AgendaInput from './components/AgendaInput.vue'
	import AgendaShow from './components/AgendaShow.vue'

	export default {
		name: 'app',
		components: {
			AgendaInput,
			AgendaShow
		}
	}
</script>

Note: Terdapat dua component yang di-import, yakni: AgendaInput dan AgendaShow yang akan kita definisikan selanjutnya.

Buat file AgendaInput.vue di dalam folder src/components dan tambahkan code berikut:

<template>
    <div class="col-md-6">
        <div class="card">
            <div class="card-header">
                <h3 class="card-title">List Agenda</h3>
            </div>
            <div class="card-body">
                <ul>
                    <li></li>
                </ul>
            </div>
        </div>
    </div>
</template>
<script>
    export default {
        name: 'AgendaInput'
    }
</script>

Note: Component ini untuk meng-handle inputan yang dilakukan oleh users. Namun untuk saat ini kita gunakan untuk menampilkan list agenda untuk melihatan bagaimana state bisa digunakan lintas component.

Terakhir, buat file AgendaShow.vue di dalam folder yang sama, kemudian masukkan potongan code:

<template>
    <div class="col-md-6">
        <div class="card">
            <div class="card-header">
                <h3 class="card-title">Daftar Agenda</h3>
            </div>
            <div class="card-body">
                <div class="table-responsive">
                    <table class="table table-hover table-bordered">
                        <thead>
                            <tr>
                                <th>#</th>
                                <th>Hari</th>
                                <th>Agenda</th>
                                <th></th>
                            </tr>
                        </thead>
                    </table>
                </div>
            </div>
        </div>
    </div>
</template>
<script>
    export default {
        name: 'AgendaShow'
    }
</script>

Note: Component ini untuk meng-handle list agenda yang telah di-input.

Baca Juga: Membuat Aplikasi POS (Point of Sales) Laravel 5.6 - Chart

Manajemen State Dengan Vuex

Pada sub topik sebelumnya terdapat step untuk menginstall library vuex yang akan digunakan pada sub topik kali ini, buat file store.js di dalam folder src, kemudian masukkan code berikut:

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

Vue.use(Vuex)

export default new Vuex.Store({
    state: {
        listAgenda: [
            { hari: 'senin', kegiatan: 'Belajar Vuejs' },
            { hari: 'selasa', kegiatan: 'Belajar Laravel' },
            { hari: 'rabu', kegiatan: 'Belajar Mysql' }
        ]
    },
    mutations: {

    },
    actions: {

    }
})

Penjelasan: state berfungsi untuk menghimpun data sebagaimana yang dapat dilakukan oleh property data() pada tiap component, hanya saja state dari vuex dapat memusatkan data tersebut sehingga dapat digunakan oleh berbagai component yang ada. mutations digunakan untuk melakukan perubahan state, sedangkan actions hampir serupa dengan property methods() untuk melakukan tindakan sesuai yang diiginkan, termasuk diantaranya melakukan commit mutations.

Masih bingung? Mari kita pahami bersama secara fungsi dan penggunaan dari masing-masing property yang ada didalam Vuex.

Pertama, fokus pada state, terdapat sebuah array dengan nama variable listAgenda, dimana didalamnya terdapat 3 buah object. Lalu bagaimana cara mengakses state ini agar dapat digunakan oleh component terkait?

Buka file src/components/AgendaShow.vue, kemudian modifikasi menjadi:

<template>
    <div class="col-md-6">
        <div class="card">
            <div class="card-header">
                <h3 class="card-title">Daftar Agenda</h3>
            </div>
            <div class="card-body">
                <div class="table-responsive">
                    <table class="table table-hover table-bordered">
                        <thead>
                            <tr>
                                <th>#</th>
                                <th>Hari</th>
                                <th>Agenda</th>
                                <th></th>
                            </tr>
                        </thead>
                        <tbody>
                            <!-- MELAKUKAN LOOPING DARI COMPUTED PROPERTY agenda() -->
                            <tr v-for="(row, index) in agenda" :key="index">
                                <td>{{ index+1 }}</td>
                                <td>{{ row.hari }}</td>
                                <td>{{ row.kegiatan }}</td>
                                <td></td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
</template>
<script>
    export default {
        name: 'AgendaShow',
        computed: {
            //MEMBUAT COMPUTED agenda()
            agenda() {
                //YANG BERISI DATA DARI state listAgenda
                return this.$store.state.listAgenda
            }
        }
    }
</script>

Penjelasan: this.$store cara untuk mengakses store dari vuex, sedangkan setelahnya, dalam hal ini state.listAgenda adalah bagian yang akan diakses dari store.

Jangan lupa untuk meng-import store.js, buka file src/main.js lalu modifikasi menjadi:

import Vue from 'vue'
//IMPORT STORE DARI FILE store.js
import store from './store'
import App from './App.vue'

Vue.config.productionTip = false

new Vue({
  //MENGGUNAKAN VUEX YANG TELAH DIDEFINISIKAN
  store,
  render: h => h(App)
}).$mount('#app')

Untuk melihat bagaimana state bekerja, kita juga akan menampilkan list agenda yang telah ada pada component lainnya, buka file AgendaInput.vue yang terletak di dalam folder src/components, kemudian modifikasi menjadi:

<template>
    <div class="col-md-6">
        <div class="card">
            <div class="card-header">
                <h3 class="card-title">List Agenda</h3>
            </div>
            <div class="card-body">
                <ul>
                    <li v-for="row in listAgenda" :key="row"><strong>{{ row.hari }}</strong>: {{ row.kegiatan }}</li>
                </ul>
            </div>
        </div>
    </div>
</template>
<script>
    export default {
        name: 'AgendaInput',
        computed: {
            listAgenda() {
                return this.$store.state.listAgenda
            }
        }
    }
</script>

Note: Hampir serupa dengan component AgendaShow.vue, hanya saja pada component ini kita tampilkan dalam bentuk lists, untuk dijadikan pembanding saja.

Maka hasil yang akan diperoleh akan terlihat seperti berikut:

access state vuex from component

Menarik bukan? Tanpa mengirimkan props kedalam component terkait, kita dapat menggunakan data yang telah didefinisikan. Akan semakin menarik lagi apabila kita telah menemukan kasus yang sangat kompleks, dimana interaksi antar component untuk saling bertukar data pada setiap event yang terjadi.

Kesimpulan

Programming adalah seni untuk merangkai dan menyelesaikan masalah, maka segala tools ataupun library yang adalah kompeten dapat digunakan dalam rangka untuk memudahkan proses untuk mencapai tujuan yang diinginkan. Vuex membantu kamu mengelola data secara interaktif untuk saling bertukar satu sama lainnya. Artikel ini hanya membahas seputar bagaimana menggunakan state, pada artikel selanjutnya kita akan mengembalikan fungsi dari component AgendaInput.vue untuk menambahkan data dengan materi mutations dan actions.

Untuk dokumentasi code dapat kamu akses di Github.

Category:
Share:

Comments