リンクとナビゲーション
Next.jsのルーターを使用すると、シングルページアプリケーション(SPA)と同様に、ページ間でクライアントサイドのルート遷移を行うことができます。
このクライアントサイドルート遷移を行うために、Link
というReactコンポーネントが提供されています。
上記の例では複数のリンクを使用しています。各リンクはパス(href
)を既知のページにマッピングしています:
/
→pages/index.js
/about
→pages/about.js
/blog/hello-world
→pages/blog/[slug].js
ビューポート内(初期表示時またはスクロールによる)のすべての<Link />
は、静的生成(Static Generation)を使用するページに対して、デフォルトでプリフェッチされます(対応するデータを含む)。サーバーサイドレンダリング(SSR)ルートの対応データは、<Link />
がクリックされた時点でのみフェッチされます。
動的パスへのリンク
動的ルートセグメントでは、パスを作成するために文字列補間も使用できます。例えば、コンポーネントにプロップとして渡された投稿のリストを表示する場合:
この例では、パスをUTF-8互換に保つために
encodeURIComponent
を使用しています。
または、URLオブジェクトを使用する方法:
この場合、パスを作成するために文字列補間を使用する代わりに、href
内でURLオブジェクトを使用しています:
pathname
はpages
ディレクトリ内のページ名(この場合は/blog/[slug]
)query
は動的セグメントを持つオブジェクト(この場合はslug
)
ルーターの注入
Reactコンポーネント内でrouter
オブジェクトにアクセスするには、useRouter
またはwithRouter
を使用できます。
一般的にはuseRouter
の使用を推奨します。
命令的なルーティング
next/link
でほとんどのルーティングニーズをカバーできますが、それを使用せずにクライアントサイドナビゲーションを行うこともできます。next/router
のドキュメントを参照してください。
以下の例は、useRouter
を使用した基本的なページナビゲーションの方法を示しています:
シャロー(浅い)ルーティング
シャロー・ルーティングを使用すると、getServerSideProps
、getStaticProps
、getInitialProps
などのデータフェッチングメソッドを再実行せずにURLを変更できます。
useRouter
またはwithRouter
によって追加されるrouter
オブジェクトから、状態を失うことなく更新されたpathname
とquery
を受け取ります。
シャロー・ルーティングを有効にするには、shallow
オプションをtrue
に設定します。以下の例を参照してください:
URLは/?counter=10
に更新されますが、ページは置き換えられず、ルートの状態のみが変更されます。
以下のようにcomponentDidUpdate
を使用してURLの変更を監視することもできます:
注意点
シャロー・ルーティングは現在のページのURL変更に対してのみ機能します。例えば、pages/about.js
という別のページがある場合に以下を実行すると:
これは新しいページであるため、現在のページをアンロードし、新しいページをロードしてデータフェッチを待機します(シャロー・ルーティングを指定した場合でも)。
シャロー・ルーティングがミドルウェアと共に使用される場合、以前のように新しいページが現在のページと一致することを保証しません。これはミドルウェアが動的に書き換える可能性があり、データフェッチなしではクライアントサイドで検証できないためです(シャロー・ルーティングではスキップされます)。そのため、シャロー・ルート変更は常に浅いものとして扱う必要があります。