AppRouter入門
Invalid <Link>
with <a>
child
Next.js 13 の <Link> は、内部的には <a> タグとしてレンダリングされるため、<Link> の中に <a> タグをネストすると、<a> タグが二重にネストされてしまい、無効な HTML となってしまいます。
=> aタグを消せばok
AppRouterの本を読んだので実際に使っていく
Linkとは
Linkコンポーネントを使うと、クライアント再度でナビゲーションができる
プリフェッチと、キャッシュする
ユーザーが新しいルートに移動しても、ブラウザはページを再読み込みせず、変更されたルートセグメントのみが再レンダリングされます。
aタグの代わりに使えばok
childrenとしてタイトルなどを渡せば良い
generateStaticParamsとは
generateStaticParams 関数を動的なルートセグメントと組み合わせて使うことで、リクエスト時にオンデマンドでルートを生成するのではなく、ビルド時に静的にルートを生成することができます。
つまり、ビルド時にすでにDynamicRouteをすべて生成しておく!新しくAPIに追加しても意味がない
以下3パターンが可能
Example Route | generateStaticParams Return Type |
---|---|
/product/[id] | { id: string }[] |
/products/[category]/[product] | { category: string, product: string }[] |
/products/[...slug] | { slug: string[] }[] |
じゃあ、コンテンツが追加された時はどうすればいいんだろう
=> まだわからぬ
<div dangerouslySetInnerHTML={{ __html: content.body }}></div>
こうではなく、 <div dangerouslySetInnerHTML={{ __html: content.body }} />
とする理由
<div /> のように自己閉じタグを使用する場合は、子要素を持ちません。これは、Reactがその要素に内容がないこと
useRouter
pathname はルートパスのみ(クエリパラメータなし)を取得するのに対して、asPath はクエリパラメータやハッシュを含む完全なパスを取得。
特定のルートに基づいて条件分岐をしたい場合は pathname を使い、ユーザーがアクセスしている正確なURLを取得したい場合は asPath を使うと良い
ただし、DynamicRouteの場合は以下のようになる
URL: https://example.com/blog/123
pathname: /blog/[id]
asPath: /blog/123
/pages
└─ /blog
└─ [id].js
補足
/posts/123?id=456
gsspのctx.queryでは
/posts/123?id=456
となる
router.push()
Dynamic Routingの実装がまだ怪しい
Next.jsではルート間を移動する方法が4つあります。
- Linkコンポーネント
- useRouterフック(クライアントコンポーネントでのみ使用可能)
- redirect(サーバーコンポーネントでのみ使用可能)
- History API
勘違いしていたDynamic Route
// `app/blog/[slug]/page.js`
// Return a list of `params` to populate the [slug] dynamic segment
export async function generateStaticParams() {
const posts = await fetch("https://.../posts").then((res) => res.json());
return posts.map((post) => ({
slug: post.slug,
}));
}
// Multiple versions of this page will be statically generated
// using the `params` returned by `generateStaticParams`
export default function Page({ params }) {
const { slug } = params;
// ...
}
動的ルートセグメント名[slug]や[xxx]のこのxxxの部分が、paramsに入るようになっているのに気づかなかった
[id]としながらslugに代入しようとしてて詰まった
そもそもなんで
generateStaticParams()関数を使うのか?
generateStaticParams 関数を動的なルートセグメントと組み合わせて使うことで、リクエスト時にオンデマンドでルートを生成するのではなく、ビルド時に静的にルートを生成することができます。
つまりビルド時に静的ルートを作ることで
- パフォーマンスの向上
事前生成: generateStaticParams()を使用することで、ビルド時に静的なページを事前に生成する。これにより、ユーザーがページをリクエストしたときにサーバーでの処理が不要になる!
generateStaticParams:
この関数は、静的に生成されるページに必要なパラメータを提供するために使用されます。
この関数が返すのは、動的ルートに対応するパスのリスト(配列)で、各要素はオブジェクトです。
params:
paramsは、Next.jsが特定の動的ルートにアクセスされたときに、そのルートに関連するパラメータを表す単一のオブジェクトです。
[slug]/page.tsxの場合、
たとえば、/blog/post-1にアクセスした場合、paramsには次のような内容が含まれます