はじめてのReact #7「Propsのデフォルト値を設定しよう」

Props未指定の場合のデフォルト値の設定を行う場合に、便利な機能が用意されています。前回行ったデータ型の定義と同様に、連想配列(ハッシュ)を書いてあげるだけで実現できます。

コンストラクタでやれば良くね?というツッコミもありそうですがw Props未指定時に固定値を入れるだけのシンプルなケースの場合はスッキリかけるので便利だったりします。あとは決められた箇所にまとまっているとメンテナンス性も上がりますしね。

指定日までの日数を表示するComponent その3

前回のソースコードに、Propsのデフォルト値を設定するコードを追加しました。今回もこの機能はReact本体には含まれていないためライブラリ「prop-types」を追加している点にも注意してください。

これまでは以下のようにmessage属性を指定していましたが、今回はわざとこれを外しています。

ReactDOM.render(
  <RemainTime date="2112-09-03 00:00:00" message="ドラえもん誕生" />,
  document.getElementById('root')
);

サンプル

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8" />
  <title>RemainTime</title>
  <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
  <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>

  <!-- 型定義とデフォルト値設定のためライブラリを追加 -->
  <script src="https://unpkg.com/prop-types@15.6/prop-types.js"></script>

  <!-- Don't use this in production: -->
  <script src="https://unpkg.com/babel-standalone@6.15.0/babel.min.js"></script>
</head>
<body>
  <div id="root"></div>

  <script type="text/babel">
    class RemainTime extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          now: new Date().getTime(),
          target: new Date(props.date).getTime()
        };
      }

      render() {
        let remain = Math.floor( ( this.state.target - this.state.now ) / (1000 * 60 * 60 * 24) );
        return <h1>{this.props.message}まで約{remain}日</h1>;
      }
    }

    /**
     * Propsの型定義
     */
    RemainTime.propTypes = {
         date: PropTypes.string,
      message: PropTypes.string
    };

    /**
     * Propsのデフォルト値
     */
    RemainTime.defaultProps = {
      message: "Xデー"
    };

    ReactDOM.render(
      <RemainTime date="2112-09-03 00:00:00" />,
      document.getElementById('root')
    );
  </script>
</body>
</html>

実行結果

Propsのmessageが指定されていないため、デフォルト値が採用されました。ReactDOM.render()で再びmessage属性を指定するとそちらが採用されます。

解説

デフォルト値の設定

今回は非常にシンプルでしたね。defaultPropsに連想配列(ハッシュ)を入れてあげるだけです。デフォルト値が不要なPropsは書く必要はありません。

RemainTime.defaultProps = {
  message: "Xデー"
};

書籍

React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで (NEXT ONE)
穴井 宏幸 石井 直矢 柴田 和祈 三宮 肇
翔泳社
売り上げランキング: 139,067

参考ページ

reactjs.org www.npmjs.com