$route를 사용해 라우트에 접근할 수 있습니다.useRoute 컴포저블은 vue-router에 동일한 이름으로 존재하는 컴포저블을 감싼 것으로, Nuxt 애플리케이션에서 현재 라우트에 접근할 수 있게 해 줍니다.
핵심적인 차이점은 Nuxt에서는 내비게이션 이후 페이지 콘텐츠가 변경된 뒤에만 라우트가 업데이트되도록 이 컴포저블이 보장한다는 점입니다.
반면 vue-router 버전은 라우트를 즉시 업데이트하며,
이는 예를 들어 라우트 메타데이터에 의존하는 템플릿의 서로 다른 부분들 사이에서 동기화 문제를 일으킬 수 있습니다.
다음 예시에서는 동적 페이지 파라미터인 slug를 URL의 일부로 사용하여 useFetch를 통해 API를 호출합니다.
<script setup lang="ts">
const route = useRoute()
const { data: mountain } = await useFetch(`/api/mountains/${route.params.slug}`)
</script>
<template>
<div>
<h1>{{ mountain.title }}</h1>
<p>{{ mountain.description }}</p>
</div>
</template>
라우트 쿼리 파라미터(예: /test?example=true 경로의 example)에 접근해야 한다면, useRoute().params 대신 useRoute().query를 사용할 수 있습니다.
동적 파라미터와 쿼리 파라미터 외에도, useRoute()는 현재 라우트와 관련된 다음과 같은 계산된 ref들을 제공합니다:
fullPath: 경로, 쿼리, 해시를 모두 포함하는 현재 라우트에 연결된 인코딩된 URLhash: # 문자로 시작하는 URL의 디코딩된 해시 부분query: 라우트 쿼리 파라미터에 접근matched: 현재 라우트 위치와 일치하는 정규화된 라우트들의 배열meta: 레코드에 첨부된 커스텀 데이터name: 라우트 레코드의 고유한 이름path: URL의 인코딩된 경로명 부분redirectedFrom: 현재 라우트 위치에 도달하기 전에 접근을 시도했던 라우트 위치페이지 내비게이션 중 동기화 문제를 피하려면 vue-router의 것이 아닌 Nuxt의 useRoute() 컴포저블을 사용하는 것이 중요합니다.
useRoute를 vue-router에서 직접 임포트하면 Nuxt의 구현을 우회하게 됩니다.
// ❌ `vue-router`의 `useRoute`는 사용하지 마세요
import { useRoute } from 'vue-router'
// ✅ Nuxt의 `useRoute` 컴포저블을 사용하세요
import { useRoute } from '#app'
useRoute in Middleware미들웨어에서 useRoute를 사용하는 것은 예기치 않은 동작을 유발할 수 있으므로 권장되지 않습니다.
미들웨어에는 "현재 라우트"라는 개념이 없습니다.
useRoute() 컴포저블은 Vue 컴포넌트의 setup 함수나 Nuxt 플러그인 안에서만 사용해야 합니다.
useRoute()를 사용하는 모든 컴포저블에도 동일하게 적용됩니다.route.fullPath브라우저는 요청을 보낼 때 URL 프래그먼트(예: #foo)를 전송하지 않습니다. 따라서 템플릿에 영향을 주기 위해 route.fullPath를 사용하면, 클라이언트에서는 프래그먼트를 포함하지만 서버에서는 포함하지 않기 때문에 하이드레이션 문제가 발생할 수 있습니다.