Skip to content

λ‚΄λΉ„κ²Œμ΄μ…˜ κ°€λ“œ ​

μ΄λ¦„μ—μ„œ μ•Œ 수 μžˆλ“―μ΄, Vue λΌμš°ν„°μ—μ„œ μ œκ³΅ν•˜λŠ” λ‚΄λΉ„κ²Œμ΄μ…˜ κ°€λ“œλŠ” 주둜 λ‚΄λΉ„κ²Œμ΄μ…˜μ„ λ¦¬λ””λ ‰μ…˜ν•˜κ±°λ‚˜ μ·¨μ†Œν•˜μ—¬ λ‚΄λΉ„κ²Œμ΄μ…˜μ„ λ³΄ν˜Έν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. 라우트 λ‚΄λΉ„κ²Œμ΄μ…˜ 과정에 훅을 κ±°λŠ” λ°©λ²•μ—λŠ” μ „μ—­, λΌμš°νŠΈλ³„, μ»΄ν¬λ„ŒνŠΈ λ‚΄μ—μ„œ λ“± μ—¬λŸ¬ κ°€μ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μ „μ—­ Before κ°€λ“œ ​

router.beforeEachλ₯Ό μ‚¬μš©ν•˜μ—¬ μ „μ—­ before κ°€λ“œλ₯Ό 등둝할 수 μžˆμŠ΅λ‹ˆλ‹€:

js
const router = createRouter({ ... })

router.beforeEach((to, from) => {
  // ...
  // λ‚΄λΉ„κ²Œμ΄μ…˜μ„ μ·¨μ†Œν•˜λ €λ©΄ λͺ…μ‹œμ μœΌλ‘œ falseλ₯Ό λ°˜ν™˜ν•˜μ„Έμš”
  return false
})

μ „μ—­ before κ°€λ“œλŠ” 생성 μˆœμ„œλŒ€λ‘œ, λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ 트리거될 λ•Œλ§ˆλ‹€ ν˜ΈμΆœλ©λ‹ˆλ‹€. κ°€λ“œλŠ” λΉ„λ™κΈ°μ μœΌλ‘œ 해결될 수 있으며, λͺ¨λ“  훅이 ν•΄κ²°λ˜κΈ° μ „κΉŒμ§€ λ‚΄λΉ„κ²Œμ΄μ…˜μ€ 보λ₯˜(pending) μƒνƒœλ‘œ κ°„μ£Όλ©λ‹ˆλ‹€.

λͺ¨λ“  κ°€λ“œ ν•¨μˆ˜λŠ” 두 개의 인자λ₯Ό λ°›μŠ΅λ‹ˆλ‹€:

그리고 μ„ νƒμ μœΌλ‘œ λ‹€μŒ κ°’ 쀑 ν•˜λ‚˜λ₯Ό λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  • false: ν˜„μž¬ λ‚΄λΉ„κ²Œμ΄μ…˜μ„ μ·¨μ†Œν•©λ‹ˆλ‹€. λΈŒλΌμš°μ € URL이 λ³€κ²½λœ 경우(μ‚¬μš©μžκ°€ μˆ˜λ™μœΌλ‘œ λ³€κ²½ν–ˆκ±°λ‚˜ λ’€λ‘œ κ°€κΈ° λ²„νŠΌμ„ μ‚¬μš©ν•œ 경우), from 라우트의 URL둜 μž¬μ„€μ •λ©λ‹ˆλ‹€.

  • 라우트 μœ„μΉ˜: 라우트 μœ„μΉ˜λ₯Ό μ „λ‹¬ν•˜μ—¬ λ‹€λ₯Έ μœ„μΉ˜λ‘œ λ¦¬λ””λ ‰μ…˜ν•©λ‹ˆλ‹€. μ΄λŠ” router.push()λ₯Ό ν˜ΈμΆœν•˜λŠ” 것과 κ°™μœΌλ©°, replace: trueλ‚˜ name: 'home'κ³Ό 같은 μ˜΅μ…˜μ„ 전달할 수 μžˆμŠ΅λ‹ˆλ‹€. ν˜„μž¬ λ‚΄λΉ„κ²Œμ΄μ…˜μ€ μ€‘λ‹¨λ˜κ³  λ™μΌν•œ from을 κ°€μ§„ μƒˆλ‘œμš΄ λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ μƒμ„±λ©λ‹ˆλ‹€.

    js
    router.beforeEach(async (to, from) => {
      if (
        // μ‚¬μš©μžκ°€ μΈμ¦λ˜μ—ˆλŠ”μ§€ 확인
        !isAuthenticated &&
        // ❗️ λ¬΄ν•œ λ¦¬λ””λ ‰μ…˜ λ°©μ§€
        to.name !== 'Login'
      ) {
        // μ‚¬μš©μžλ₯Ό 둜그인 νŽ˜μ΄μ§€λ‘œ λ¦¬λ””λ ‰μ…˜
        return { name: 'Login' }
      }
    })

