paramsって何?URLとの関係を初心者向けに図で解説


Next.js・microCMS 初心者ノート

paramsって何? URLとの関係を初心者向けに図で解説

paramsって何?URLとの関係を初心者向けに図で解説

Next.jsを勉強していると、突然出てくる paramsという言葉。
コードを見るとparams.slugや params.idと書かれていますが、 どこからその値が入ってくるのか、最初はよく分かりませんでした。
今回はURLとフォルダ構成を見比べながら、 paramsの役割を一つずつ整理します。

Next.js 16 App Router params 動的ルーティング microCMS 初心者向け
01

paramsという言葉が分からなかった

Next.jsとmicroCMSを使ったブログを勉強していると、 記事詳細ページのコードで paramsという名前が出てきました。

記事詳細ページで見かけたコード
export default async function Page({
  params,
}: Props) {
  const { slug } = await params;

  return <p>{slug}</p>;
}

コードの形は何となく読めても、 最初は次の部分がよく分かりませんでした。

?

paramsは、どこから来たの?

自分で変数を作った覚えがありません。
なぜslugがparamsの中にあるのでしょうか。
URLと何か関係があるのでしょうか。

実際には、paramsはNext.jsがページへ渡してくれる値です。

そして、その中身は フォルダ名とURLの形によって決まります。

✿

paramsを理解するときは、 コードだけを見るよりも、
URL・フォルダ構成・paramsの中身を 3つ並べて見ると分かりやすくなりました。

02

paramsとは何?

paramsは、 parameterを短くした名前としてよく使われます。

Next.jsのApp Routerでは、 URLの動的な部分をページ内で受け取るために使います。

params
URLの動的な部分から受け取った値

ページごとに変わるURLの一部分を、 オブジェクトとしてまとめたものです。

例えば、ブログの記事詳細ページに 次のようなURLがあるとします。

URL https://example.com/blog/html-and-tsx

このURLの中で、 html-and-tsxの部分は 表示する記事によって変わります。

固定部分 /blog/
+
動的部分 html-and-tsx

この動的部分をNext.jsが読み取り、 paramsの中へ入れてページに渡してくれます。

URL /blog/html-and-tsx
›
Next.js 動的部分を読み取る
›
params { slug: “html-and-tsx” }
POINT

paramsは、URL全体ではなく、 角括弧で指定した動的な部分を受け取ります。

03

まずは固定URLを見てみる

動的ルーティングを理解する前に、 通常の固定ページを見てみます。

例えば、会社概要ページを /aboutというURLで表示したい場合、 次のようなフォルダを作ります。

固定ページのフォルダ構成
src
└── app
    └── about
        └── page.tsx
フォルダ app/about/page.tsx
→
URL /about

aboutというフォルダ名が、 そのままURLの一部分になります。

このページは常に/aboutで表示されるため、 URLの一部が記事によって変わることはありません。

固定ルート フォルダ名とURLがそのまま対応する

aboutフォルダなら/about、 contactフォルダなら/contactになります。

04

動的ルーティングとは?

ブログの記事詳細ページでは、 記事ごとにURLの最後が変わります。

記事1 /blog/html-and-tsx
記事2 /blog/nextjs-basic
記事3 /blog/microcms-start

これらの記事ごとに、 次のようなフォルダを一つずつ作ることもできます。

記事ごとにフォルダを作る場合
src
└── app
    └── blog
        ├── html-and-tsx
        │   └── page.tsx
        ├── nextjs-basic
        │   └── page.tsx
        └── microcms-start
            └── page.tsx

しかし、記事が100件になれば、 100個のフォルダを作ることになります。

microCMSで記事を追加するたびに Next.js側へ新しいフォルダを作るのも現実的ではありません。

そこで使うのが、 動的ルーティングです。

動的ルーティングを使った場合
src
└── app
    └── blog
        └── [slug]
            └── page.tsx

[slug]というフォルダが、 さまざまな記事URLをまとめて受け取ります。

/blog/html-and-tsx /blog/nextjs-basic /blog/microcms-start
→
すべて同じページで受け取る app/blog/[slug]/page.tsx
動的ルート

URLの一部がページごとに変わるときは、 フォルダ名を角括弧で囲みます。

05

[slug]とparamsの関係

それでは、 [slug]フォルダがどのようにparamsへつながるのか 見てみます。

1.フォルダ app/blog/[slug]/page.tsx
›
2.URL /blog/html-and-tsx
›
3.params { slug: "html-and-tsx" }

角括弧の中にslugと書いたため、 paramsのプロパティ名もslugになります。

app/blog/[slug]/page.tsx
type Props = {
  params: Promise<{
    slug: string;
  }>;
};

export default async function BlogPage({
  params,
}: Props) {
  const { slug } = await params;

  return (
    <main>
      <h1>記事詳細ページ</h1>
      <p>現在のslug:{slug}</p>
    </main>
  );
}

URLが/blog/html-and-tsxなら、 画面には次のように表示されます。

