Reactでコンポーネントを設計している際、値が空のときはPropsのキー自体を渡したくない(undefinedを渡したくない)場面がありました。 例えば、HTML属性に余計な属性を付与したくない場合や、子コンポーネント側でdefaultPropsを適用させたい場合です。

論理演算子とスプレッド構文を組み合わせることで、簡潔に条件付き展開が可能です。

基本構文

{...(条件 && { キー名:  })}

実践的なコード例

関数コンポーネント

user_idが存在する場合のみ、子コンポーネントへ渡します。

const Parent = () => {
  const user_id = "12345";

  return (
    <Child 
      {...(user_id && { user_id })} 
    />
  );
};

子コンポーネントでの受け取り方

const Child = ({ user_id = "default_id" }) => {
  return <div>{user_id}</div>;
};

なぜuser_id={user_id}ではいけないのか

通常、user_id={user_id}と記述すると、user_id が空の場合はuser_id={undefined}として渡ります。 しかし、このスプレッド構文の手法を使うと、条件が偽のときはオブジェクトの展開が行われないため、子コンポーネント側にはuser_idというキー自体が渡りません。 これにより、子コンポーネント側で設定しているデフォルト値(Default Parameters)を正しく機能させることができます。

クラスコンポーネントでの記述

class Parent extends React.Component {
  render() {
    const { user_id } = this.props;

    return (
      <Child 
        {...(user_id && { user_id })} 
      />
    );
  }
}

この記事のまとめ

この記述方法は、複数のオプション引数を持つUIコンポーネント(ボタンや入力フォームなど)をラップする際に、コードをスッキリ保つのに役立ちます。