Vue3 Composition API에서 Vue Router 사용

Vue2까지의 Options API에서는 this.$router와 같이 this를 통해 라우터 객체에 액세스했습니다. 그러나, Composition API의 setup 메소드내에서는 this 에 액세스 할 수 없습니다. 그러므로 지금까지와는 다른 접근 방식으로 접근해야 합니다.

useRouter() · useRoute()로 바꾸기



라우터 개체를 얻으려면 vue-rouer에서 useRouter 또는 useRoute 함수를 가져옵니다. 각 함수는 다음과 같이 대응합니다.


Options API
Composition API


this.$router
useRouter

this.$route
useRoute

 <script lang="ts"> import { defineComponent } from 'vue' import { useRoute, useRouter } from 'vue-router' export default defineComponent({ setup() { const router = useRouter() const route = useRoute() const fetch = () => { const { id } = route.params store.getTodo(id) } const goHome = () => { router.push('/') } return { goHome, } }, }) </script> 
useRoute() 함수에서 가져올 수 있습니다.

템플릿 내에서 지금까지와 같이 route , $router 에 액세스할 수 있습니다. 그러므로 $route 또는 router 객체를 return 할 필요가 없습니다.

setup 메소드 밖에서는 액세스 할 수 없다



앞서 설명한 $route 함수는 범용적으로 사용할 수 있을 것 같기 때문에 Composition API의 유의가 되어 다른 파일로 분할해 보고 싶은 곳입니다. 이 함수를 goHome 에 넣고 거기에서 호출하도록 변경해 보겠습니다.

src/composable/router/index.ts
import router from '@/router' import { useRouter } from 'vue-router' const router = useRouter() export const goHome = () => { router.push('/') } 

somePage.vue
<template> <button @click="goHome">トップへ戻る</button> </template> <script lang="ts"> import { defineComponent } from 'vue' import { goHome } from '@/composables/router' export default defineComponent({ setup() { return { goHome, } }, }) </script> 

버튼을 눌러 봐도, 생각에 반해 반응해 주지 않습니다. 콘솔 에러를 보면, 아무래도 src/composable/router/index.ts 로부터 얻은 useRouter() 오브젝트가 router 로 되어 있는 것 같습니다.



컴포넌트 내 네비게이션 가드



네비게이션 가드도 마찬가지로 undefined 에서 함수를 가져와서 사용합니다.

Opsitions API에서 vue-router에 해당하는 것은 제공되지 않는 것 같습니다.


Options API
Composition API


beforeRouteEnter
-

beforeRouteUpdate
onBeforeRouteLeave

beforeRouteLeave
onBeforeRouteLeave

<script lang="ts"> import { defineComponent } from 'vue' import { onBeforeRouteLeave, onBeforeRouteUpdate, } from 'vue-router' export default defineComponent({ setup() { onBeforeRouteLeave((to, from) => { //  }) onBeforeRouteUpdate((to, from) => { //  }) }, }) </script> 

좋은 웹페이지 즐겨찾기