https://example.com/blog/html-and-tsx

記事詳細ページ

現在のslug:html-and-tsx

覚え方

[slug]の中へ入ったURLの値を、 params.slugとして受け取るイメージです。

06

[id]の場合はどうなる?

角括弧の中は、 必ずslugでなければいけないわけではありません。

商品詳細ページやmicroCMSのコンテンツIDを使う場合は、 [id]という名前もよく使われます。

商品詳細ページの例
src
└── app
    └── products
        └── [id]
            └── page.tsx
フォルダ [id]
›
URL /products/abc123
›
params { id: "abc123" }
app/products/[id]/page.tsx
type Props = {
  params: Promise<{
    id: string;
  }>;
};

export default async function ProductPage({
  params,
}: Props) {
  const { id } = await params;

  return (
    <main>
      <h1>商品詳細</h1>
      <p>商品ID:{id}</p>
    </main>
  );
}
フォルダ名
URL例
paramsのプロパティ
[slug]
/blog/nextjs-basic
params.slug
[id]
/products/abc123
params.id
07

角括弧内の名前は自由に決められる

動的フォルダの名前は、 URLの値の意味が分かる名前を自分で決められます。

[slug] 記事やページの識別名

読みやすい文字列をURLに使う場合に向いています。

[id] IDで識別

データベースやCMSのコンテンツIDを使う場合に向いています。

[category] カテゴリ名

カテゴリごとの一覧ページなどに使えます。

[year] 年ごとのページ

年別アーカイブなどに使えます。

ただし、フォルダ名とparamsのプロパティ名は 必ず一致させます。

一致していない例
// フォルダは [id]

type Props = {
  params: Promise<{
    slug: string;
  }>;
};
→
一致している例
// フォルダは [id]

type Props = {
  params: Promise<{
    id: string;
  }>;
};
注意

フォルダが[id]なら params.id、 フォルダが[slug]なら params.slugです。

08

Next.js 16でのparamsの書き方

Next.js 16のApp Routerでは、 Server Componentへ渡されるparamsを Promiseとして受け取ります。

そのため、型にPromiseを付け、 await paramsで中身を取り出します。

現在の基本形

Next.js 16 動的ルートの基本形
type Props = {
  params: Promise<{
    slug: string;
  }>;
};

export default async function Page({
  params,
}: Props) {
  const { slug } = await params;

  return <p>{slug}</p>;
}
Promise<...>

paramsがあとで解決される値であることを型で表します。

async

関数内でawaitを使えるようにします。

await params

Promiseを解決し、実際のURLの値を取得します。

以前の書籍や記事で見かける形

以前 同期オブジェクトとして扱う例
type Props = {
  params: {
    slug: string;
  };
};

export default function Page({
  params,
}: Props) {
  return <p>{params.slug}</p>;
}
以前 params.slug
→
現在 const { slug } = await params
✿

paramsの役割自体は、 URLの動的な値を受け取ることです。
Next.js 16では、その値をPromiseから awaitして取り出す点が大切です。

09

microCMSの記事詳細ページでparamsを使う

microCMSの記事詳細ページでは、 URLから取得したIDやslugを使って、 表示する記事を指定します。

URL /blog/abc123
›
params { id: “abc123” }
›
microCMS abc123の記事を取得

microCMSから記事詳細を取得する関数

libs/microcms.ts
import { createClient } from "microcms-js-sdk";

export type Article = {
  id: string;
  title: string;
  content: string;
};

const client = createClient({
  serviceDomain:
    process.env.MICROCMS_SERVICE_DOMAIN!,
  apiKey:
    process.env.MICROCMS_API_KEY!,
});

export const getArticleDetail = async (
  contentId: string
) => {
  return client.getListDetail<Article>({
    endpoint: "blogs",
    contentId,
  });
};

paramsのidをmicroCMSへ渡す

記事詳細 app/blog/[id]/page.tsx
import {
  getArticleDetail,
} from "@/libs/microcms";

type Props = {
  params: Promise<{
    id: string;
  }>;
};

export default async function ArticlePage({
  params,
}: Props) {
  const { id } = await params;

  const article =
    await getArticleDetail(id);

  return (
    <main>
      <h1>{article.title}</h1>

      <div
        dangerouslySetInnerHTML={{
          __html: article.content,
        }}
      />
    </main>
  );
}
1
URLを開く

/blog/abc123

2
paramsからIDを取得

const { id } = await params

3
microCMSへIDを渡す

getArticleDetail(id)

4
記事を表示

titleやcontentをTSX内へ配置

POINT

paramsは記事データそのものではありません。 表示する記事をmicroCMSへ問い合わせるための IDやslugを受け取るものです。

10

複数階層を受け取るCatch-all Segment

通常の[slug]は、 URLの一つの階層だけを受け取ります。

app/blog/[slug]/page.tsx → /blog/nextjs

一方、ドキュメントサイトなどで、 複数階層のURLをまとめて受け取りたい場合があります。

