Vue Router mencocokkan alamat di URL dengan komponen yang harus tampil, jadi satu aplikasi bisa punya banyak "halaman" tanpa meminta halaman baru ke server. Aplikasi seperti ini disebut SPA (single-page application): cuma satu file HTML, dan JavaScript yang menukar isinya. Bayangin papan menu besar Warung Bu Sri yang panelnya bisa dibalik. Pembeli menyebut "menu nomor 2", dan Bu Sri cukup membalik panelnya ke Mie Ayam. Warungnya gak dibangun ulang, dan pembeli gak perlu keluar lalu masuk lagi. Nomor yang disebut pembeli itu URL, Bu Sri yang mencocokkan nomor dengan panel itu router, dan bingkai tempat panelnya terpasang itu <RouterView />.
🧪 Tebakan cepat: Di
/menu/2(Mie Ayam), komponenDetailMenumengambil menunya dionMounted. Ada link "Menu berikutnya" ke/menu/3. Diklik, URL-nya jadi/menu/3. Judulnya berubah jadi Es Teh atau tetap Mie Ayam? Tebak dulu, jawabannya ada di bagian "Komponen yang sama dipakai ulang".
Routes: path ke komponen
// src/router/index.js
import { createRouter, createWebHistory } from "vue-router"
import Beranda from "../views/Beranda.vue"
import DaftarMenu from "../views/DaftarMenu.vue"
const routes = [
{ path: "/", component: Beranda },
{ path: "/menu", component: DaftarMenu },
{ path: "/menu/:id", component: () => import("../views/DetailMenu.vue") },
{ path: "/:pathMatch(.*)*", component: () => import("../views/TidakDitemukan.vue") },
]
export const router = createRouter({
history: createWebHistory(),
routes,
})
- Setiap route punya
path(alamatnya) dancomponent(yang tampil di alamat itu). component: () => import("...")adalah lazy loading: file komponennya baru diunduh waktu route itu pertama kali dibuka, jadi halaman pertama lebih cepat.createWebHistory()membuat URL bersih seperti/menu/2. Server harus mengirimindex.htmluntuk setiap alamat; kalau enggak, me-refresh/menu/2dijawab 404 oleh server.createWebHashHistory()membuat URL/#/menu/2yang gak butuh pengaturan server.- Di
src/main.js,createApp(App).use(router).mount("#app")memasang router ke aplikasi. Vue Router paket terpisah:npm install vue-router.
RouterLink dan RouterView
<!-- App.vue -->
<template>
<nav>
<RouterLink to="/">Beranda</RouterLink>
<RouterLink to="/menu">Menu</RouterLink>
</nav>
<RouterView />
</template>
Di /menu, link Menu dirender jadi <a href="/menu" class="router-link-active router-link-exact-active" aria-current="page">Menu</a>.
| Klik | URL | <RouterView /> menampilkan |
Dimuat ulang dari server? |
|---|---|---|---|
| buka aplikasi | / |
Beranda | ya, sekali |
| RouterLink Menu | /menu |
DaftarMenu | gak |
| RouterLink Mie Ayam | /menu/2 |
DetailMenu | gak |
<RouterLink to="...">menghasilkan<a href>biasa, tapi klik-nya dicegat: URL diganti lewat History API dan<RouterView />menukar komponennya. Halaman gak dimuat ulang, jadi state seperti keranjang tetap ada.<a href="/menu">biasa membuat browser meminta halaman baru ke server. Seluruh aplikasi mulai dari nol, dan keranjangnya kembali 0.- Link yang cocok dengan URL sekarang mendapat class
router-link-active, jadi menu yang aktif gampang diberi gaya.
Parameter route: /menu/:id
<!-- DetailMenu.vue -->
<script setup>
import { useRoute, useRouter } from "vue-router"
const route = useRoute()
const router = useRouter()
console.log(route.params.id) // di /menu/2: "2", teks
function kembali() {
router.push("/menu")
}
</script>
:iddi path adalah parameter: bagian URL yang boleh berisi apa saja./menu/2cocok dengan/menu/:id, danroute.params.idberisi"2".- Parameter selalu teks. Mencari
daftarMenu.find((m) => m.id === route.params.id)gak pernah ketemu karena2 === "2"itufalse. Ubah dulu:Number(route.params.id). useRoute()memberi info route yang sedang aktif:path,params,query.useRouter()memberi router-nya, untuk berpindah lewat kode:router.push("/menu"),router.back().
Komponen yang sama dipakai ulang
Dari /menu/2 ke /menu/3, route yang cocok tetap /menu/:id, jadi Vue Router memakai ulang DetailMenu yang sudah ada. Komponennya gak dibuat ulang, dan onMounted gak jalan lagi. URL dan route.params.id sudah 3, tapi judulnya tetap Mie Ayam. Itu jawaban tebakannya. Awasi parameternya:
const menu = ref(null)
watch(() => route.params.id, (id) => {
menu.value = daftarMenu.find((m) => m.id === Number(id))
}, { immediate: true })
| Kejadian | route.params.id |
Judul tanpa watch | Judul dengan watch |
|---|---|---|---|
buka /menu/2 |
"2" | Mie Ayam | Mie Ayam |
| klik Menu berikutnya | "3" | Mie Ayam | Es Teh |
Halaman 404
Tanpa route yang cocok, misalnya /minuman, <RouterView /> gak menampilkan apa-apa. Build development menulis [Vue Router warn]: No match found for location with path "/minuman". Route { path: "/:pathMatch(.*)*", component: TidakDitemukan } cocok dengan alamat apa pun yang gak ditangkap route lain, jadi alamat nyasar mendapat halaman 404 sendiri.
Di editor latihan
Editor latihan memuat Vue Router asli (versi 4.5.1) begitu kodemu memakai createRouter. Dua bedanya dengan proyek Vite: editor ini gak punya main.js, jadi router yang dibuat createRouter langsung dipasang ke app-nya, seperti app.use(router). Pratinjau juga gak punya address bar, jadi createWebHistory() di sana menyimpan riwayat alamatnya di memori dan selalu mulai dari /.
- Latihan pertama membuat router dengan dua route,
<RouterLink id="home-link">dan<RouterLink id="about-link">, lalu<RouterView />. Pemeriksanya mengklik link-nya dan membaca#page. - Latihan kedua menambahkan route
/profil/:namadan membaca parameternya denganuseRoute(), jadih2#currentberbunyiProfil budisetelah link Budi diklik.
Mengklik <a href="/about"> biasa di pratinjau gak membuka apa-apa: editor mencegah bingkainya pindah alamat dan menulis pesan di console. Di aplikasi sungguhan, link seperti itu memuat ulang seluruh halaman, persis yang dicegah RouterLink.
📌 Navigation guard
router.beforeEach dijalankan sebelum setiap perpindahan. Kembalikan false untuk membatalkan, alamat lain untuk mengalihkan, atau gak mengembalikan apa-apa untuk lanjut:
router.beforeEach((to) => {
if (to.path === "/bayar" && !sudahMasuk.value) return "/masuk"
})
⚠️ Jebakan yang sering ketemu
<a href>untuk pindah halaman di dalam aplikasi. Seluruh aplikasi dimuat ulang dan state hilang. Pakai<RouterLink to>.- Mengira komponen dibuat ulang saat parameter berubah.
/menu/2ke/menu/3memakai komponen yang sama. Awasi() => route.params.id. - Membandingkan parameter dengan angka.
route.params.iditu teks. PakaiNumber(...). - Lupa route 404. Alamat nyasar tampil kosong. Tambahkan
/:pathMatch(.*)*. - Teks dan id beda dari brief. Latihan memeriksa
#home-link,#about-link,#pageberisiHome PagelaluAbout Page, kemudian#navdengan minimal 3 link, danh2#currentyang berbunyiHome,Profil budi, atauProfil sarisesuai link yang diklik.
TL;DR: Vue Router mencocokkan URL dengan komponen. createRouter({ history: createWebHistory(), routes }) dengan routes berisi { path, component }, lalu app.use(router). <RouterLink to="/menu"> berpindah tanpa memuat ulang halaman, dan <RouterView /> menampilkan komponen yang cocok. /menu/:id memberi route.params.id berupa teks lewat useRoute(); useRouter() untuk router.push(). Pindah dari /menu/2 ke /menu/3 memakai ulang komponen yang sama, jadi awasi parameternya dengan watch. Route /:pathMatch(.*)* menangkap alamat yang gak dikenal.