목차
- Vue-router
- SPA(단일 페이지 애플리케이션: Single Page Application)
- vue-router의 기본 사용법
- 1️⃣ createRouter()
- 2️⃣ <RouterView>
- 3️⃣ <RouterLink to=”경로”>
- 프로젝트 생성
- 📦 프로젝트 구조
- 📁src/router/index.js
- 📁 src/main.js
- 📁 src/App.vue
- 🧱 작업할 프로젝트 컴포넌트 구조
- router 객체와 currentRoute 객체
- 컴포넌트에서 router 객체 접근하기
- Router 관련 정보 접근
- currentRoute 객체의 주요 속성
- route vs router
- ◽ route
- ◽ router
Vue-router
SPA(단일 페이지 애플리케이션: Single Page Application)
- 하나의 페이지 안에서 데스크톱 애플리케이션과 같은 사용자 경험을 제공
- 여러 화면을 하나의 페이지 안에서 제공, 화면을 별도로 로딩하지 않음 ➡ 화면마다 고유의 식별자(URI)를 기반으로 화면을 렌더링 해야 함
- 요청한 URI 경로에 따라 각각 다른 화면이 렌더링 되도록 함 ➡ vue-router 라이브러리 이용
vue-router의 기본 사용법
1️⃣ createRouter()
createRouter(options):Router
- router 객체를 생성
- URI 와 이 경로를 처리할 컴포넌트 매핑
import { createRouter, createWebHistory } from 'vue-router'
…
const router = createRouter({ // 라우팅 테이블
history: createRouter(),
routes: [ // 배열 형태
{ path: '/', components: Home },
{ path: '/about', components: About },
{ path: '/members', components: Members },
{ path: '/videos', components: Videos},
]
});
- router 객체 등록
const app = createApp(App) app.use(router) app.mount('#app')
2️⃣ <RouterView>
- 각 경로별 컴포넌트를 렌더링할 위치를 지정하는 컴포넌트
- 일반적으로 App.vue 에서 설정
<template>
<div class="container">
<Header />
<RouterView />
</div>
</template>
3️⃣ <RouterLink to=”경로”>
- 화면 전환을 위한 링크 생성
<router-link to="[등록시킬 URI 경로]">[링크 텍스트]</router-link>
// 등록시킬 URI 경로를 문자열이 아닌 변수로 할 경우는 v-bind사용
<router-link :to="[등록시킬 URI 경로]">[링크 텍스트]</router-link>
<RouterLink to="/">Home</RouterLink> //최종적으로는 a 태그로 렌더링됨
프로젝트 생성
npm init vue 프로젝트이름
vue-router 선택 후 enter
cd 프로젝트이름
npm install
📦 프로젝트 구조
src
├─assets
│ base.css
│ logo.svg
│ main.css
│
├─components
│ │ HelloWorld.vue
│ │ TheWelcome.vue
│ │ WelcomeItem.vue
│ │
│ └─icons
│ IconCommunity.vue
│ IconDocumentation.vue
│ IconEcosystem.vue
│ IconSupport.vue
│ IconTooling.vue
│
├─router # 라우터 생성됨
│ index.js
│
└─views # 일반적으로는 pages 이름으로 사용
AboutView.vue
HomeView.vue
📁src/router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [ // 수정 대상
{
path: '/',
name: 'home',
component: HomeView, // 초기 로딩시 실행
},
{
path: '/about',
name: 'about',
// route level code-splitting ⭐
// this generates a separate chunk (About.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import('../views/AboutView.vue'), // 당장 실행 X, /about 요청이 들어왔을 때 실행
},
],
})
export default router
- route level-splitting : build 단계가 index.html → js → css 로 진행 되는데 규모가 커지면 초기 로딩 시간이 길어지므로 javascript 부분을 잘라서 필요한 부분만 로딩하도록 하는 것
- 나중에 실행하도록 lazy-loaded
- 해당
path
가 요청됐을 때 로딩 되도록 함
📁 src/main.js
import './assets/main.css'
import { createApp } from 'vue'
import App from './App.vue'
import router from './router' // -> index.js
const app = createApp(App)
app.use(router)
app.mount('#app')
📁 src/App.vue
<script setup>
import { RouterLink, RouterView } from 'vue-router'
import HelloWorld from './components/HelloWorld.vue'
</script>
<template>
<header>
<img
alt="Vue logo"
class="logo"
src="@/assets/logo.svg"
width="125"
height="125"
/>
<div class="wrapper">
<HelloWorld msg="You did it!" />
<nav>
<RouterLink to="/">Home</RouterLink>
<RouterLink to="/about">About</RouterLink>
</nav>
</div>
</header>
<RouterView /> <!--본문 파트-->
</template>
<style scoped>
…
</style>
🧱 작업할 프로젝트 컴포넌트 구조