μ˜ˆμƒμΉ˜ λͺ»ν•œ 상황이 λ°œμƒν•œ 경우 Errorλ₯Ό throwν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 이 κ²½μš°μ—λ„ λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ μ·¨μ†Œλ˜κ³  router.onError()λ₯Ό 톡해 λ“±λ‘λœ 콜백이 ν˜ΈμΆœλ©λ‹ˆλ‹€.

아무것도 λ°˜ν™˜ν•˜μ§€ μ•Šκ±°λ‚˜, undefined λ˜λŠ” trueλ₯Ό λ°˜ν™˜ν•˜λ©΄ λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ μœ νš¨ν•˜λ‹€κ³  κ°„μ£Όλ˜μ–΄ λ‹€μŒ λ‚΄λΉ„κ²Œμ΄μ…˜ κ°€λ“œκ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€.

μœ„μ˜ λͺ¨λ“  λ‚΄μš©μ€ async ν•¨μˆ˜ 및 Promise와 λ™μΌν•˜κ²Œ λ™μž‘ν•©λ‹ˆλ‹€:

js
router.beforeEach(async (to, from) => {
  // canUserAccess()λŠ” `true` λ˜λŠ” `false`λ₯Ό λ°˜ν™˜
  const canAccess = await canUserAccess(to)
  if (!canAccess) return '/login'
})

선택적 μ„Έ 번째 인자 next ​

이전 λ²„μ „μ˜ Vue Routerμ—μ„œλŠ” μ„Έ 번째 인자 nextλ₯Ό μ‚¬μš©ν•  수 μžˆμ—ˆμœΌλ©°, μ΄λŠ” ν”νžˆ μ‹€μˆ˜μ˜ 원인이 λ˜μ–΄ RFCλ₯Ό 톡해 μ œκ±°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ—¬μ „νžˆ μ§€μ›λ˜λ―€λ‘œ, λ‚΄λΉ„κ²Œμ΄μ…˜ κ°€λ“œμ— μ„Έ 번째 인자λ₯Ό 전달할 수 μžˆμŠ΅λ‹ˆλ‹€. 이 경우, λ‚΄λΉ„κ²Œμ΄μ…˜ κ°€λ“œλ₯Ό 톡과할 λ•Œ λ°˜λ“œμ‹œ ν•œ 번만 nextλ₯Ό ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€. μ—¬λŸ¬ 번 λ“±μž₯ν•  수 μžˆμ§€λ§Œ, 논리 κ²½λ‘œκ°€ κ²ΉμΉ˜μ§€ μ•ŠλŠ” κ²½μš°μ—λ§Œ κ·Έλ ‡κ³ , κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 훅이 ν•΄κ²°λ˜μ§€ μ•Šκ±°λ‚˜ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. λ‹€μŒμ€ μΈμ¦λ˜μ§€ μ•Šμ€ μ‚¬μš©μžλ₯Ό /login으둜 λ¦¬λ””λ ‰μ…˜ν•˜λŠ” 잘λͺ»λœ μ˜ˆμ‹œμž…λ‹ˆλ‹€:

js
// 잘λͺ»λœ μ˜ˆμ‹œ
router.beforeEach((to, from, next) => {
  if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })
  // μ‚¬μš©μžκ°€ μΈμ¦λ˜μ§€ μ•Šμ€ 경우, `next`κ°€ 두 번 호좜됨
  next()
})

