Meme's IT

[Vue] Router(3) Navigation Guard 본문

FrontEnd/Vue

[Vue] Router(3) Navigation Guard

Memez 2023. 11. 9. 14:26

# Navigation Guard란?

vue router를 통해 특정 URL에 접근할 때

다른 URL로 redirect하거나 취소해서 네비게이션을 보호하는 것

예를 들어, 인증 정보가 없다면 특정 페이지를 못 들어가게 막음

 

 

 

종류

1. Globally(전역 가드)

애플리케이션 전역에서 동작

index.js에서 정의해줌

 

router.beforeEach( )

다른 URL로 이동하기 직전에 실행되는 함수

// beforeEach의 구조
router.beforeEach((to, from) => {
    ...
    return false 
})
  • to : 이동할 url 정보가 담긴 route 객체
  • from: 현재 url 정보가 담긴 route 객체
  • 반환값
    • false: 현재 네비게이션 취소
    • route location: router.push()처럼 경로 위치를 전달해 다른 위치로 redirect가능
    • return이 없다면, to위치에 있는 곳으로 이동 = 원래 목표
// 객체를 return해서 동적 routing 가능
router.beforeEach((to, from) => {
  return {name:'About'}
})

// if 문등을 사용해서 조건을 줄 수도 있음
router.beforeEach((to, from) => {
  const isAuthenticated = false
  if (isAuthenticated && to.name !== 'login') {
    console.log('로그인이 필요합니다')
    return {name: 'login'}
    }
})

 

 

 

2. Per-route(라우터 가드)

특정 route에서만 동작

→ index.js에서 해당 route 밑에 붙여주자

 

router.beforeEnter( )

route에 진입했을 때만 실행되는 함수

매개변수나 쿼리값이 변경될 때에는 실행되지 않고, 다른 경로에서 탐색할 때만 실행됨(참고)

path가 바뀔 때만 실행된다

// beforeEnter의 구조

path:'/user/:id',
name: 'user',
component: UserView,
// route 밑에 붙여준다
beforeEnter: (to, from) => {
    ...
    return false 
}

 

ex) 만약 로그인 되어있다면 로그인 페이지를 안가고, 바로 홈으로 돌아가도록 하는 기능

beforeEnter: (to, from) => {
    if (isAuthenticated === true) {
      console.log('이미 로그인 되어 있습니다')
      return { name: 'home' }
    }
}

 

 

 

3. In component Guard

특정 컴포넌트 내에서만 동작

해당 컴포넌트의 script에 정의해준다

 

onBeforeRouteLeave

현재 라우트에서 다른 라우트로 이동하기 전에 실행

= 떠날 때 실행

// component의 vue파일의 script에서
import { useRoute, useRouter, onBeforeRouteLeave } from 'vue-router'
onBeforeRouteLeave((to, from) => {
    window.confirm('나갈려구요?')
    if (answer === false) {
        return false
    }
})

나갈려고 하면 다음과 같이 메세지가 뜨게 할 수 있다

 

 

 

onBeforeRouteUpdate

이미 랜더링된 컴포넌트가 같은 라우트 내에서 업데이트되기 전에 실행

→ 라우트 업데이트 시 추가적인 로직을 처리

(ex. '/user/1' → '/user/2')

 

user 페이지에서 다른 사람의 페이지로 가는 버튼을 만들어보자

// userView.vue

// template
<h3>{{ $route.params.id }}번 유저의 페이지입니다.</h3>
<h3>{{ userId }}번 유저의 페이지입니다.</h3>
<button @click="goAnotherUser">다른 사람의 페이지로</button>

// script
const goAnotherUser = function () {
    router.push({name : 'user', params : { id: 2 } })
}

그러고나서 버튼을 눌러보면

userId는 바뀌지 않는 것을 확인할 수 있다.

이럴때 onBeforeRouteUpdate를 사용해서 바꿔줄 수 있다.

// userView.vue
// script
import { useRoute, useRouter, onBeforeRouteUpdate } from 'vue-router'
const goAnotherUser = function () {
    router.push({name : 'user', params : { id: 2 } })
}
// 추가
onBeforeRouteUpdate((to, from) => {
    userId.value = to.params.id
})

이렇게 추가를 해주고, 다시 확인하면 둘 다 바뀜!

 

컴포넌트가 재사용 되었기 때문에 반응형 변수가 재활용되므로 원래 안됐었음

그래서 그걸 업데이트 해준 것

'FrontEnd > Vue' 카테고리의 다른 글

[Vue] State Management  (0) 2023.11.13
[Vue] Axios  (1) 2023.11.10
[Vue] Router(2) 프로그래밍 방식 네비게이션  (0) 2023.11.09
[Vue] Router(1) 기본, 동적 Routing  (0) 2023.11.09
[Vue] Component State Flow(2) Component Event  (0) 2023.11.08