TL;DR

Next.js の App Router で、同じ階層または別の階層の Route Segment を横取り(インターセプト)するための Route の定義。現在のページの文脈を保ったまま、別の Segment の内容を現在のレイアウトの中に表示できる。

仕組み

インターセプトは Soft navigation のときだけ起きる。リロードは Hard navigation なので、インターセプトは起きない。

どの Route Segment に一致させるかは、ディレクトリ名の先頭に付ける記号で決める。

規則インターセプトする Segment
(.)同じ階層
(..)1 つ上の階層
(..)(..)2 つ上の階層
(...)app ディレクトリ直下

例

Parallel Routes と組み合わせると、「Soft navigation のときはモーダルで写真を表示する」といった機能を作れる。@modal は Parallel Routes の Slot で、Route Segment ではない。このため、@modal の中から (..) で 1 つ上の階層に一致させられる。

インターセプトしたときに表示するコンポーネントは、写真をモーダルで包む。

// Intercepting Route
export default function PhotoModal({ params }) {
  const photo = photo.find((p) => p.id === params.id)
 
  return (
    <Modal>
      <Photo photo={photo} />
    </Modal>
  )
}

直接アクセスしたときに表示する、元の Route Segment のコンポーネントは、写真だけを表示する。

// current Route Segment
export default function PhotoModal({ params }) {
  const photo = photo.find((p) => p.id === params.id)
 
  return <Photo photo={photo} />
}

自分の理解

文章で理解するより、実際のディレクトリ構成を見たほうが理解しやすい。

関連

出典