1階層 /docs/nextjs
2階層 /docs/nextjs/routing
3階層 /docs/nextjs/routing/params

このような場合は、 角括弧の中へ...を付けた Catch-all Segmentを使用できます。

Catch-all Segment
src
└── app
    └── docs
        └── [...slug]
            └── page.tsx

この場合、paramsのslugは文字列ではなく、 文字列の配列になります。

app/docs/[…slug]/page.tsx
type Props = {
  params: Promise<{
    slug: string[];
  }>;
};

export default async function DocsPage({
  params,
}: Props) {
  const { slug } = await params;

  return (
    <main>
      <p>
        {slug.join(" / ")}
      </p>
    </main>
  );
}
URL
params.slug
/docs/nextjs
["nextjs"]
/docs/nextjs/routing
["nextjs", "routing"]
/docs/nextjs/routing/params
["nextjs", "routing", "params"]

初めてブログを作る段階では、 まず通常の[slug]や[id]を 理解できれば十分です。

11

paramsでよくあるつまずき

CHECK 01 フォルダを角括弧で囲んでいない

動的ルートにする場合は、 通常のslugではなく [slug]とします。

app/blog/slug/page.tsx → app/blog/[slug]/page.tsx
CHECK 02 フォルダ名とプロパティ名が違う

[id]ならparams.id、 [slug]ならparams.slugです。

CHECK 03 paramsをawaitしていない

Next.js 16では、 Server ComponentのparamsをPromiseとして受け取ります。

const { slug } = await params;
CHECK 04 ページ関数にasyncが付いていない

awaitを使うページ関数には asyncを付けます。

export default async function Page({
  params,
}: Props) {
  const { slug } = await params;
}
CHECK 05 URLの値とmicroCMSのIDが一致していない

/blog/abc123で開く場合、 microCMSにabc123というIDの記事が 存在するか確認します。

CHECK 06 paramsとsearchParamsを混同している

URLのパス部分はparams、 ?以降のクエリ文字列はsearchParamsです。

params /blog/nextjs
searchParams /blog?keyword=nextjs
✿

paramsで迷ったときは、 フォルダ名・URL・paramsのプロパティ名を 3つ並べて確認すると原因を見つけやすくなります。

12

URLとparamsの関係をもう一度整理

ここまでの内容を、 ブログの記事詳細ページを例にしてまとめます。

フォルダ構成 app/blog/[slug]/page.tsx

角括弧の名前が paramsのプロパティ名になる

↓
アクセスするURL /blog/html-and-tsx

[slug]の位置へ html-and-tsxが入る

↓
ページへ渡されるparams { slug: “html-and-tsx” }

Next.js 16ではPromiseを awaitして受け取る

↓
ページ内で使用 const { slug } = await params

記事取得や画面表示に利用する

13

まとめ:paramsはURLの動的な値

paramsは、 Next.jsの動的ルーティングでURLの一部分を受け取るための値です。

最初はコードだけを見ると分かりにくいですが、 URLとフォルダ構成を一緒に見ると、 どこから値が来ているのか理解しやすくなります。

今回覚えておきたいこと

  • paramsはURLの動的な部分を受け取る
  • 動的なフォルダは [slug]や[id]のように書く
  • 角括弧内の名前がparamsのプロパティ名になる
  • [slug]なら params.slugとして受け取る
  • [id]なら params.idとして受け取る
  • Next.js 16ではparamsをPromiseとして受け取る
  • Server Componentでは await paramsが必要
  • microCMSではparamsのIDやslugを記事取得に使う
最後に、この基本形を覚えておきます
type Props = {
  params: Promise<{
    slug: string;
  }>;
};

export default async function Page({
  params,
}: Props) {
  const { slug } = await params;

  return (
    <p>
      現在のslug:{slug}
    </p>
  );
}

paramsは特別なデータを作る仕組みではなく、 URLに含まれている値を ページで利用できる形にしてくれるものです。

フォルダ名、URL、paramsの3つをつなげて考えることで、 記事詳細ページの仕組みが少しずつ見えるようになりました。

Next.js・microCMS初心者の学習記録 角括弧の中に入ったURLの値が、
paramsとしてページへ渡されます。

AILPENGINE。自動進化型AI-LP。公開後も、成果に合わせて進化する! 行動計測、分析、構成改善、成果最大化。自前計測、CTA位置最適化、レポート可視化。LP改善を相談する(相談無料)。

日本ドラフトのAIチャットボットで問い合わせ対応を効率化・自動化!24時間365日対応、簡単設定、マルチプラットフォーム対応で人件費・工数を削減。今すぐ無料で相談する

※当社は、当サイトに掲載する情報について、正確性・完全性・有用性その他一切の事項を保証するものではありません。
また、当サイトの情報をご利用いただいたことにより生じた損害、ならびに当サイトからリンクまたはバナー等を通じて移動した外部サイトにおいて提供される情報・サービス等により生じた損害について、当社は一切の責任を負いかねます。