μ˜¬λ°”λ₯Έ 버전은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

js
// μ˜¬λ°”λ₯Έ μ˜ˆμ‹œ
router.beforeEach((to, from, next) => {
  if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })
  else next()
})

μ „μ—­ Resolve κ°€λ“œ ​

router.beforeResolveλ₯Ό μ‚¬μš©ν•˜μ—¬ μ „μ—­ κ°€λ“œλ₯Ό 등둝할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” router.beforeEach와 μœ μ‚¬ν•˜κ²Œ λͺ¨λ“  λ‚΄λΉ„κ²Œμ΄μ…˜μ—μ„œ νŠΈλ¦¬κ±°λ˜μ§€λ§Œ, resolve κ°€λ“œλŠ” λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ ν™•μ •λ˜κΈ° 직전, λͺ¨λ“  μ»΄ν¬λ„ŒνŠΈ λ‚΄ κ°€λ“œμ™€ 비동기 라우트 μ»΄ν¬λ„ŒνŠΈκ°€ ν•΄κ²°λœ 후에 ν˜ΈμΆœλ©λ‹ˆλ‹€. λ‹€μŒμ€ μ»€μŠ€ν…€ meta 속성 requiresCameraκ°€ μ •μ˜λœ λΌμš°νŠΈμ—μ„œ μ‚¬μš©μžκ°€ 카메라 μ ‘κ·Ό κΆŒν•œμ„ λΆ€μ—¬ν–ˆλŠ”μ§€ ν™•μΈν•˜λŠ” μ˜ˆμ‹œμž…λ‹ˆλ‹€:

js
router.beforeResolve(async to => {
  if (to.meta.requiresCamera) {
    try {
      await askForCameraPermission()
    } catch (error) {
      if (error instanceof NotAllowedError) {
        // ... 였λ₯˜λ₯Ό μ²˜λ¦¬ν•œ ν›„ λ‚΄λΉ„κ²Œμ΄μ…˜ μ·¨μ†Œ
        return false
      } else {
        // 예기치 μ•Šμ€ 였λ₯˜, λ‚΄λΉ„κ²Œμ΄μ…˜ μ·¨μ†Œ 및 였λ₯˜λ₯Ό μ „μ—­ ν•Έλ“€λŸ¬λ‘œ 전달
        throw error
      }
    }
  }
})

router.beforeResolveλŠ” μ‚¬μš©μžκ°€ νŽ˜μ΄μ§€μ— μ§„μž…ν•  수 μ—†λŠ” 경우 데이터λ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ 기타 μž‘μ—…μ„ ν”Όν•˜κ³  싢을 λ•Œ 이상적인 μœ„μΉ˜μž…λ‹ˆλ‹€.

μ „μ—­ After ν›… ​

μ „μ—­ after 훅도 등둝할 수 μžˆμ§€λ§Œ, κ°€λ“œμ™€ 달리 이 훅듀은 next ν•¨μˆ˜λ₯Ό λ°›μ§€ μ•ŠμœΌλ©° λ‚΄λΉ„κ²Œμ΄μ…˜μ— 영ν–₯을 쀄 수 μ—†μŠ΅λ‹ˆλ‹€:

js
router.afterEach((to, from) => {
  sendToAnalytics(to.fullPath)
})

이 훅듀은 뢄석, νŽ˜μ΄μ§€ 제λͺ© λ³€κ²½, νŽ˜μ΄μ§€ μ•Œλ¦Όκ³Ό 같은 μ ‘κ·Όμ„± κΈ°λŠ₯ λ“± λ‹€μ–‘ν•œ μš©λ„λ‘œ μœ μš©ν•©λ‹ˆλ‹€.

λ˜ν•œ λ‚΄λΉ„κ²Œμ΄μ…˜ μ‹€νŒ¨λ₯Ό μ„Έ 번째 인자둜 λ°˜μ˜ν•©λ‹ˆλ‹€:

js
router.afterEach((to, from, failure) => {
  if (!failure) sendToAnalytics(to.fullPath)
})

