React-Calendar が便利

React-Calendar が便利

どうもfujiharaです。先日人生2回目となる鳥の糞被弾を味わいました。ドラゴンボールスクラッチでもやってみようかな。
本日はReactでカレンダーを実装する時に便利だと思ったReact-Calendarをご紹介します。

React Calendar

React でカレンダーないかなぁって探していたら見つけました。以下が売りらしいです。
React Calendar

  • 様々な表示形式(月、年、10年)
  • レンジセレクトができる
  • マルチ言語対応
  • moment.jsを使用していない

実装

react-calendar を npm でインストールしたら、以下のようにして使えます。


import React from 'react';
import Calendar from 'react-calendar';

export default class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      date: new Date(2019, 4, 17),
      //月のデータ
      month_days: {
        20190501: { is_holiday: true },
        20190502: { is_holiday: true },
        20190503: { is_holiday: true },
        20190506: { is_holiday: true },
        20190514: { text: 'バシャログ執筆' },
        20190517: { text: 'バシャログ出稿' }
      }
    };
    this.getTileClass = this.getTileClass.bind(this);
    this.getTileContent = this.getTileContent.bind(this);
  }

  // state の日付と同じ表記に変換
  getFormatDate(date) {
    return `${date.getFullYear()}${('0' + (date.getMonth() + 1)).slice(-2)}${('0' + date.getDate()).slice(-2)}`;
  }

  //日付のクラスを付与 (祝日用)
  getTileClass({ date, view }) {
    // 月表示のときのみ
    if (view !== 'month') {
      return '';
    }
    const day = this.getFormatDate(date);
    return (this.state.month_days[day] && this.state.month_days[day].is_holiday) ?
      'holiday' : '';
  }

  //日付の内容を出力
  getTileContent({ date, view }) {
    // 月表示のときのみ
    if (view !== 'month') {
      return null;
    }
    const day = this.getFormatDate(date);
    return (
      <p>
        <br />
        {(this.state.month_days[day] && this.state.month_days[day].text) ?
          this.state.month_days[day].text : ' '
        }
      </p>
    );
  }

  render() {
    return (
      <Calendar
        locale="ja-JP"
        value={this.state.date}
        tileClassName={this.getTileClass}
        tileContent={this.getTileContent}
      />
    );
  }
}

fujiwara_react_calendar.png
(※ ほんの少しだけスタイルいじっています。)

説明

Calendar コンポーネントに locale (言語), value (Date)プロパティを渡すと、日本語のカレンダーが表示されます。valueはなければ当月が表示されます。 tileCalssName では追加のクラスをつけられるので、 今回は state.month_days で日付に is_holiday がついていたら holiday というクラスをつけ赤く表示しています。
tileContent は中身になるので state.month_days で日付にテキストがあれば、それを出力するようにしています。

まとめ

煩わしい計算とかなく、一気に表示できるので良いですよね。スタイルがあたっていないものを使用したい場合は Calendar コンポーネントを react-calendar/dist/entry.nostyle からインポートすることができます。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