Reactのpropsの渡し方と型の付け方

に公開

最近Reactのコードを書いていて親から子へのpropsの渡し方って色々あるなと思いまとめてみました。
多分他にも色んな渡し方があると思うので随時更新していきます。

前提として親コンポーネント(App.tsx)から子コンポーネント(Home.tsx)へ

const user = {
  name: "tanaka",
  age: 25,
};


このuserのデータを渡すという前提で考えます。

・(1)userの情報を分けて渡す


親コンポーネント(App.tsx)

// userを用意
const user: Props = {
  name: "Tanaka",
  age: 25,
};

// userの型を用意。exportさせておく
export type Props = {
  name: string;
  age: number;
};

/* 
  子のコンポーネントへuser.nameとuser.ageをそれぞれ
  "name""age"として分けて渡す
*/
export default function App() {
  return (
    <>
      <Home name={user.name} age={user.age}  />
    </>    
  )
}


子コンポーネント(Home.tsx)

// 型をimportしておく
import { Props } from "../App";

export const Home = ({ name,  age }: Props) => {
  return (
    <>
      <p>{name}</p>
      <p>{age}</p>
    </>
  )
}; 


これで画面上には
Tanakaと25が表示されます。
個人的にはこの形が好みです。

・(2)userの情報を一括で渡す

続いてこちらは親のコンポーネントから一気にuserオブジェクトを渡す方法です。

親コンポーネント(App.tsx)

// userを用意
const user: Props = {
  name: "Tanaka",
  age: 25,
};

// userの型を用意。exportさせておく
export type Props = {
  name: string;
  age: number;
};

/* 
  user={user}で一気に渡す
*/
export default function App() {
  return (
    <>
      <Home user={user}  />
    </>    
  )
}


子コンポーネント(Home.tsx)

import { Props } from "../App";

/* 
   オブジェクトがネストされて渡ってきているため
   さらに型を用意します。
*/
type HomeProps = {
  user: Props;
};

export const Home = ({ user }: HomeProps) => {
  // user.name user.ageとして使用可能
  return (
    <>
      <p>{user.name}</p>
      <p>{user.age}</p>
    </>
  );
};


新たに型を用意しないといけないのが手間ですね。

・(3)userの情報の中身を一括で渡す

(2)では、

user={user}


の形で一気渡していたため、ネストされたオブジェクトになっていました。
これをクリアすべくオブジェクトの中身を一気に渡すパターンも紹介します。

親コンポーネント(App.tsx)

// userを用意
const user: Props = {
  name: "Tanaka",
  age: 25,
};

// userの型を用意。exportさせておく
export type Props = {
  name: string;
  age: number;
};

/* 
    {...user}でプロパティのみを渡す
*/
export default function App() {
  return (
    <>
      <Home {...user} />    
    </>    
  )
}


子コンポーネント(Home.tsx)

import { Props } from "../App";

export const Home = ({ name, age }: Props) => {
  return (
    <>
      <p>{name}</p>
      <p>{age}</p>
    </>
  );
};


こっちの方が(2)よりもシンプルに記述できる。