🖥️
Next.js入門2 コンポーネント
記事一覧
- Next.js × Docker 最速環境構築
- Next.js入門1 ページ追加
- Next.js入門2 コンポーネント
- Next.js入門3 無記名関数 & イベントハンドラー
- Next.js入門4 Hooks
- Next.js入門5 Todoアプリ(タスク一覧)
- Next.js入門6 Todoアプリ(タスク追加)
- Next.js入門7 Todoアプリ(タスク詳細)
- Next.js入門8 Todoアプリ(タスク編集, 削除)
コンポーネント
コンポーネントとは
- UIの一部を切り出したもの
(複数箇所で使い回すことができる)
ファイル作成
- 今回はボタン用のコンポーネントを作る
-
components/tag.tsx
を作成
.
├── next-app
│ ├── app
│ └── components
│ └── tag.tsx # ここに作成
├── docker-compose.yml
└── Dockerfile
-
tag.tsx
に記述
(ほとんどpage.tsxと同じ)
- tag.tsx
// export function コンポーネント名
export function Tag() {
return (
<div className="w-fit p-3 rounded-xl border font-bold">
タグ
</div>
);
}
-
app/top/page.tsx
を編集
- page.tsx
// @はプロジェクトのrootを表している
// import { コンポーネント名 } from "パス"
import { Tag } from "@/components/tag";
function Page() {
return (
<div>
<p>タグコンポーネント</p>
{/* タグのように呼び出す */}
<Tag></Tag>
</div>
);
}
export default Page;
-
http://localhost:3000/topにアクセスして以下のような画面が出ればOK
属性
コンポーネントでは属性を使用することができます。
-
components/tag.tsx
を編集
- tag.tsx
// TypeScriptで属性の型を定義
type Props = {
color: string;
backgroundColor: string;
};
// 引数として属性を受け取り、型を定義する
export function Tag({ color, backgroundColor }: Props) {
return (
<div
className="w-fit p-3 rounded-xl border font-bold"
// styleで文字色と背景色に反映させる
style={{
color: color,
backgroundColor: backgroundColor
}}
>
タグ
</div>
);
}
-
app/top/page.tsx
を編集
- page.tsx
import { Tag } from "@/components/tag";
function Page() {
return (
<div>
<p>タグコンポーネント</p>
{/* 属性を渡す */}
<Tag
color="#0000ff"
backgroundColor="#ddddff"
></Tag>
</div>
);
}
export default Page;
-
http://localhost:3000/topにアクセスして以下のような画面が出ればOK
子要素
コンポーネントでは子要素を使用するとこができます。
-
components/tag.tsx
を編集
- tag.tsx
type Props = {
color: string;
backgroundColor: string;
// childrenという名前で子要素を受け取ることができる
// 子要素はReactNode型
children: React.ReactNode;
};
export function Tag({ color, backgroundColor, children }: Props) {
return (
<div
className="w-fit p-3 rounded-xl border font-bold"
style={{
color: color,
backgroundColor: backgroundColor
}}
>
{/* 子要素を表示 */}
{children}
</div>
);
}
-
app/top/page.tsx
を編集
- page.tsx
import { Tag } from "@/components/tag";
function Page() {
return (
<div>
<p>タグコンポーネント</p>
<Tag color="#0000ff" backgroundColor="#ddddff">
{/* svgアイコン子要素として渡す */}
<svg
xmlns="http://www.w3.org/2000/svg"
height="24px"
viewBox="0 -960 960 960"
width="24px"
fill="currentColor"
>
<path d="M856-390 570-104q-12 12-27 18t-30 6q-15 0-30-6t-27-18L103-457q-11-11-17-25.5T80-513v-287q0-33 23.5-56.5T160-880h287q16 0 31 6.5t26 17.5l352 353q12 12 17.5 27t5.5 30q0 15-5.5 29.5T856-390ZM513-160l286-286-353-354H160v286l353 354ZM260-640q25 0 42.5-17.5T320-700q0-25-17.5-42.5T260-760q-25 0-42.5 17.5T200-700q0 25 17.5 42.5T260-640Zm220 160Z" />
</svg>
</Tag>
</div>
);
}
export default Page;
- http://localhost:3000/topにアクセスして以下のような画面が出ればOK
Discussion