λ‚΄λΉ„κ²Œμ΄μ…˜ μ‹€νŒ¨μ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ κ°€μ΄λ“œλ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

κ°€λ“œ λ‚΄μ—μ„œμ˜ μ „μ—­ μ£Όμž… ​

Vue 3.3λΆ€ν„°λŠ” λ‚΄λΉ„κ²Œμ΄μ…˜ κ°€λ“œ λ‚΄μ—μ„œ inject()λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” pinia μŠ€ν† μ–΄μ™€ 같은 μ „μ—­ 속성을 μ£Όμž…ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€. app.provide()둜 제곡된 λͺ¨λ“  것은 router.beforeEach(), router.beforeResolve(), router.afterEach() λ‚΄μ—μ„œλ„ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€:

ts
// main.ts
const app = createApp(App)
app.provide('global', 'hello injections')

// router.ts λ˜λŠ” main.ts
router.beforeEach((to, from) => {
  const global = inject('global') // 'hello injections'
  // pinia μŠ€ν† μ–΄
  const userStore = useAuthStore()
  // ...
})

λΌμš°νŠΈλ³„ κ°€λ“œ ​

라우트의 μ„€μ • 객체에 beforeEnter κ°€λ“œλ₯Ό 직접 μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

js
const routes = [
  {
    path: '/users/:id',
    component: UserDetails,
    beforeEnter: (to, from) => {
      // λ‚΄λΉ„κ²Œμ΄μ…˜ κ±°λΆ€
      return false
    },
  },
]

