<Link>
<Link>
は HTML <a>
要素を拡張した React コンポーネントで、プリフェッチとルート間のクライアントサイドナビゲーションを提供します。Next.jsでルート間を移動する主要な方法です。
基本的な使用方法:
リファレンス
<Link>
コンポーネントには、以下のプロパティを渡すことができます:
プロパティ | 例 | タイプ | 必須 |
---|---|---|---|
href | href="/dashboard" | 文字列またはオブジェクト | はい |
replace | replace={false} | 論理値 | - |
scroll | scroll={false} | 論理値 | - |
prefetch | prefetch={false} | 論理値 | - |
legacyBehavior | legacyBehavior={true} | 論理値 | - |
passHref | passHref={true} | 論理値 | - |
shallow | shallow={false} | 論理値 | - |
locale | locale="fr" | 文字列または論理値 | - |
補足:
className
やtarget="_blank"
などの<a>
タグ属性は、<Link>
にプロパティとして追加でき、基礎となる<a>
要素に渡されます。
href
(必須)
移動先のパスまたはURL。
replace
デフォルトは false
。 true
の場合、next/link
はブラウザの履歴スタックに新しいURLを追加する代わりに、現在の履歴状態を置き換えます。
scroll
デフォルトは true
。 Next.jsの <Link>
のデフォルトのスクロール動作は、ブラウザの戻る・進む操作と同様にスクロール位置を維持することです。新しいページに移動する際、ページがビューポート内に表示されている限り、スクロール位置は同じままです。ただし、ページがビューポート内に表示されていない場合、Next.jsは最初のページ要素の先頭にスクロールします。
scroll = {false}
の場合、Next.jsは最初のページ要素へのスクロールを試みません。
prefetch
プリフェッチは、<Link />
コンポーネントがユーザーのビューポート内に入ったとき(最初またはスクロール中)に発生します。Next.jsは、クライアントサイドのナビゲーション性能を向上させるために、リンクされたルート(href
で示される)とそのデータをバックグラウンドでプリフェッチおよび読み込みます。プリフェッチは本番環境でのみ有効になります。
prefetch
プロップには、以下の値を渡すことができます:
true
(デフォルト): 完全なルートとそのデータがプリフェッチされます。false
: ビューポート内に入っても、プリフェッチは行われませんが、ホバー時にプリフェッチが発生します。ホバー時のフェッチを完全に無効にしたい場合は、<a>
タグを使用するか、段階的に App Router を採用することを検討してください。これにより、ホバー時のプリフェッチも無効にできます。
legacyBehavior
<Link>
の子として <a>
要素は不要になりました。従来の動作を使用する場合は legacyBehavior
プロップを追加するか、アップグレードするために <a>
を削除してください。コードを自動的にアップグレードするための codemod が利用可能です。
補足:
legacyBehavior
がtrue
に設定されていない場合、className
、onClick
などのすべてのanchor
タグのプロパティをnext/link
に渡すこともできます。
passHref
Link
に href
プロパティを子に強制的に送信させます。デフォルトは false
です。詳細は関数コンポーネントの入れ子の例を参照してください。
scroll
ナビゲーション後にページの先頭にスクロールします。デフォルトは true
です。
shallow
getStaticProps
、getServerSideProps
、または getInitialProps
を再実行せずに、現在のページのパスを更新します。デフォルトは false
です。
locale
アクティブなロケールは自動的に先頭に付加されます。locale
は異なるロケールを指定できます。false
の場合、デフォルトの動作が無効になるため、href
にロケールを含める必要があります。
例
以下の例は、異なるシナリオでの <Link>
コンポーネントの使用方法を示しています。
動的ルートセグメントへのリンク
動的ルートセグメントの場合、リンクのパスを作成するためにテンプレートリテラルを使用すると便利です。
例えば、動的ルート pages/blog/[slug].js
へのリンクのリストを生成できます。
子要素がアンカータグをラップするカスタムコンポーネントの場合
Link
の子要素が<a>
タグをラップするカスタムコンポーネントの場合、Link
にpassHref
を追加する必要があります。これは、styled-componentsのようなライブラリを使用する際に必要です。これがないと、<a>
タグがhref
属性を持たず、サイトのアクセシビリティに悪影響を与え、SEOにも影響する可能性があります。ESLintを使用している場合、passHref
の正しい使用を保証するための組み込みルールnext/link-passhref
があります。
- emotionのJSXプラグマ機能(
@jsx jsx
)を使用している場合、直接<a>
タグを使用してもpassHref
を使用する必要があります。 - コンポーネントは、ナビゲーションを正しくトリガーするために
onClick
プロパティをサポートする必要があります。
関数コンポーネントのネスト
Link
の子要素が関数コンポーネントの場合、passHref
とlegacyBehavior
を使用することに加えて、コンポーネントをReact.forwardRef
でラップする必要があります:
URLオブジェクトの受け渡し
Link
はURLオブジェクトも受け取ることができ、自動的にURL文字列を作成します:
上記の例には以下のリンクがあります:
- 定義済みのルート:
/about?name=test
- 動的ルート:
/blog/my-post
Node.js URLモジュールのドキュメントで定義されているすべてのプロパティを使用できます。
URLを置き換える代わりにプッシュ
Link
コンポーネントのデフォルトの動作は、新しいURLをhistory
スタックにpush
することです。replace
プロパティを使用して、新しいエントリの追加を防ぐことができます:
ページ上部へのスクロール無効化
Link
のデフォルトの動作は、ページ上部にスクロールすることです。ハッシュが定義されている場合、通常の<a>
タグのように、特定のIDにスクロールします。上部/ハッシュへのスクロールを防ぐには、Link
にscroll={false}
を追加できます:
Middlewareでのリンクプリフェッチ
Middlewareを認証やその他の目的で使用して、ユーザーを別のページに書き換えることは一般的です。<Link />
コンポーネントが中間件を介したリライト付きのリンクを適切にプリフェッチするには、表示するURLとプリフェッチするURLの両方をNext.jsに伝える必要があります。これは、プリフェッチする正しいルートを知るために、中間件への不要なフェッチを避けるために必要です。
例えば、認証済みとゲスト用のビューを持つ/dashboard
ルートを提供する場合、以下のようにMiddlewareでユーザーを正しいページにリダイレクトできます:
この場合、<Link />
コンポーネントでは以下のコードを使用します:
補足: 動的ルートを使用している場合、
as
とhref
のプロップを適応させる必要があります。たとえば、中間件を介して異なるように表示したい/dashboard/authed/[user]
のような動的ルートがある場合、<Link href={{ pathname: '/dashboard/authed/[user]', query: { user: username } }} as="/dashboard/[user]">プロフィール</Link>
と記述します。
バージョン履歴
バージョン | 変更点 |
---|---|
v13.0.0 | 子<a> タグが不要になりました。コードベースを自動的に更新するためのcodemodが提供されています。 |
v10.0.0 | 動的ルートを指すhref プロップは自動的に解決され、as プロップが不要になりました。 |
v8.0.0 | プリフェッチのパフォーマンスが改善されました。 |
v1.0.0 | next/link が導入されました。 |