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.