Roadmap › Vue.js 3 (with Pinia, Vue Router & Nuxt basics) › Module: Router, State and Forms
Lessons in this course (17)
12. Vue Router
Intermediate★ Must knowLesson 12 of 17
ts
// router/index.ts
import { createRouter, createWebHistory } from "vue-router";
const router = createRouter({
history: createWebHistory(), // or createWebHashHistory()
routes: [
{ path: "/", component: () => import("@/views/Home.vue") },
{ path: "/orders", name: "orders", component: () => import("@/views/Orders.vue") },
{ path: "/orders/:id(\\d+)", name: "order", component: () => import("@/views/OrderDetail.vue"), props: true },
{ path: "/admin", component: () => import("@/views/Admin.vue"), meta: { requiresAuth: true },
children: [{ path: "users", component: () => import("@/views/AdminUsers.vue") }] },
{ path: "/:pathMatch(.*)*", component: () => import("@/views/NotFound.vue") },
],
});
router.beforeEach(to => { // global navigation guard
const auth = useAuthStore();
if (to.meta.requiresAuth && !auth.isLoggedIn) return { name: "login", query: { redirect: to.fullPath } };
});
export default router;vue
<RouterLink :to="{ name: 'order', params: { id: o.id } }">Open</RouterLink>
<RouterView />
<script setup>
import { useRoute, useRouter } from "vue-router";
const route = useRoute(); // route.params.id, route.query
const router = useRouter(); // router.push({ name: "orders" })
</script>Guards: global (beforeEach, beforeResolve, afterEach), per-route (beforeEnter), in-component (onBeforeRouteLeave, onBeforeRouteUpdate). History mode needs a server fallback to index.html.