Tutorial Vue Js
Tutorial Vue Js
com
https://www.indeveloper.id/
vuejs.org/v2/guide/
Apa itu Vue?
Variabel vm (singkatan dari ViewModel) pada contoh di atas mengacu pada objek Vue, meski
sebenarnya kita tidak harus membuat variabel baru (vm) untuk menyimpan objek dari Vue
kecuali jika memang dibutuhkan.
Sedangkan options bisa kita isi dengan properti-properti yang telah didefiniskan oleh Vue
seperti data, methods, components, dsb.
Properti el
Sebagaimana penjelasan terdahulu bahwa properti el
menunjuk ke tempat dimana hasil kompilasi dari
template dan data akan dimuat.
var vm = new Vue({
el: '#app',
...
})
Properti Data
Property data merupakan salah satu properti pada objek
Vue yang digunakan untuk mendefinisikan variabel-variabel
yang akan digunakan pada aplikasi kita atau dalam konsep
MVVM, data merupakan Model.
var vm = new Vue({
...
data: {
message: 'Hello world!'
}
})
Properti data berbentuk objek yang bertindak sebagai
kontainer dari variabel message. Kita bisa juga
menambahkan variabel lain(misalnya variabel teks) dengan
cara sebagai berikut.
...
data: {
message: 'Hello world!',
teks: 'Semangat Pagi Indonesia'
}
...
Variabel pada properti data bisa kita definisikan dalam
berbagai tipe data seperti string, integer, boolean,
array, dan object. Berikut ini contohnya.
data: {
name: 'Hafid', // string
age: 33, // integer
gender: true, // boolean (Pria)
hobby: ['coding','sleeping'], // array
children: {
1: 'Ammar',
2: 'Faqih',
3: 'Syamil'
} // object
}
properti data yang kita definiskan ini bisa kita
manipulasi isinya pada saat runtime (aplikasi berjalan), disamping itu properti
data ini otomatis memiliki sifat
reactive sehingga perubahan nilai pada variabel data akan memicu render
ulang pada view.
Sifat reactive pada data ini hanya terjadi jika variabel pada properti data telah
kita definisikan saat
objek Vue dibuat, atau dengan kata lain, variabel yang didefinisikan pada saat
runtime tidak akan
memiliki sifat reactive.
Siklus Objek Vue
Objek Vue yang kita definisikan sebenarnya
memiliki siklus hidup atau life cycle mulai dari
ketika objek itu diciptakan, view dirender,
data dimuat, hingga objek itu dihapus.
create
1. beforeCreate yaitu hook sesaat setelah objek Vue dan komponennya diinisialisasi. Properti
data belum dapat diakses atau digunakan pada hook ini.
2. created yaitu hook ketika objek Vue telah selesai diciptakan. Pada hook ini, sifat reactivity
pada properti data juga sudah didefinisikan sehingga kita sudah diizinkan untuk mengakses
dan memanipulasi data. Properti computed yang digunakan untuk memonitor perubahan
data juga sudah berjalan. Jika aplikasi membutuhkan request data dari server maka hook
ini adalah hook yang tepat untuk melakukannya.
Berikut ini contoh kode untuk menggunakan kedua hook ini
yaitu dengan method beforeCreate dan created.
var vm = new Vue({
el: '#app',
data: {
message: 'Hello world!',
},
beforeCreate () {
console.log('before create: '+
'message = ' + this.message)
},
created () {
console.log('created: '+
'message = ' + this.message)
},
});
Pada gambar di atas terlihat bahwa hook created bisa mengakses variabel
message sebaliknya beforeCreate
tidak bisa.
mount
1. beforeMount yaitu hook ketika template dicompile.
2. mounted yaitu hook ketika elemen (properti el) telah
diinisialisasi, data telah dimuat dan view telah dirender
Untuk mencoba kedua hook ini mari kita tambahkan kode
sebagai berikut (hapus kode hook sebelumnya).
beforeMount() {
console.log('before mount: '+
'el = ' + this.$el.textContent)
},
mounted() {
console.log('mounted: '+
'el = ' + this.$el.textContent)
},
Pada kode di atas, kita akan mencoba mengakses DOM dengan
menggunakan fungsi bawaan Javascript
yaitu textContent untuk menampilkan konten teks yang adalah di dalam el
atau dalam hal ini #app.
update
1. beforeUpdate yaitu hook yang terjadi setelah mounted
dan hanya terjadi jika ada perubahan data yang
mengakibatkan render ulang. Tepatnya, hook ini terjadi
sebelum view dirender ulang.
2. updated yaitu hook yang terjadi setelah beforeUpdate
yaitu setelah view dirender ulang.
Untuk mengujinya, mari kita tambahkan kode berikut
(hapus hook sebelumnya)
beforeUpdate() {
console.log('before update: '+
'el = ' + this.$el.textContent)
},
updated() {
console.log('update: '+
'el = ' + this.$el.textContent)
},
Oleh karena hook ini terjadi karena adanya manipulasi atau
perubahan nilai data pada saat runtime, maka kita perlu
sebuah perintah untuk mengubah variabel message. Di
bawah objek Vue kita tambahkan perintah berikut.
Untuk menguji hook ini, sebenarnya kita perlu mengenal terlebih dahulu
komponen. Karena sejak versi 2 ini objek utama Vue "tidak bisa" dihapus,
namun kita masih bisa mensimulasikannya melalui method vm.$destroy().
Berikut ini contoh kodenya.
Argmen dinamis,
diberikan di dalam tanda
kurung siku [...].
Modifier untuk Direktif
Beberapa direktif bisa
• Contoh:
menggunakan modifier. Modifier
adalah fungsi tambahan yang
• <form v-
akan dieksekusi saat
on:submit.prevent="onSubmit"> ...
menggunakan direktif. </form>
Computed Property
Keterangan:
{{jumlah}} didapat dari fungsi
jumlah yang terdapat pada
computed property
this.bil mengacu pada bil1 yang
terdapat pada data. Karena
terdapat pada lingkup var app,
maka digunakan pengacu this.
Methods
skenarionya:
• Nilai jumlah pada awalnya kosong
• Klik button proses
• Nilai jumlah akan berubah sesuai dengan
hasil yang sebenarnya.
Keterangan:
• Maksud dari v-on:click=’diproses’ adalah
ketika ada aksi untuk melakukan klik pada
button proses, secara otomatis vue akan
menjalankan skrip yang ada pada method
diproses().
Watcher
Keterangan:
Pada skrip di atas, kita melakukan monitoring
terhadap variabel isi yang ada pada tag html
<input type=’text’ v-model=’isi’>,
Ketika kita melakukan aksi pada inputan
tersebut, maka properti watcher mulai bekerja
dan secara otomatis menjalankan skrip yang
memonitor variabel isi yang telah kita
daftarkan di properti watcher.
Binding CSS dengan inline style
<div id="app">
<script>
<div :style="{color:'red'}">{{ message }}</div>
let vm = new Vue({
<div :style="styleObject2">{{ message }}</div>
el : '#app',
<div :style="[styleObject,styleObject2]">{{ message }}</div>
data : {
</div>
message:'Hellossss',
styleObject: {
pada div pertama kita hanya mengakses message dari
fontSize: '200px',
javascript dan memberikan style yaitu color: ‘red’ (memberikan
color: 'blue' secara langsung style di dalamnya).
},
styleObject2: { Pada div yang kedua kita akan mengakses message dari
fontSize: '100px', javascript kita serta memberikan style dengan cara mengakses
color: 'green' code style yang telah kita buat di Javascript yang bernama
} styleObject2 .
}
}) Pada div yang ketiga kita akan mencoba untuk mengakses dua
</script> block code style yang telah kita buat dan memasukannya di
dalam Array (hanya untuk mencoba , untuk melihat code style
mana yang nanti nya akan dipakai)
Binding css dengan class
<!DOCTYPE html> <script
<html lang="en"> src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></
script>
<style>
.active{
color : green; <script>
} new Vue({
.notActive{
color : red;
el : '#app',
} data : {
</style> name:'Vincent'
}
<div id="app">
<h1 :class="'notActive'">{{name}}</h1> })
<h1 :class="'active'">{{name}}</h1> </script>
</div>
Form Binding
Text
• <input v-model="message"
placeholder="edit me">
• <p>Message is:
{{ message }}</p>
Multiline text
<span>Multiline message is:</span>
<p style="white-space: pre-
line;">{{ message }}</p>
<br>
<textarea v-model="message"
placeholder="add multiple
lines"></textarea>
Checkbox
Single checkbox, boolean value:
<input type="checkbox"
id="checkbox" v-
model="checked">
<label
for="checkbox">{{ checked }}</la
bel>
Multiple checkboxes, bound to the same Array: new Vue({
<input type="checkbox" id="jack" value="Jack" v-
model="checkedNames">
el: '...',
<label for="jack">Jack</label>
<input type="checkbox" id="john" value="John" v-
data: {
model="checkedNames">
<label for="john">John</label>
checkedNames: []
<input type="checkbox" id="mike" value="Mike" v-
model="checkedNames"> }
<label for="mike">Mike</label>
<br> })
<span>Checked names: {{ checkedNames }}</span>
Radio
<input type="radio" id="one"
value="One" v-model="picked">
<label for="one">One</label>
<br>
<input type="radio" id="two"
value="Two" v-model="picked">
<label for="two">Two</label>
<br>
<span>Picked:
{{ picked }}</span>
Select new Vue({
Single select:
el: '...',
<select v-model="selected"> data: {
<option disabled value="">Please selected: ''
select one</option>
<option>A</option> }
<option>B</option> })
<option>C</option>
</select>
<span>Selected: {{ selected }}</span>
Multiple select (bound to Array):
<select v-model="selected"
multiple>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<br>
<span>Selected:
{{ selected }}</span>
Dynamic options rendered with v-for: new Vue({
el: '...',
<select v-model="selected"> data: {
<option v-for="option in options" v- selected: 'A',
bind:value="option.value"> options: [
{{ option.text }} { text: 'One', value: 'A' },
</option> { text: 'Two', value: 'B' },
</select> { text: 'Three', value: 'C' }
<span>Selected: {{ selected }}</span> ]
}
})
Value Bindings
For radio, checkbox and select options, the v-
But sometimes, we may
model binding values are usually static strings (or want to bind the value to a
booleans for checkboxes):
dynamic property on the Vue
<!-- `picked` is a string "a" when checked -->
<input type="radio" v-model="picked" value="a">
instance. We can use v-bind
to achieve that. In addition,
<!-- `toggle` is either true or false -->
<input type="checkbox" v-model="toggle">
using v-bind allows us to
bind the input value to non-
<!-- `selected` is a string "abc" when the first option
is selected --> string values.
<select v-model="selected">
<option value="abc">ABC</option>
</select>
Checkbox // when checked:
<input vm.toggle === 'yes'
type="checkbox" // when unchecked:
v-model="toggle" vm.toggle === 'no'
true-value="yes"
false-value="no"
>
Radio
<input type="radio" v-
model="pick" v-
bind:value="a">
// when checked:
vm.pick === vm.a
Select Options
<select v-model="selected">
<!-- inline object literal -->
<option v-
bind:value="{ number:
123 }">123</option>
</select>
// when selected:
typeof vm.selected // => 'object'
vm.selected.number // => 123
Modifiers
.lazy
By default, v-model syncs the input
with the data after each input event
(with the exception of IME
composition, as stated above). You
can add the lazy modifier to instead
sync after change events:
<input v-model.number="age"
type="number">
This is often useful, because even
with type="number", the value of
HTML input elements always returns a
string. If the value cannot be parsed
with parseFloat(), then the original
value is returned.
.trim
If you want whitespace from
user input to be trimmed
automatically, you can add
the trim modifier to your v-
model-managed inputs:
<input v-model.trim="msg">
form binding
Baris 3 - 4: Kita buat input dengan v-
<div id="app">
model="pesan_input" sehingga ketika ketikkan value
<!-- Input biasa --> pada field input tersebut, maka akan mengisi pada object
<input v-model="pesan_input" placeholder="edit me"> pesan_input dan akan langsung ditampilkan / diupdate
<p>Single Message: {{ pesan_input }}</p> pada baris ke-4 yang sudah kita binding dengan
<!-- Input menggunakan textarea --> {{ pesan_input }}.
<textarea v-model="pesan_textarea" placeholder="edit Baris 6 - 8: Sama seperti sebelumnya, namun yang ini
me"></textarea> kita menggunakan textarea dan outputnya kita
<p>Multiple Message:</p> tambahkan style "white-space: pre-line" sehingga ketika
memberikan baris baru / enter maka outputnya juga akan
<p style="white-space: pre-
mengikuti memberikan efek baris baru.
line;">{{ pesan_textarea }}</p>
Baris 10 - 11: Sama dengan input yang pertama, cuma
<!-- Menggunakan input modifier "lazy" -->
saja kita tambahkan input modifier berupa "lazy" yang
<input v-model.lazy="msg" > mana value akan ditampilkan pada data binding ketika
<p>Your Lazy msg: {{msg}}</p> kita memfokuskan cursor kita ke area lain setelah
<!-- Menggunakan input modifier "number" --> mengetikkan value-nya. Silahkan dicoba sendiri pada
<input v-model.number="age" type="number"> Demo dibawah ya.
<p>Your Age: {{age}}</p> Baris 13 - 14: Kita gunakan input modifier juga berupa
<!-- Menggunakan input modifier "trim" --> "number" agar user hanya bisa menginputkan data
berupa angka.
<input v-model.trim="pesan">
Baris 16 - 17: Kita gunakan input modifier berupa "trim"
<p>Your Pesan: {{pesan}}</p>
untuk menghilangkan spasi yang berlebih baik dari awal
</div> maupun akhir teks.
Components Basics
// Define a new component called <div id="components-
button-counter
demo">
Vue.component('button-counter', {
data: function () { <button-counter></button-
return { counter>
count: 0 </div>
}
},
template: '<button v-on:click="count+ new Vue({ el: '#components-
+">You clicked me {{ count }} demo' })
times.</button>'
})
contoh lain
<div id="dw" class="container"> Vue.component('dw-paragraf', {
<dw-paragraf></dw-paragraf> template: '<h1>Membuat
component</h1>'
</div> });
new Vue({
el: '#dw',
});
<div id="dw" class="container"> <script
src="https://cdn.jsdelivr.net/npm/vue/dist/vue.j
<dw-paragraf v-bind:dw="{isi: s"></script>
'Belajar vue.js', jam: '10.00'}"></dw- <template id="dw-paragraf">
paragraf> <h1>{{ dw.isi }} pada jam {{ dw.jam }}</h1>
<dw-paragraf v-bind:dw="{isi: </template>
'Belajar Laravel', jam: '12.30'}"></dw- <script type="text/javascript">
paragraf> Vue.component('dw-paragraf', {
<dw-paragraf v-bind:dw="{isi: props: ['dw'],
'Belajar HTML', jam: '18.00'}"></dw- template: '#dw-paragraf'
paragraf> });
</div>
new Vue({
el: '#dw',
});
</script>
konsep component pada Component merupakan sub
class/objek dari Vue yang bisa kita
Vue dan penggunaannya buat untuk berbagai tujuan misalnya
pada aplikasi. memecah kompleksitas kode,
Konsep component pada reusabilitas kode, dan modularitas
kode. Setiap component memiliki
Vue mirip dengan konsep lifecycle
Web Components. yang sama dengan objek Vuenya.
Sebuah aplikasi Vue bisa Untuk membuat sebuah component
baru, cukup dengan kode
dibangun dari beberapa menjalankan method
component yang memiliki Vue.component('nama-component',
strukturnya hirarki { /* options */ })
Vue.component('hello-world', { <div id="app">
data () {
return {
<hello-world></hello-world>
message: 'Hello world!' </div>
}
},
template: '<h1> {{ message }}</h1>'
})
var vm = new Vue({
el: '#app',
})
Penamaan Component
Terdapat dua format penamaan component 2. PascalCase
pada Vue Format PascalCase artinya menggunakan
1. kebab-case huruf capital pada huruf pertama setiap kata
Format kebab-case artinya menggunakan di mana antar kata
huruf lowercase dan antar kata dipisah tidak dipisah.
dengan tanda - (dash).
Vue.component('MyComponentName', { /* ... */ })
Vue.component('my-component-name', {/* ... */})
Ketika kita mendefinisikan component dengan
menggunakan format PascalCase, maka kita bisa
Ketika kita mendefinisikan component dengan
memilih
menggunakan format kebab-case, maka komponen
tersebut untuk mengakses komponen tersebut dengan cara <my-
component-name> atau <MyComponentName>.
dapat diakses menggunakan custom element <my-
component-name> Namun hanya elemen kebab-case yang dianggap valid
oleh DOM.
Component Registration
Terdapat dua cara untuk meregister contoh :
Vue.component('component-a', {
component pada Vue supaya bisa template: `<p>Component A</p>`
})
digunakan yaitu global dan local. Vue.component('component-b', {
template: `<p>Component B</p>`
})
Vue.component('component-c', {
Global Component template: `<p>Component C</p>`
})
Register component secara global akan new Vue({ el: '#app1' })
membuat component tersebut bisa digunakan new Vue({ el: '#app2' })
oleh semua objek utama (root) Vue, cara
<div id="app1">
meregister component secara global <h1>Objek Vue 1</h1>
sebagaimana contoh di atas yaitu <component-a></component-a>
<component-b></component-b>
menggunakan method </div>
<div id="app2">
<h1>Objek Vue 2</h1>
Vue.component('my-component-name', {/* ... */}) <component-a></component-a>
<component-c></component-c>
</div>
new Vue({
Local Component el: '#app',
Register component secara local artinya components: {
component tersebut diregister pada suatu 'component-a': ComponentA,
objek Vue dan hanya bisa digunakan pada 'component-b': ComponentB,
objek tersebut saja. 'component-c': ComponentC
}
Untuk mendefinisikan component local cukup
})
dengan menggunakan object Javascript biasa
contoh :
var ComponentA = { <div id="app">
template: `<p>Component A</p>` <component-a></component-a>
} <component-b></component-b>
var ComponentB = {
<component-c></component-c>
template: `<p>Component B</p>`
</div>
}
var ComponentC = {
template: `<p>Component C</p>`
}
Deklarasi Properti Data
Strukturnya components secara umum
hampir sama dengan objek utama Vue, salah
satu yang membedakan adalah definisi
properti data pada component tidak lagi
sebagai object melainkan sebagai sebuah
fungsi.
data: {
message: 'Hello world'
}
// menjadi
data () {
return {
message: 'Hello world!'
}
}
Reusable Component
<div id="app">
<hello-world></hello-world>
<hello-world></hello-world>
<hello-world></hello-world>
</div>
Component Lanjutan
• Kirim Data ke Component contoh, kita mempunyai component book,
dengan tiga props yaitu title, description dan
Vue mempunyai mekanisme untuk mengirimkan image.
atau mengeset suatu data pada component yaitu
var BookComponent = {
dengan menggunakan properti props. data () {
Untuk mendefinisikan props, pada component return {
caranya cukup dengan menambahkan properti classCard: 'card'
}
props
},
props: [ 'title', 'description', 'image' ],
props: [ 'nama_props1', 'nama_props2' ], template : `
<div :class="classCard">
<h3>{{ title }}</h3>
Kemudian pada template dari component tersebut <img :src="'images/books/'+image" style="width:100%">
<p v-html="description"></p>
kita bisa akses props tersebut layaknya properti
</div>
data `
}
template : `<div> {{ nama_props1 }} </div>` Catatan: template harus memiliki elemen root
tunggal (wrapper), pada contoh di atas, rootnya
adalah elemen <div>
new Vue({
el: '#app',
components: {
'book': BookComponent,
}
})
<div id="app">
<book
title="C++ High Performance"
description="Write code that scales across CPU
registers, multicore, and machine clusters"
image = "c++-high-performance.png"
>
</book>
</div>
Untuk merapikan tampilan, untuk sementara kita
akan buat style CSS sederhana (letakkan pada
elemen style pada head)
.card {
background: #efefef;
border:1px solid #ddd;
margin-right:5px;
padding:5px;
width: 200px;
float:left;
}
h3{
min-height: 45px;
Nilai dari variable title, description, dan image
} dikirimkan atau dilewatkan dari luar component akan
muncul atau dapat diakses dari dalam component
layaknya properti data.
Directive Pada Component
Component pada Vue bisa diibaratkan Nah dengan konsep ini, maka kita bisa
sebagai elemen HTML di mana ada atribut mendefinisikan nilai props title secara lebih dinamis
berupa directive yang bisa diaplikasikan menggunakan properti data.
padanya. Sebagai contoh, kita akan
menampilkan data dalam bentuk list <book :title='judul'></book>
menggunakan elemen berupa component.
Adapun directive yang kita gunakan adalah v- Props title kita bind ke variabel judul (nama
for dan v-bind atau :. variabelnya bisa bebas saja), cukup dengan
menambahkan
directive v-bind atau :.
Pada bagian sebelumnya, pendefinisian nilai
props dari component dilakukan secara
hardcode langsung pada componentnya,
<custom-input v-model="searchText"></custom-input>
Content Distribution with Slots
Pada bagian terdahulu tentang mengirimkan Sehingga untuk mengaksesnya pada template cukup
data ke Component, telah dibahas mengenai dengan <information></information>, Nah kita tidak
cara mengirimkan data ke component dengan bisa serta merta menambahkan sesuatu konten di
antara tag information tersebut layaknya tag html
menggunakan props, nah pada bagian ini kita
biasa.
akan belajar mengirimkan konten ke dalam
component. Sehingga kode template berikut akan menampilkan
error
Misalnya kita memiliki component bernama
information <information>Halo apa kabar?</information>
caranya, kita harus deklarasikan Kemudian component tersebut dapat kita panggil
menggunakan elemen slot sebagai berikut.
<information></information>
Vue.component('information', {
template: `
<div class="card">
<slot name="judul"></slot>
<hr>
<slot name="isi"></slot>
</div>
`
})
Single File Component
ES6 memungkinkan kita bisa membuat
deklarasi component dalam file yang terpisah
sehingga file utama tidak menjadi terlalu
panjang. Hal ini bisa dilakukan dengan fitur
import dan export.
<component :is="currentComponent"></component>
Transition Effect
Vue menyediakan cara yang sederhana untuk
memberikan efek animasi transisi. Pada
bagian sebelumnya yaitu dynamic
component, kita dapat menambahkan efek
animasi atas pergantian component supaya
pergantiannya terasa lembut dan menarik.
Contoh definisi mixins. Defini tersebut jika digunakan pada Vue objek seperti berikut.
Properti created dan methods pada mixins melebur ke
dalam objek Vue, sehingga objek Vue memiliki
behavior yang sama dengan mixinnya.
Deklarasi mixin pada object Vue atau component
pada contoh di atas termasuk deklarasi local.
Mixins seperti juga component dapat
dideklarasikan secara global. Berikut ini contoh
deklarasi global mixin.
<div id="app"> // mapping route path dengan componentnya, dibaca dari atas ke
bawah
<p>
<router-link to="/">Home</router-link>
const routes = [
<router-link to="/about">About</router-link> { path: '/', component: Home, alias: '/home' },
</p> { path: '/about', component: About }
<router-view></router-view> ]
</div> // register routing aplikasi kita pada objek dari class VueRouter
const router = new VueRouter({
routes // bentuk pendek dari `routes: routes`
})
// register objek router pada objek Vue
var vm = new Vue({
el: '#app',
router,
})
Bagaimana jika path tidak ditemukan? misalnya
user mengakses URL /contact-us Jadi ketika kita mengakses URL /contact-us maka Vue
Router akan meredirect ke URL /.
Jika hal itu terjadi maka tidak akan ada component
yang dimuat karena tidak ada path dalam mapping Dengan menggunakan Vue Router ini maka seluruh
yang sesuai. Untuk mengatasi hal ini, maka kita routing yang pernah kita klik akan tersimpan di-history
perlu menghandle URL apapun dan meredirectnya browser sehingga ketika user mengklik button back,
ke URL / jika tidak ada yang sesuai. Gunakan path URL akan sesuai dengan routing yang terakhir kali
* yang akan sesuai dengan url apapun diakses.
Dynamic Routing
Kita bisa menyertakan parameter pada routing Hanya saja jika jumlah data bukunya sangat banyak
sehingga menjadikan routing menjadi dinamis. maka tentu sangat tidak efisien jika kita harus
definisikan satu persatu. Oleh karena itu, Vue Router
Misalnya path book/1 untuk buku dengan id 1, path menyediakan cara untuk mengatasi hal ini, yaitu
book/2 untuk buku dengan id 2, dst. Maka dengan menggunakan parameter yang diawali dengan
sebenarnya kita bisa tuliskan seperti berikut ini. simbol :. Berikut ini contohnya:
Membuat BooksComponent
Component ini berfungsi menampilkan
daftar buku. Supaya lebih rapi pada
tutorial ini deklarasi component buku
akan letakkan pada file terpisah.
Perhatikan path book/:id, ini adalah path dinamis dimana parameter id bersifat dinamis sesuai dengan link
pada router-linknya. Nah, untuk mengaksesnya kita bisa gunakan kode this.$route.params.id.
Nama parameternya bebas, tidak harus id untuk data id. Artinya pada contoh di atas, boleh saja kita ganti
dengan path book/:kode, maka untuk mengakses parameternya menjadi this.$route.params.kode.
Programmatic Navigation
Disamping menggunakan element router-link Method ini berfungsi sama dengan ketika kita mengklik
yang menampilkan link untuk menuju ke path link , oleh karena itu klik setara dengan memanggil
tertentu, kita juga dapat menjalankan method router.push(...).
dari objek Vue Router untuk meredirect
halaman ke path tertentu. Berikut ini contoh variasi pemanggilan method ini.
Kita akan mencoba melalui deklarasi dalam Kode di atas, kita akan menampilkan dialog confirm. Jika
component menggunakan hook beforeRouteLeave. pengguna setuju atau mengkonfirmasi dialog tersebut
Pada BookComponent, tambahkan properti ini. maka halaman akan diredirect keluar atau next route, jika
tidak setuju maka akan tetap pada halaman tersebut
next(false)
Authentication Route
Contoh implementasi lain dari navigation guards,
adalah kita bisa mencegah user yang tidak
memiliki hak akses untuk mengakses suatu route /
halaman tertentu.
Kode di atas akan merequest data buku pada jsonbin.io dengan metode GET
xhr.open("GET", "http://api.jsonbin.io/b/5b42acd44d5ea95c8ba22392");.
Kemudian jika permintaan data sukses if (this.status >= 200 && this.status <
300) maka data tersebut akan dicommit ke mutation setBooks, tentunya karena
data berformat JSON maka kita perlu parsing atau konversi ke bentuk objek
atau array Javascript menggunakan JSON.parse
Kemudian pada objek Vue atau component,
tepatnya pada hook created kita bisa
melakukan dispatch action getBooks dan
pada computed kita perlu buat fungsi books
yang memanggil getters books pada store,
sebagai berikut
Selanjutnya pada template,
kita gunakan teknik list
rendering
Menangani Two Way Data Binding
Kita tau bahwa sifat dari v-model itu ada dua yaitu
getter dan setter, artinya ketika kita mengisi teks
pada field input maka variabel data akan diset
sesuai dengan teks isian kita (setter), sebalik jika
variabel data diubah maka isian field input juga
akan mengikuti perubahan pada variabel data
tersebut (getter).