質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

1628閲覧

[Reactカレンダーライブラリ]同じ日付をクリックした時に保持している配列から消したい

aiai8976

総合スコア112

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/04/03 09:08

編集2020/04/03 09:09

前提・実現したいこと

https://github.com/hernansartorio/react-nice-dates/tree/master/src
上のReactカレンダーライブラリを使用しているのですが、処理の一部がわかりません。
ここ(https://reactnicedates.hernansartorio.com/)で解説されている複数日程を選択できるものがありますが、同じ日付をクリックした時に元に戻らない仕様になっています。
以下のソースコード上でのmodifiers部分だと思いますが、処理がよくわかりません。
要は同じ日付をクリックした時にselectedDatesからその日付を消したいということです。
わかる方がいましたらコメントお願いします。

該当のソースコード

sample.jsx

1import React, { useState } from 'react' 2import { isSameDay } from 'date-fns' 3import { enGB } from 'date-fns/locale' 4import { Calendar } from 'react-nice-dates' 5import 'react-nice-dates/build/style.css' 6// Very rough implementation of multiple date selection 7export default function PickDateCalendar() { 8 const [selectedDates, setSelectedDates] = useState([]) 9 const modifiers = { 10 selected: date => selectedDates.some(selectedDate => isSameDay(selectedDate, date)) 11 } 12 const handleDayClick = date => { 13 setSelectedDates([...selectedDates, date]) 14 } 15 return ( 16 <Calendar onDayClick={handleDayClick} modifiers={modifiers} locale={enGB} /> 17 ) 18}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問にもある通り、提示されたPickDateCalendarコンポーネントでは、選択された日付の配列をselectedDatesに持っています。
この配列に日付を追加・削除することで、選択された日付を増減させることができ、modifiers内で選択された日付であるか判断しています。

今回のソースコードで、selectedDatesを操作しているのは、handleDayClickです。このメソッド内では日付を追加するだけの状態になっています。そこで「クリックされた日付が既に配列に存在しているか」を確認し配列の値を変える関数に書き換えましょう。

以下のコードはhandleDayClickの書き換え例です。(動作確認はしていません)

js

1const handleDayClick = date => { 2 if (selectedDates.some(selectedDate => isSameDay(selectedDate, date))) { 3 // クリックされた日付が既に存在していた場合、その日付を配列から取り除き、setSelectedDatesを実行します。 4 setSelectedDates( 5 selectedDates.filter(selectedDate => !isSameDay(selectedDate, date)) 6 ) 7 } else { 8 // クリックされた日付が既に存在していない場合、今まで通り配列に日付を追加します。 9 setSelectedDates([...selectedDates, date]) 10 } 11}

投稿2020/04/03 20:24

mottox2

総合スコア299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aiai8976

2020/04/04 02:31

できました! 丁寧な解説ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問