router 객체와 currentRoute 객체
컴포넌트에서 router 객체 접근하기
this.$router
- src/router/index.js에서 작성한 router 객체
- 전체 라우트 정보 파악
- push(), replace(), go() 등의 매서드 이용가능
Router 관련 정보 접근
구분 | Options API | Composition API |
---|---|---|
라우터 객체 | this.$router |
const router = useRouter() 스크립트로 페이지 이동 |
매칭된 라우트(currentRoute) | this.$route 또는 this.$router.currentRoute |
const currentRoute = useRoute() |
currentRoute 객체의 주요 속성
currentRoute 객체의 주요 속성 | 설명 |
---|---|
fullPath |
전체 요청 경로, 쿼리문자열까지 포함 (예: /about?a=1&b=2 ) |
matched |
vue-router 객체의 routes 배열의 라우트 중 매칭된 라우트 |
params |
URI 경로에 동적으로 전달된 파라미터 정보 (동적 라우트에서 사용) |
path |
요청 URI 경로 |
query |
쿼리 문자열 정보 (?a=1&b=2 요청 시 this.$route.query 는 { a: 1, b: 2 } ) |
redirectedFrom |
다른 경로에서 리디렉트된 경우, 리디렉트시킨 URI 경로 정보를 포함 |
route vs router
◽ route
- 현재 라우트 정보
- 경로, 쿼리, 파라미터 등을 포함하고 있음
- 컴포넌트 내부에서
useRoute()
훅 또는this.$route
로 접근 가능
// 예: 현재 라우트의 파라미터 가져오기
import { useRoute } from 'vue-router'
export default {
setup() {
const route = useRoute()
console.log(route.params.id) // 예: /user/123 -> id = 123
}
}
◽ router
- Vue Router 인스턴스
- 애플리케이션 전체의 라우팅 설정을 관리하는 객체
- 경로(route)와 컴포넌트(component)를 연결하는 역할
- 예) 어떤 URL로 이동했을 때 어떤 컴포넌트를 보여줄지 정의
// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
import About from '../views/About.vue'
const routes = [
{ path: '/', component: Home },
{ path: '/about', component: About },
]
const router = createRouter({
history: createWebHistory(),
routes,
})
export default router
// main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
createApp(App).use(router).mount('#app')
개념 | 역할 | 접근 방법 |
---|---|---|
route | 현재 라우트 상태 | userRoute() 또는 this.$route |
router | 전체 라우팅 설정 및 이동 제어 | useRouter() 또는 this.$router |
'Vue.js' 카테고리의 다른 글
IntelliJ에서 Vue.js 프로젝트 설정하기 (1) | 2025.04.06 |
---|---|
HTML, SFC, Options, Composition - Vue.js (0) | 2025.03.26 |
반응형 기초 - Vue.js (0) | 2025.03.22 |
계산된 속성(Computed Property) - Vue.js (0) | 2025.03.22 |
이벤트 핸들링 - Vue.js (0) | 2025.03.21 |