ikuma-t.

登壇 登壇 検索

Reactのchildrenとはなにか

要約

Reactのchildrenpropsが保持しているプロパティです。親コンポーネントのタグに入れられた要素を参照します。

Reactナニモワカラナイ

いままでVueとVanila JSしか触ってこなかったので、現在TypeScriptとReactのキャッチアップをしているのですが、まずはTypeScriptに時間を割いているためReactはちょっと後回し気味です(のわりにDenoやってるやんけワレ)。一応チュートリアルくらいはやっています。

いやでもReact と TSが目につくようにこのブログはNext.js + TypeScriptで作成しているのですが、カスタマイズにあたってReactの初歩的な知識でつまづいたのでまとめます。

Reactのchildren

対象バージョン

  • React v18.0

意味

Reactのchildrenpropsが保持しているプロパティです。親コンポーネントのタグに入れられた要素を参照します。

例えばこのブログでは共通レイアウトをLayoutコンポーネントで定義しています。

type Props = {
children: React.ReactNode
}
const Layout = ({ children }: Props) => {
return (
<>
<Meta />
<div className="min-h-screen flex flex-col">
<main className="flex-1">{children}</main>
<Footer />
</div>
</>
)
}

Layoutコンポーネントは各所で使用されており、一例としてブログのトップページを示すpages/index.tsxでは次のように呼び出されています。

const Index = ({ allPosts }: Props) => {
const morePosts = allPosts
return (
<>
<Layout>
<Head>
<title>ikuma-t</title>
</Head>
<Container>
<Intro />
{<MoreStories posts={morePosts} />}
</Container>
</Layout>
</>
)
}

この時、<Layout> ~ </Layout>の間の部分がchildrenとなります。

<Head>
<title>ikuma-t</title>
</Head>
<Container>
<Intro />
{<MoreStories posts={morePosts} />}
</Container>

Layoutコンポーネントでは最終的に次のような内容が描画されます。

<div>
<Meta />
<div className="min-h-screen flex flex-col">
<main className="flex-1">
{// ここからchildrenの内容が描画されている}
<Head>
<title>ikuma-t</title>
</Head>
<Container>
<Intro />
{<MoreStories posts={morePosts} />}
</Container>
{// ここまでchildrenの内容が描画されている}
</main>
<Footer />
</div>
</div>

childrenの型

先のサンプルコードの通り、childrenの型はReact.ReactNodeです。 どうもv18から仕様が変わったようで、明示的に型を指定していない状態でprops.childrenを使用すると、エラーになるようになったそうです。

参考:https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html#updates-to-typescript-definitions


おわり

ikuma-t

ikuma-t

about

9割笑顔、1割 (´・ω・)