stock.dev
Next.jsの勉強会 vol.1 コンポーネント化

Next.jsの勉強会 vol.1 コンポーネント化

·3 min read

同じHTML構造が2回出てきたら、コンポーネント化のサイン

  • 同じ部分 → コンポーネントにする
  • 違う部分 → props で渡す

##コンポーネント化する

<article>が2つ出てきたので、ServiceCardコンポーネントを作ってみる。

<article className="mt-8 border border-zinc-200 bg-white p-6 shadow-sm">
   <h3 className="text-xl font-semibold">コーポレートサイト制作</h3>
   <p className="mt-4 leading-7 text-zinc-600">
   	会社の強みや問い合わせ導線を整理して、信頼感のあるWebサイトに仕上げます。
   </p>
</article>
 
<article className="mt-8 border border-zinc-200 bg-white p-6 shadow-sm">
   <h3 className="text-xl font-semibold">コーポレートサイト制作</h3>
   <p className="mt-4 leading-7 text-zinc-600">
   	会社の強みや問い合わせ導線を整理して、信頼感のあるWebサイトに仕上げます。
   </p>
</article>

下記のように書き換えて使うようにしたい。

 
<ServiceCard
  title="コーポレートサイト制作"
  description="会社の強みや問い合わせ導線を整理して、信頼感のあるWebサイトに仕上げます。"
/>
 
<ServiceCard
  title="LP制作"
  description="広告やキャンペーンの目的に合わせて、申し込みにつながるページを作ります。"
/>

propsを渡してコンポーネント化する。

function ServiceCard({
  title,
  description,
}: {
  title: string;
  description: string;
}) {
  return (
    <article className="mt-8 border border-zinc-200 bg-white p-6 shadow-sm">
      <h3 className="text-xl font-semibold">{title}</h3>
      <p className="mt-4 leading-7 text-zinc-600">{description}</p>
    </article>
  );
}

型に名前をつける

型を抜け出して、名前をつけることができる。

type ServiceCardProps = {
  title: string;
  description: string;
};
 
function ServiceCard({
  title,
  description,
}: ServiceCardProps) {
  return (
    <article className="mt-8 border border-zinc-200 bg-white p-6 shadow-sm">
      <h3 className="text-xl font-semibold">{title}</h3>
      <p className="mt-4 leading-7 text-zinc-600">{description}</p>
    </article>
  );
}

複数のデータを配列にする

下記はservices は ServiceCardProps(型) の配列ですの意味。

const services: ServiceCardProps[] = [
  {
    title: "コーポレートサイト制作",
    description:
      "会社の強みや問い合わせ導線を整理して、信頼感のあるWebサイトに仕上げます。",
    price: "80万円から",
  },
  {
    title: "LP制作",
    description:
      "広告やキャンペーンの目的に合わせて、申し込みにつながるページを作ります。",
    price: "35万円から",
  },
];

複数データからmapでJSX表示

mapを使うと、配列から複数のServiceCardを作ることができる。 それぞれのデータを識別するためにkeyが必要。

{services.map((service) => (
  <ServiceCard
	key={service.title}
	title={service.title}
	description={service.description}
	price={service.price}
  />
))}

下記のような省略記法もある。key以外は {...service}としてまとめてpropsに渡すことも可能。

{services.map((service) => (
  <ServiceCard
	key={service.title}
	{...service}
  />
))}