Skip to content

내비게이션 인식

데이터 가져오기가 내비게이션 가드 안에서 발생하므로, 일반 내비게이션 가드처럼 내비게이션을 제어할 수 있습니다:

  • throw된 오류(또는 reject된 Promise)는 내비게이션을 취소하며(일반 내비게이션 가드와 동일한 동작), Vue Router의 오류 처리에서 가로챕니다
  • reroute()를 호출하여 내비게이션을 리다이렉트하거나 취소할 수 있습니다

그 외에 반환된 값은 모두 해결된 데이터 로 간주되며 data 속성에 나타납니다.

reroute()로 내비게이션 제어하기

reroute()는 데이터 로더 내부에서 현재 내비게이션을 변경합니다. 내비게이션을 변경하는 한 내비게이션 가드의 반환값과 동일한 인자를 받습니다. trueundefined는 내비게이션을 변경하지 않으므로 받을 수 없습니다. 내부적으로 throw 하여 로더 실행을 즉시 중단합니다.

ts
import { reroute } from 'vue-router/experimental'
import { defineBasicLoader } from 'vue-router/experimental'

export const useUserData = defineBasicLoader(
  async (to) => {
    // 유효하지 않은 ID에 대해 내비게이션을 취소합니다
    if (isInvalidId(to.params.id)) {
      reroute(false)
    }

    try {
      const user = await getUserById(to.params.id)

      return user
    } catch (error) {
      if (error.status === 404) {
        reroute({ name: 'not-found' })
      } else {
        throw error // 라우터 내비게이션을 중단합니다
      }
    }
  }
)

TIP

reroute()는 내부적으로 throw하며(반환 타입은 never), 호출한 뒤에 return이나 else를 사용할 필요가 없습니다.

일관된 업데이트

내비게이션 중에는 데이터 로더가 하나의 묶음 처럼 함께 그룹화됩니다. 내비게이션이 취소되면 어떤 결과도 사용되지 않습니다. 이렇게 하면 페이지에서 일부 데이터만 업데이트되거나 URL과 페이지 내용 사이에 불일치가 생기는 일을 피할 수 있습니다. 반대로 내비게이션이 성공하면 모든 데이터 로더가 함께 해결되고, 모든 로더가 해결된 뒤에만 데이터가 업데이트됩니다. 이는 lazy loader에도 동일하게 적용됩니다. 따라서 매우 빠른 로더가 있더라도 모든 로더가 해결되고 새 데이터가 완전히 표시될 준비가 될 때까지는 기존 데이터가 표시됩니다.

Lazy 로더

일관된 업데이트를 제외하면 lazy loader는 내비게이션을 인식하지 않습니다. 오류나 reroute()로 내비게이션을 제어할 수 없습니다. 그래도 내비게이션이 시작되자마자 로딩을 시작합니다.

내비게이션 후 로딩

내비게이션이 끝날 때까지 데이터 로딩을 시작하지 않도록 할 수도 있습니다. 그러려면 로더를 페이지에 연결하지 않으면 됩니다. 그러면 페이지가 마운트될 때 로딩이 시작됩니다.

모두를 위한 문서 한글화