React初心者が混乱する 「dataはどこから来るの?」をPropsで理解する
ReactやNext.jsのコードを読んでいると、
<Article data={data} />という記述のあとに、
function Article({ data })が出てくることがあります。
どちらにも同じdataが書かれていますが、
このdataはどこで作られ、どのように渡されているのでしょうか。
今回はPropsの基本を、親から子へ値が移動する流れと一緒に整理します。
dataはどこから来るの?
Next.jsのコードを勉強していると、 次のようなコンポーネントを見かけることがあります。
function Article({ data }) {
return (
<article>
<h2>{data.title}</h2>
<p>{data.description}</p>
</article>
);
}
このコードだけを見ると、
dataが突然現れたように見えます。
このdataは、どこで作られたの?
Article関数の中ではdataを作っていません。
importもしていません。
それなのに、なぜdata.titleを表示できるのでしょうか。
答えは、 Articleコンポーネントを呼び出している親コンポーネントから渡されている です。
<Article data={data} />
Reactでは、このようにコンポーネントへ値を渡す仕組みを Propsと呼びます。
Propsとは?
Propsは、 親コンポーネントから子コンポーネントへ値を渡す仕組み です。
HTMLタグの属性に少し似ていますが、 文字列だけでなく、数値、真偽値、配列、 オブジェクト、関数、JSXなども渡せます。
例えば、通常のHTMLでは画像タグへ
srcやaltを指定します。
<img
src="/images/photo.jpg"
alt="記事の写真"
/>
Reactのコンポーネントでも、 見た目の似た書き方で値を渡せます。
<Article
title="Propsの基本"
description="値の渡し方を解説します"
/>
title"Propsの基本"description"値の渡し方を解説します"JSXでコンポーネントへ付けた属性が、 子コンポーネントではPropsとして受け取られます。
親と子のコンポーネントとは?
Propsを理解するためには、 親コンポーネントと子コンポーネントの関係を確認すると分かりやすくなります。
function BlogPage() {
return (
<main>
<h1>ブログ</h1>
<Article />
</main>
);
}
このコードでは、
BlogPageの中で
Articleを使用しています。
呼び出す側が親コンポーネント、 呼び出される側が子コンポーネントです。
値を用意して、子へ渡します。
受け取った値を使って画面を作ります。
最初のdataはどこで作られる?
子コンポーネントへ渡す前に、 親コンポーネント側で元になるdataを用意します。
まずは、親コンポーネントの中で オブジェクトを作る簡単な例を見てみます。
function BlogPage() {
const data = {
title: "Propsの基本",
description:
"親から子へ値を渡す仕組みです",
};
return <main>ブログ</main>;
}
ここでのdataは、
通常のJavaScriptの変数です。
{
title: "Propsの基本",
description:
"親から子へ値を渡す仕組みです"
}
変数名は必ずdataでなければならないわけではありません。
const article = {
title: "Propsの基本",
description:
"親から子へ値を渡す仕組みです",
};
dataはReactが特別に用意する予約語ではありません。 開発者が付けた普通の変数名です。
Articleへdataを渡す
親コンポーネントで作ったdataを、 Articleコンポーネントへ渡します。
function BlogPage() {
const data = {
title: "Propsの基本",
description:
"親から子へ値を渡す仕組みです",
};
return (
<main>
<Article data={data} />
</main>
);
}
特に混乱しやすいのが、 次の一行です。
左側と右側は、同じ文字でも役割が違います。
data=
子へ渡すときの名前
{data}
実際に渡す変数
Props名と変数名を変えると、 役割の違いがさらに分かりやすくなります。
const article = {
title: "Propsの基本",
};
return (
<Article data={article} />
);
この場合は、
親のarticleという変数を、
子にはdataというProps名で渡しています。
子コンポーネントでdataを受け取る
親から渡されたPropsは、 子コンポーネントの関数の引数として受け取れます。
propsオブジェクトとして受け取る
function Article(props) {
return (
<article>
<h2>{props.data.title}</h2>
<p>{props.data.description}</p>
</article>
);
}
親でdata={data}と渡したため、
子ではprops.dataに値が入ります。
{
data: {
title: "Propsの基本",
description:
"親から子へ値を渡す仕組みです"
}
}
分割代入でdataだけを受け取る
よく使われるのが、 関数の引数で分割代入する書き方です。
function Article({ data }) {
return (
<article>
<h2>{data.title}</h2>
<p>{data.description}</p>
</article>
);
}
props.data.title
data.title
function Article({ data })の
波括弧は、Propsの中からdataだけを取り出す分割代入です。
値が移動する流れを図で確認
ここまでのコードを、 dataが移動する順番で整理します。
const data = {...}
<Article data={data} />
function Article({ data })
{data.title}
function BlogPage() {
const data = {
title: "Propsの基本",
description:
"親から子へ値を渡す仕組みです",
};
return (
<main>
<Article data={data} />
</main>
);
}
function Article({ data }) {
return (
<article>
<h2>{data.title}</h2>
<p>{data.description}</p>
</article>
);
}
オブジェクトをPropsで渡す
ブログ記事のように、 複数の情報をまとめて渡したい場合は オブジェクトをPropsにすると便利です。
const data = {
id: "article-01",
title: "Propsの基本",
description:
"親から子へ値を渡します",
publishedAt: "2026-07-16",
};
親では、このオブジェクトを一つのPropsとして渡します。
<Article data={data} />
子では、受け取ったオブジェクトのプロパティを使います。
function Article({ data }) {
return (
<article>
<h2>{data.title}</h2>
<p>{data.description}</p>
<time>{data.publishedAt}</time>
</article>
);
}
data.title
記事タイトル
data.description
記事の説明
data.publishedAt
公開日
値を個別にPropsで渡す方法
オブジェクトをまとめて渡さず、 値を個別のPropsとして渡すこともできます。
<Article
title="Propsの基本"
description="親から子へ値を渡します"
publishedAt="2026-07-16"
/>
function Article({
title,
description,
publishedAt,
}) {
return (
<article>
<h2>{title}</h2>
<p>{description}</p>
<time>{publishedAt}</time>
</article>
);
}
<Article data={data} />
記事データを一つのまとまりとして扱いやすい方法です。
<Article title={...} />
子が必要とする値を明示しやすい方法です。
どちらが必ず正しいというわけではありません。 コンポーネントの役割やデータの大きさに応じて選びます。
TypeScriptでPropsに型を付ける
TSXでは、Propsにどのような値が渡されるのかを TypeScriptの型として定義できます。
記事データの型を作る
type ArticleData = {
id: string;
title: string;
description: string;
publishedAt: string;
};
Propsの型を作る
type ArticleProps = {
data: ArticleData;
};
子コンポーネントへ型を付ける
type ArticleData = {
id: string;
title: string;
description: string;
publishedAt: string;
};
type ArticleProps = {
data: ArticleData;
};
export default function Article({
data,
}: ArticleProps) {
return (
<article>
<h2>{data.title}</h2>
<p>{data.description}</p>
<time>{data.publishedAt}</time>
</article>
);
}
Articleにはdataが必要だと確認できます。
titleは文字列など、データ形式が明確になります。
不足した値や違う型をエディターが知らせます。
microCMSのdataはどこから来る?
Next.jsとmicroCMSを組み合わせた場合、 親コンポーネントにあるdataは、 microCMSのAPIから取得した結果であることが多いです。
microCMSから記事を取得する
import { createClient } from "microcms-js-sdk";
export type ArticleData = {
id: string;
title: string;
description: string;
publishedAt: string;
};
const client = createClient({
serviceDomain:
process.env.MICROCMS_SERVICE_DOMAIN!,
apiKey:
process.env.MICROCMS_API_KEY!,
});
export const getArticle = async (
contentId: string
) => {
return client.getListDetail<ArticleData>({
endpoint: "blogs",
contentId,
});
};
ページで取得してArticleへ渡す
import Article
from "@/components/Article";
import { getArticle }
from "@/libs/microcms";
type Props = {
params: Promise<{
id: string;
}>;
};
export default async function BlogPage({
params,
}: Props) {
const { id } = await params;
const data = await getArticle(id);
return (
<main>
<Article data={data} />
</main>
);
}
Articleで受け取って表示する
import type {
ArticleData,
} from "@/libs/microcms";
type Props = {
data: ArticleData;
};
export default function Article({
data,
}: Props) {
return (
<article>
<h1>{data.title}</h1>
<p>{data.description}</p>
<time>{data.publishedAt}</time>
</article>
);
}
const data = await getArticle(id)
<Article data={data} />
function Article({ data })
microCMSを使う場合のdataは、 APIから返ってきた記事データを入れた変数です。
記事一覧でPropsを使う
microCMSから複数の記事を取得した場合は、
map()で一件ずつArticleへ渡せます。
export default async function BlogPage() {
const data = await getArticles();
return (
<main>
{data.contents.map((article) => (
<Article
key={article.id}
data={article}
/>
))}
</main>
);
}
このコードには、 dataに関連する名前が複数出てきます。
data
microCMSのレスポンス全体
data.contents
記事オブジェクトの配列
article
繰り返し中の一件の記事
data={article}
一件の記事をdataというProps名で渡す
Propsでよくあるつまずき
<Article data={article} />
function Article({ item })
親でdataという名前を付けた場合、
子でもdataとして受け取ります。
title="記事タイトル"
title={title}
JavaScriptの変数やオブジェクトを渡す場合は、 波括弧を使用します。
// propsとして受け取る
function Article(props) {
return <h2>{props.data.title}</h2>;
}
// 分割代入で受け取る
function Article({ data }) {
return <h2>{data.title}</h2>;
}
const data = {
title: "Propsの基本",
};
// data.descriptionは存在しない
<p>{data.description}</p>
Propsは親から受け取る読み取り専用の値として扱います。 子側で直接変更しません。
// 子で直接変更しない
data.title = "別のタイトル";
keyはReactが一覧管理に使う特別な値で、
子コンポーネントへ通常のPropsとして渡されません。
<Article
key={article.id}
articleId={article.id}
data={article}
/>
Propsの流れをもう一度整理
親コンポーネントに、 子へ渡したい値を用意します。
左側がProps名、 右側が実際に渡す変数です。
Propsオブジェクトから dataを分割代入しています。
受け取った値を使って コンポーネントの画面を作ります。
まとめ:dataは親からPropsで渡されている
function Article({ data })に出てくるdataは、
Articleコンポーネントの中で突然作られた値ではありません。
親コンポーネントが、
<Article data={data} />と書いて
Propsとして渡した値です。
今回覚えておきたいこと
- Propsは親コンポーネントから子へ値を渡す仕組み
- dataはReactの予約語ではなく普通の変数名
-
<Article data={data} />の左側はProps名 -
右側の
{data}は親にある変数 - 子では関数の引数としてPropsを受け取る
-
function Article({ data })は分割代入 - microCMSの場合、dataはAPIの取得結果であることが多い
- Propsは子側で直接書き換えない
function BlogPage() {
const data = {
title: "Propsの基本",
description:
"親から子へ値を渡します",
};
return (
<Article data={data} />
);
}
function Article({ data }) {
return (
<article>
<h2>{data.title}</h2>
<p>{data.description}</p>
</article>
);
}
最初は、同じdataという名前が何度も出てくるため、 値がどこから来たのか分かりにくく感じます。
けれど、 「親で作る」「Propsとして渡す」「子で受け取る」 という順番に分けると、コードの流れが見えやすくなりました。
親コンポーネントからPropsで届いています。