Laravel×ReactでつくるSPAスケジュールアプリ【③カレンダー表示】

LaravelとReactで作るSPAアプリ第3段です。
Reactで表示の根本となるカレンダーを表示していきましょう。

Laravel×ReactでつくるSPAスケジュールアプリ【③カレンダー表示】

カレンダーの概要を理解しよう

今回作成するカレンダーの完成形は以下の通りです。

この画像のスケジュールは次の対象ですが、カレンダーの全体図は上記のようなものです。
このカレンダーを目指して、まずはカレンダーそのものを不格好でも良いので作成してみましょう。
要件としては

  • 実際に存在する形式のカレンダーが表示される
  • ボタンクリックで前月、翌月へ移れる
  • 月を移動した際に、その月のカレンダーが表示される

といったところですね。
弄るファイルは「resources/js/components/Example.js」です。
そこに以下の内容で貼り付けます。

Example.js
いきなりコードを貼り付けられても分からないと思うので、上から少しづつ解説していきます。
変数で年度と月、そしてカレンダーを関数で指定しています。
年度や月は翌月や前月の選択で変わるために、useState関数を使用しています。
getMonth関数は0からスタートするので、+1するのを忘れずに。
前月、翌月を指定するボタンをクリックしたときの挙動を関数で定義しています。
月を戻す処理も進める処理も同じなので、1つの関数ですね。
ただし13月になったら翌年の1月に、
0月になったら前年の12月に、といった処理を行っています。

また前述のカレンダー変数でyearとmonthにはステート変数を設定しています。
そのため、ボタンを押しただけで自動的に再度カレンダー関数が動き、
カレンダーの表示が変わるようになっています。

次のreturn内でカレンダーを表示しています。
ここでの説明は割愛しますが、次のカレンダー関数を理解すれば、この部分も理解できるはずです。

カレンダー関数では、最初に月の初めの曜日を取得しています。
2021年12月なら水曜日といった形ですね。その形を元に、カレンダーを作成しています。

関数内部に2つの配列がありますね。1つめの5まで存在する配列は週を表しています。
さまざまな月のカレンダーを見ると分かりますが、カレンダーにおいて、週は最大で6週まで表示されます。
2つ目の配列は曜日に対応しています。7曜日あるので、7つの配列があります。

そしてその2つをmap関数で展開しつつreturnしています。
どういうことかというと、mapは配列の数字を0から順に処理します。
それゆえに最初の配列でははじめに0を、次に1を、そして2をといった順番で処理します。

そしてこの関数ではmap関数が2つ使われています。
それゆえに最初の配列の0を実行した後に、2つ目の配列の0を、次に2つ目の配列の1を、といった順で処理します。
戻り値はweekの値と、dayの値となっています。例えば2021年12月の場合は

  • 0:[ー2、ー1、0、1、2、3、4]
  • 1:[5、6、7、8、9、10、11]
  • 2:[12、13、14、15、16、17、18]
  • 3:[19、20、21、22、23、24、25]
  • 4:[26、27、28、29、30、31、32]
  • 5:[33、34、35、36、37、38、39]

といった形で返されます。縦の0~5までの数字がweekの値です。
その横の数字はdayで求めた値ですね。2021年12月の場合はfirstが水曜日(3)なので、3を引いて、最初が-2からスタートしています。
木曜日なら4を引くので、1の位置が変わることが分かります。

すでに帰ってくる値の段階でカレンダーの形をしていることが分かると思います。
あとはreturnの中でこの配列通りに表示してあげれば、カレンダー形式で表示ができます。
実際にこのコードで、表示は以下のようになります。

先月や翌月のボタンを押して、カレンダーが切り替わることを確認しておいてください。

カレンダーを調節しよう!

このままではカレンダーとして使えないので、調整します。
0以下の数値と、その月の最大値以上の数値を切り替えましょう。
上記の画像の場合、0以下の部分は11月の末日、31以降は1月の月初にしたいところです。

そのため、コードの一部を変更します。

Example.js
日付の表示はreturn部分のdayで行っていました。
その部分を修正しています。前月の最終日、および当月の最終日のデータが欲しいので、それを先頭で取得しました。
lastは当月の最終日、prevlastは前月の最終日です。

day部分では3項演算子を用いています。
3項演算子はif文をJSXで使用できるようにしたものです。
以上のコードを適用させると、良い感じにカレンダーになります。

続いてデザインも適応していきましょう。
LaravelはデザインをSASSで指定できます。
「resources/sass」に「calender.scss」というファイルを新規作成し、以下のコードを書き込みます。

calender.scss
カレンダーのデザインをSCSS形式で指定しています。
このSCSSファイルを読み込むように設定します。
設定する場所は同じ階層にある「app.scss」ファイルです。
以下の一文を追加します。

app.scss
この状態でビルドを行うと、SCSSがコンパイルされます。
ブラウザをリロードして、画面を確認してみましょう。

かなり良い感じのデザインになりましたね。
細かいところはお好みで変えても良いと思います。
今回はここまで。次回はスケジュールの表示を試してみましょう!

Laravel×Reactでつくるスケジュールアプリ
環境構築 Git、Reactの導入
カレンダー表示 スケジュール表示 
スケジュール登録 スケジュール更新
スケジュール削除 関数化Ⅰ
関数化Ⅱ