매개변수(Params)를 활용한 동적 라우트 매칭(Dynamic Route Matching)

매우 자주 주어진 패턴의 경로를 동일한 컴포넌트에 매핑해야합니다. 예를 들어 모든 사용자에 대해 렌더링되어야하지만 사용자 ID가 다른 User 컴포넌트가 있을 수 있습니다. Vue Router 에서는 이를 달성하기 위해 경로의 동적 세그먼트를 사용할 수 있으며 이를 param 이라고합니다.

const User = {
  template: '<div>User</div>',
}

// 이것은 `createRouter` 로 전달됩니다.
const routes = [
  // 동적 세그먼트는 콜론(:)으로 시작합니다.
  { path: '/users/:id', component: User },
]

이제 /users/johnny/users/jolyne 과 같은 URL 은 모두 동일한 경로에 매핑됩니다.

param 은(는) 콜론 : (으)로 표시됩니다. 경로가 일치하면 해당 params 의 값이 모든 컴포넌트에서 this.$route.params 로 노출됩니다. 따라서 User 의 템플릿을 다음과 같이 업데이트하여 현재 사용자 ID를 렌더링 할 수 있습니다.

const User = {
  template: '<div>User {{ $route.params.id }}</div>',
}

동일한 경로에 여러 params 가 있을 수 있으며 $route.params 의 해당 필드에 매핑됩니다.
예 :

patternmatched path$route.params
/users/:username/users/eduardo{ username: 'eduardo' }
/users/:username/posts/:postId/users/eduardo/posts/123{ username: 'eduardo', postId: '123' }

$route.params 외에도 $route 객체는 $route.query 와 같은 기타 유용한 정보도 노출합니다.(URL 에 query 가 있는 경우) $route.hash 기타 등 API Reference 에서 자세한 내용을 확인할 수 있습니다.

이 예제의 작동 데모는 여기 에서 찾을 수 있습니다.

매개변수(Params) 변경에 대한 반응

매개 변수(params)와 함께 경로를 사용할 때 주의해야 할 점은 사용자가 /users/johnny 에서 /users/jolyne 으로 이동 할 때 ** 동일한 컴포넌트 인스턴스가 재사용 된다는 것입니다. **두 경로 모두 동일한 컴포넌트를 렌더링하므로 이전 인스턴스를 삭제 한 다음 새 인스턴스를 만드는 것보다 더 효율적입니다. 그러나 이는 컴포넌트 수명주기 훅(hook)이 호출되지 않음을 의미하기도 합니다.

동일한 컴포넌트의 매개 변수(params) 변경에 대응하려면 $route 객체를 감시합니다. 이 시나리오에서는 $route.params 의 모든 항목을 관찰하면됩니다.

const User = {
  template: '...',
  created() {
    this.$watch(
      () => this.$route.params,
      (toParams, previousParams) => {
        // 라우트 변경에 대응...
      }
    )
  },
}

또는 beforeRouteUpdate, navigation guard 를 사용하여 탐색을 취소 할 수도 있습니다.

const User = {
  template: '...',
  async beforeRouteUpdate(to, from) {
    // 라우트 변경에 대응...
    this.userData = await fetchUser(to.params.id)
  },
}

모두 캐치(Catch all) / 404 Not fount Route

일반 매개 변수(params)는 / 로 구분된 URL 조각 사이의 문자만 일치합니다. 무엇이든 일치 시키려면 param 바로 뒤에 괄호 안에 정규식을 추가하여 맞춤 param 정규식을 사용할 수 있습니다.

const routes = [
  // 모든 것을 일치시키고`$ route.params.pathMatch` 아래에 넣습니다.
  { path: '/:pathMatch(.*)*', name: 'NotFound', component: NotFound },
  // `/ user-`로 시작하는 모든 항목과 일치하고`$ route.params.afterUser` 아래에 배치합니다.
  { path: '/user-:afterUser(.*)', component: UserGeneric },
]

이 특정 시나리오에서는 괄호 사이에 커스텀 정규식(custom regexp) 을 사용하고 pathMatch 매개 변수를 선택적으로 반복 가능(optionally repeatable) 으로 표시합니다. 이를 통해 필요한 경우 path 를 배열로 분할하여 경로로 직접 이동할 수 있습니다.

this.$router.push({
  name: 'NotFound',
  // 현재 경로를 유지하고 `//` 로 시작하는 대상 URL 을 피하기 위해 첫 번째 문자를 제거
  params: { pathMatch: this.$route.path.substring(1).split('/') },
  // 기존 쿼리 및 해시(있는 경우) 유지
  query: this.$route.query,
  hash: this.$route.hash,
})

반복 매개변수(repeated params) 부분에서 자세히 알아보세요.

History mode 를 사용하는 경우 지침에 따라 서버도 올바르게 구성해야합니다.

고급 매칭 패턴

Vue Router 는 express 에서 사용하는 것에서 영감을 얻은 자체 경로 일치 구문을 사용하므로 선택적 매개 변수, 0 개 이상 또는 하나 이상의 요구 사항, 심지어 사용자 정의 정규식 패턴과 같은 많은 고급 매칭 패턴을 지원합니다. 고급 매칭(Advanced Matching) 문서를 확인하여 살펴보세요.