Vue는 SPA 프레임워크로 서버에 요청하여 이동할 페이지를 갱신하는 것이 아니라, 미리 해당 페이지들을 받아놓고 페이지 이동시 화면을 갱신합니다.
이러한 페이지 이동을 위한 환경을 제공하는 것이 뷰 라우터(Vue Router)입니다.
이러한 Vue 라우터를 설치하는 방법은 다음과 같습니다.
<!--NPM을 이용한 설치-->
npm install vue-router
<!--CDN-->
<!--뷰 라우터를 위한 뷰 라이브러리-->
<script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router@3.5.3/dist/vue-router.js"></script>
Vue 라우터 사용방법
이렇게 설치한 Vue 라우터를 사용하기 위해서는 Vue 라우터 인스턴스 정의하고 Vue인스턴스에 매칭해줘야 합니다.
var router = new VueRouter({
routes: [
{
path: 'url',
component: 해당 url에 표시될 컴포넌트
}
]
});
new Vue({
el: ...,
router : router
});
또한, 이렇게 정의한 뷰 라우터를 나타낼 router-view 태그를 html상에서 정의해줍니다.
이러한 router-view 태그는 컴포넌트를 호출할 영역이라 생각하시면 됩니다.
<div id="...">
<router-view></router-view>
</div>
예시 코드
'/'을 url로 가지는 main 페이지와 '/login'을 url로 가지는 login페이지를 구현해보겠습니다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<router-view></router-view>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router@3.5.3/dist/vue-router.js"></script>
<script>
var LoginComponent = {
template: '<div>login</div>'
}
var MainComponent = {
template: '<div>main</div>'
}
var router = new VueRouter({
routes: [
{
path: '/login',
component: LoginComponent
},
{
path: '/',
component: MainComponent
}
]
});
new Vue({
el: '#app',
router: router,
});
</script>
</body>
</html>
결과를 보시면 입력한 url마다 각각 login/main 컴포넌트의 탬플릿이 출력되는 것을 확인할 수 있습니다.
또한, html 상에서도 url마다 달라지는 것을 확인할 수 있습니다.
즉, 표현할 각 컴포넌트 탬플릿을 <router-view>에 표현한 것입니다.
router-link
이때까지의 페이지 이동은 직접 주소를 변경하여 적용하였지만, 일반적으로 사용자에게는 링크를 통해 페이지가 이동되는 환경을 제공합니다. 이러한 환경을 구현할 수 있는 것이 router-link 태그입니다.
<router-link to='url'></router-link>
router-link태그를 추가한 코드
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<div id="app">
<div>
<router-link to="/login">Login</router-link>
<router-link to="/">Main</router-link>
</div>
<router-view></router-view>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router@3.5.3/dist/vue-router.js"></script>
<script>
var LoginComponent = {
template: '<div>login</div>'
}
var MainComponent = {
template: '<div>main</div>'
}
var router = new VueRouter({
mode : 'history',
routes: [
{
path: '/login',
component: LoginComponent
},
{
path: '/',
component: MainComponent
}
]
});
new Vue({
el: '#app',
router: router,
});
</script>
</body>
</html>
코드 결과물
첫 번째 사진에서의 각 링크를 클릭하면 2,3번째 사진처럼 url변경 및 페이지 이동이 이뤄집니다.
페이지 이동과 함께 <router-view>가 해당 탬플릿으로 변경됩니다.
또한, 우리가 정의한 router-link태그는 화면에서 <a>태그로 변환되어 제공됩니다.
이때까지의 url은 앞에 '#'가 붙어있습니다.
이러한 '#'문자 없이 url을 구성하고 싶다면 VueRouter를 정의할 때, mode='hostory'를 추가해주면 됩니다.(mode의 기본값은 'hash'입니다)
var router = new VueRouter({
mode : history,
routes: [
...
]
});
이번 게시물로 Vue에서 화면에 표현할 컴포넌트를 가지고 있다가 변경될 요소만 갱신하는 SPA의 특징을 제공하는 Vue Router를 다뤄봤습니다.
참조
[강의] 인프런 - Vue.js 시작하기 - Age of Vue.js(캡틴판교) https://www.inflearn.com/course/age-of-vuejs
'Vue' 카테고리의 다른 글
[Vue] 상하관계가 아닌 컴포넌트간 통신 (0) | 2022.04.25 |
---|---|
[Vue] 컴포넌트간 통신(event, props) (0) | 2022.04.22 |
[Vue] 컴포넌트 (0) | 2022.04.13 |
[Vue] 인스턴스 (0) | 2022.04.07 |
[Vue] Vue.js 소개 (1) | 2022.04.04 |
댓글