Navigation Guards | Vue Router
router.beforeEach()
를 사용하여 설정to
: 이동할 URL 정보가 담긴 Route 객체from
: 현재 URL 정보가 담긴 Route 객체next
: 지정한 URL로 이동하기 위해 호출하는 함수router.beforeEach()
가 호출됨next()
를 호출해줘야 함next()
가 호출되지 않으면 화면이 전환되지 않음// router/index.js
router.beforeEach((to, from, next) => {
console.log('to', to)
console.log('from', from)
console.log('next', next)
})
next()
가 호출되어야 화면이 전환됨// router/index.js
router.beforeEach((to, from, next) => {
console.log('to', to)
console.log('from', from)
console.log('next', next)
next()
})
// views/LoginView.vue
<template>
<div>
<h1>This is Login Page</h1>
</div>
</template>
<script>
export default {
name: 'LoginView'
}
</script>
<style>
</style>
// router/index.js
import LoginView from '@/views/LoginView'
const routes = [
...,
{
path: '/login',
name: 'login',
component: LoginView
},
]
// App.vue
<template>
<div id="app">
<nav>
...
<router-link :to="{ name: 'login' }">Login</router-link> |
</nav>
<router-view/>
</div>
</template>
router.beforeEach()
함수 작성HelloView에 로그인을 해야만 접근할 수 있도록 만들어 보자.
// router/index.js
router.beforeEach((to, from, next) => {
// 로그인 여부
const isLoggedIn = true // 로그인 됨
// 로그인이 필요한 페이지
const authPages = ['hello']
// 앞으로 이동할 페이지(to)가 로그인이 필요한 사이트인지 확인
const isAuthRequired = authPages.includes(to.name)
// 로그인이 필요한 페이지인데 로그인이 안되어있다면 로그인 페이지로 이동
if (isAuthRequired && !isLoggedIn) {
console.log('Login으로 이동!')
next({ name: 'login' })
} else {
console.log('to로 이동!')
next()
}
})
isLoggedIn
이 true
인 경우 (로그인 상태에서 로그인이 필요한 페이지로 접속)/hello/:userName
에 해당하는 컴포넌트가 정상적으로 렌더링isLoggedIn
이 false
인 경우 (비로그인 상태에서 로그인이 필요한 페이지로 접속)/hello/:userName
을 렌더링하지 않고 Login 페이지로 이동됨/hello/:userName
로 접속 시도 후 (전역 가드에 막힘) 전역 가드에서 login으로 이동 요청 할 때 출력/hello/:userName
페이지를 제외하고는 전역 가드에서 기존 주소로 이동하기 때문에 정상적으로 작동// router/index.js
router.beforeEach((to, from, next) => {
...
// 로그인이 필요한 페이지
const authPages = ['hello', 'home', 'about']
// router/index.js
router.beforeEach((to, from, next) => {
...
// const authPages = ['hello', 'home', 'about']
const allowAllPages = ['login']
// const isAuthRequired = authPages.includes(to.name)
const isAuthRequired = !allowAllPages.includes(to.name)
...
})
beforeEnter()
beforeEnter()
함수 작성// router/index.js
// 로그인 여부에 대한 임시 변수
const isLoggedIn = true
const routes = [
...
{
path: '/login',
name: 'login',
component: LoginView,
// 라우터 가드
beforeEnter(to, from, next){
if (isLoggedIn === true){
console.log('이미 로그인 함')
next({name:'home'})
} else {
next() // 로그인이 안되어 있다면 로그인 페이지로 이동
}
}
},
]
isLoggedIn = true
인 경우 (로그인 상태인 경우)/login
으로 접속을 시도하면 Home으로 이동beforeRouteUpdate()
beforeRouteUpdate()
를 사용해서 처리// views/Helloview.vue
<script>
export default {
name: 'HelloView',
data() {
return {
userName: this.$route.params.userName
}
},
// 컴포넌트 가드
beforeRouteUpdate(to, from, next){
this.userName = to.params.userName
next()
}
}
</script>
https://github.com/mjieun0956/TIL/tree/master/Vue/11.%20Navigation%20Guard/navigation-guard