beforeEnter κ°€λ“œλŠ” ν•΄λ‹Ή λΌμš°νŠΈμ— μ§„μž…ν•  λ•Œλ§Œ 트리거되며, params, query λ˜λŠ” hashκ°€ 변경될 λ•Œ(예: /users/2μ—μ„œ /users/3으둜 μ΄λ™ν•˜κ±°λ‚˜ /users/2#infoμ—μ„œ /users/2#projects둜 이동)μ—λŠ” νŠΈλ¦¬κ±°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 였직 λ‹€λ₯Έ λΌμš°νŠΈμ—μ„œ μ§„μž…ν•  λ•Œλ§Œ νŠΈλ¦¬κ±°λ©λ‹ˆλ‹€.

beforeEnter에 ν•¨μˆ˜ 배열을 전달할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ—¬λŸ¬ λΌμš°νŠΈμ—μ„œ κ°€λ“œλ₯Ό μž¬μ‚¬μš©ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€:

js
function removeQueryParams(to) {
  if (Object.keys(to.query).length)
    return { path: to.path, query: {}, hash: to.hash }
}

function removeHash(to) {
  if (to.hash) return { path: to.path, query: to.query, hash: '' }
}

const routes = [
  {
    path: '/users/:id',
    component: UserDetails,
    beforeEnter: [removeQueryParams, removeHash],
  },
  {
    path: '/about',
    component: UserDetails,
    beforeEnter: [removeQueryParams],
  },
]

쀑첩 라우트λ₯Ό μ‚¬μš©ν•  λ•Œ, λΆ€λͺ¨μ™€ μžμ‹ 라우트 λͺ¨λ‘ beforeEnterλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λΆ€λͺ¨ λΌμš°νŠΈμ— λ°°μΉ˜ν•˜λ©΄, λ™μΌν•œ λΆ€λͺ¨λ₯Ό κ°€μ§„ μžμ‹ κ°„ 이동 μ‹œμ—λŠ” νŠΈλ¦¬κ±°λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄:

js
const routes = [
  {
    path: '/user',
    beforeEnter() {
      // ...
    },
    children: [
      { path: 'list', component: UserList },
      { path: 'details', component: UserDetails },
    ],
  },
]

μœ„ μ˜ˆμ‹œμ˜ beforeEnterλŠ” /user/list와 /user/details κ°„ 이동 μ‹œμ—λŠ” ν˜ΈμΆœλ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 두 λΌμš°νŠΈκ°€ λ™μΌν•œ λΆ€λͺ¨λ₯Ό κ³΅μœ ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ§Œμ•½ beforeEnter κ°€λ“œλ₯Ό details λΌμš°νŠΈμ— 직접 λ°°μΉ˜ν•˜λ©΄, 두 라우트 κ°„ 이동 μ‹œ ν˜ΈμΆœλ©λ‹ˆλ‹€.

TIP

라우트 meta ν•„λ“œμ™€ μ „μ—­ λ‚΄λΉ„κ²Œμ΄μ…˜ κ°€λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λΌμš°νŠΈλ³„ κ°€λ“œμ™€ μœ μ‚¬ν•œ λ™μž‘μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ»΄ν¬λ„ŒνŠΈ λ‚΄ κ°€λ“œ ​

λ§ˆμ§€λ§‰μœΌλ‘œ, 라우트 μ»΄ν¬λ„ŒνŠΈ(λΌμš°ν„° 섀정에 μ „λ‹¬λœ μ»΄ν¬λ„ŒνŠΈ) 내뢀에 직접 라우트 λ‚΄λΉ„κ²Œμ΄μ…˜ κ°€λ“œλ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Options API μ‚¬μš© ​

λ‹€μŒ μ˜΅μ…˜μ„ 라우트 μ»΄ν¬λ„ŒνŠΈμ— μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

  • beforeRouteEnter
  • beforeRouteUpdate
  • beforeRouteLeave
vue
<script>
export default {
  beforeRouteEnter(to, from) {
    // 이 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ Œλ”λ§ν•˜λŠ” λΌμš°νŠΈκ°€ ν™•μ •λ˜κΈ° 전에 ν˜ΈμΆœλ©λ‹ˆλ‹€.
    // `this` μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.
    // 이 κ°€λ“œκ°€ 호좜될 λ•Œ μ»΄ν¬λ„ŒνŠΈκ°€ 아직 μƒμ„±λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€!
  },
  beforeRouteUpdate(to, from) {
    // 이 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ Œλ”λ§ν•˜λŠ” λΌμš°νŠΈκ°€ λ³€κ²½λ˜μ—ˆμ§€λ§Œ, 이 μ»΄ν¬λ„ŒνŠΈκ°€ μƒˆ λΌμš°νŠΈμ—μ„œ μž¬μ‚¬μš©λ  λ•Œ ν˜ΈμΆœλ©λ‹ˆλ‹€.
    // 예λ₯Ό λ“€μ–΄, `/users/:id`와 같은 λΌμš°νŠΈμ—μ„œ `/users/1`κ³Ό `/users/2` 사이λ₯Ό 이동할 λ•Œ,
    // λ™μΌν•œ `UserDetails` μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€κ°€ μž¬μ‚¬μš©λ˜λ©°, 이 훅이 ν˜ΈμΆœλ©λ‹ˆλ‹€.
    // μ΄λ•Œ μ»΄ν¬λ„ŒνŠΈκ°€ λ§ˆμš΄νŠΈλ˜μ–΄ μžˆμœΌλ―€λ‘œ, λ‚΄λΉ„κ²Œμ΄μ…˜ κ°€λ“œλŠ” `this` μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  },
  beforeRouteLeave(to, from) {
    // 이 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ Œλ”λ§ν•˜λŠ” λΌμš°νŠΈμ—μ„œ λ²—μ–΄λ‚˜κΈ° 직전에 ν˜ΈμΆœλ©λ‹ˆλ‹€.
    // `beforeRouteUpdate`와 λ§ˆμ°¬κ°€μ§€λ‘œ, `this` μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  },
}
</script>

beforeRouteEnter κ°€λ“œλŠ” this에 μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€. 이 κ°€λ“œλŠ” λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ ν™•μ •λ˜κΈ° 전에 ν˜ΈμΆœλ˜λ―€λ‘œ, μ§„μž…ν•˜λŠ” μƒˆ μ»΄ν¬λ„ŒνŠΈκ°€ 아직 μƒμ„±λ˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, next에 μ½œλ°±μ„ μ „λ‹¬ν•˜μ—¬ μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ‚΄λΉ„κ²Œμ΄μ…˜μ΄ ν™•μ •λ˜λ©΄ 콜백이 호좜되고, μ»΄ν¬λ„ŒνŠΈ μΈμŠ€ν„΄μŠ€κ°€ 인자둜 μ „λ‹¬λ©λ‹ˆλ‹€:

js
beforeRouteEnter (to, from, next) {
  next(vm => {
    // `vm`을 톡해 μ»΄ν¬λ„ŒνŠΈ 곡개 μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Ό
  })
}

beforeRouteEnter만이 next에 μ½œλ°±μ„ μ „λ‹¬ν•˜λŠ” 것을 μ§€μ›ν•©λ‹ˆλ‹€. beforeRouteUpdate와 beforeRouteLeaveμ—μ„œλŠ” 이미 thisκ°€ μ‚¬μš© κ°€λŠ₯ν•˜λ―€λ‘œ, 콜백 전달이 λΆˆν•„μš”ν•˜λ©° μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€:

js
beforeRouteUpdate (to, from) {
  // κ·Έλƒ₯ `this`λ₯Ό μ‚¬μš©ν•˜μ„Έμš”
  this.name = to.params.name
}

leave κ°€λ“œλŠ” 주둜 μ‚¬μš©μžκ°€ μ €μž₯ν•˜μ§€ μ•Šμ€ νŽΈμ§‘ λ‚΄μš©μ„ κ°€μ§„ μ±„λ‘œ 라우트λ₯Ό λ– λ‚˜λŠ” 것을 λ°©μ§€ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. falseλ₯Ό λ°˜ν™˜ν•˜μ—¬ λ‚΄λΉ„κ²Œμ΄μ…˜μ„ μ·¨μ†Œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

js
beforeRouteLeave (to, from) {
  const answer = window.confirm('μ •λ§λ‘œ λ– λ‚˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? μ €μž₯λ˜μ§€ μ•Šμ€ 변경사항이 μžˆμŠ΅λ‹ˆλ‹€!')
  if (!answer) return false
}

Composition API μ‚¬μš© ​

Composition API둜 μ»΄ν¬λ„ŒνŠΈλ₯Ό μž‘μ„±ν•˜λŠ” 경우, onBeforeRouteUpdate와 onBeforeRouteLeaveλ₯Ό 톡해 μ—…λ°μ΄νŠΈ 및 leave κ°€λ“œλ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ Composition API μ„Ήμ…˜μ„ μ°Έκ³ ν•˜μ„Έμš”.

전체 λ‚΄λΉ„κ²Œμ΄μ…˜ ν•΄κ²° 흐름 ​

  1. λ‚΄λΉ„κ²Œμ΄μ…˜ 트리거.
  2. λΉ„ν™œμ„±ν™”λœ μ»΄ν¬λ„ŒνŠΈμ˜ beforeRouteLeave κ°€λ“œ 호좜.
  3. μ „μ—­ beforeEach κ°€λ“œ 호좜.
  4. μž¬μ‚¬μš©λ˜λŠ” μ»΄ν¬λ„ŒνŠΈμ˜ beforeRouteUpdate κ°€λ“œ 호좜.
  5. 라우트 μ„€μ •μ˜ beforeEnter 호좜.
  6. 비동기 라우트 μ»΄ν¬λ„ŒνŠΈ ν•΄κ²°.
  7. ν™œμ„±ν™”λœ μ»΄ν¬λ„ŒνŠΈμ˜ beforeRouteEnter 호좜.
  8. μ „μ—­ beforeResolve κ°€λ“œ 호좜.
  9. λ‚΄λΉ„κ²Œμ΄μ…˜ ν™•μ •.
  10. μ „μ—­ afterEach ν›… 호좜.
  11. DOM μ—…λ°μ΄νŠΈ 트리거.
  12. μΈμŠ€ν„΄μŠ€ν™”λœ μΈμŠ€ν„΄μŠ€μ™€ ν•¨κ»˜ beforeRouteEnter κ°€λ“œμ— μ „λ‹¬λœ 콜백 호좜.

λͺ¨λ‘λ₯Ό μœ„ν•œ λ¬Έμ„œ ν•œκΈ€ν™”