MUI DatePickerの使い方

Posted at 2024 年 05 月 30 日

MUI DatePickerとは?

Material-UI(MUI)は、Reactアプリケーション向けの人気のあるUIフレームワークで、多様なコンポーネントを提供しています。

その中でも、DatePickerは特に便利なコンポーネントの一つです。DatePickerコンポーネントは、ユーザーが簡単に日付を選択できるようにするためのカレンダーUIを提供します。

DatePickerを使用することで、日付入力に関するユーザーの体験を向上させ、入力ミスを減少させることができます。

本記事では、MUIのDatePickerコンポーネントの基本的な使い方、カスタマイズ方法、そして実際のアプリケーションでの利用例について詳しく説明します。

ドキュメント

プロパティー一覧

以下はMuiDatePickerの主な設定と構成オプションです。

すべてのプロパティの詳細はこちらをご覧ください。

プロパティ

タイプ

説明

autoFocus

bool

コンポーネントがマウントされたときに自動的にフォーカスするかどうかを指定します。

value

object

選択された値。コンポーネントが制御されている場合に使用されます。例:dayjs

format

string

入力時に表示される日付のフォーマット。使用されているviewsに基づいてローカライズされたフォーマットがデフォルトです。

views

array

使用するビューの設定。

例:['year', 'month', 'day']。

label

node

DatePickerのラベルテキスト

maxDate

object

選択可能な最大日付

minDate

object

選択可能な最小日付

closeOnSelect

bool

true の場合、日付を完全に選択した後、ポップオーバーまたはモーダルが閉じます。

デスクトップではtrue、モバイルではfalse(選択されたラッパーとdesktopModeMediaQueryプロップに基づく)

defaultValue

object

デフォルトの日付値。

disabled

bool

有効な場合、ピッカーとテキストフィールドが無効になります。

デフォルト:false

readOnly

bool

読み取り専用にするかどうか。

helperText

node

ヘルパーテキスト、エラーメッセージなどを表示するために使用。

renderInput

func

カスタムの入力レンダリング関数。

disableFuture

bool

未来の日付を無効にするかどうか。

disablePast

bool

過去の日付を無効にするかどうか。

スロット

スロット名

デフォルトコンポーネント

説明

toolbar

DatePickerToolbar

ビューの上に表示されるツールバーのカスタムコンポーネント。

calendarHeader

PickersCalendarHeader

カレンダーヘッダーのカスタムコンポーネント。

PickersCalendarHeaderコンポーネントを参照してください。

switchViewButton

IconButton

異なるカレンダービュー間の切り替えを表示するボタン。

switchViewIcon

ArrowDropDown

開いているビューが「年」のときに180°回転するSwitchViewButtonに表示されるアイコン。

previousIconButton

IconButton

左のビューに切り替えるボタン。

nextIconButton

IconButton

右のビューに切り替えるボタン。

leftArrowIcon

ArrowLeft

左のビュー切り替えボタンに表示されるアイコン。

rightArrowIcon

ArrowRight

右のビュー切り替えボタンに表示されるアイコン。

clearIcon

ClearIcon

クリアボタン内に表示するアイコン。

clearButton

IconButton

値をクリアするためのボタン

openPickerIcon

-

デスクトップ上の開くピッカーボタンに表示されるアイコン。

openPickerButton

IconButton

デスクトップでピッカーを開くためのボタン。

day

PickersDay

日のカスタムコンポーネント。PickersDayコンポーネントを参照してください。

field

-

キーボードで日付を入力するために使用されるコンポーネント。

※fieldのpropsを使用できます。例:clearable=true

textField

TextField from

'@mui/material' or

PickersTextField

if

enableAccessible-

FieldDOMStructure

is true.

デフォルトのフィールド内の値をレンダリングする入力を持つフォームコントロール。

※文字色やstyleの適用ができます

layout

-

レイアウトを包むためのカスタムコンポーネント。ツールバー、ビュー、アクションバー、ショートカットを包みます。

インストレーション

MUIのX Date Pickersコンポーネントを使用するには、まずMUIのパッケージをインストールする必要があります。

以下のコマンドを実行して、必要なパッケージをインストールしましょう。

npm install @mui/x-date-pickers

// date-fns
npm install date-fns
// or dayjs
npm install dayjs
// or luxon
npm install luxon
// or moment
npm install moment

実装

インポート

mui date pickerと他の必要なライブラリをインポートします。

import { DatePicker } from "@mui/x-date-pickers/DatePicker";

// MUI Date Pickerで使用する日付アダプター
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";

// ローカライズを提供するためのLocalizationProvider
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";

// 日付処理ライブラリ Day.js
import dayjs, { Dayjs } from "dayjs";

シンプルDatePicker

import * as React from "react";
import styled from "styled-components";
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
import { DatePicker } from "@mui/x-date-pickers/DatePicker";
import dayjs, { Dayjs } from "dayjs";

const Container = styled.div`
  margin: 50px;
`;

export default function MuiDatePicker() {
  const [value, setValue] = React.useState<Dayjs | null>(dayjs());

  return (
    <Container>
      <LocalizationProvider dateAdapter={AdapterDayjs}>
        <DatePicker
          label="日付を選択"
          value={value}
          onChange={(newValue) => {
            setValue(newValue);
          }}
        />
      </LocalizationProvider>
    </Container>
  );
}

Output

プロパティを使用したDatePickerの作成

  • 例1: 基本的なカスタマイズ

    この例では、minDate、maxDate、format、views、helperTextを使用してDatePickerをカスタマイズしています。

    特定の日付範囲の中から日付を選択する機能を追加しています。

    import * as React from "react";
    import styled from "styled-components";
    import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
    import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
    import { DatePicker } from "@mui/x-date-pickers/DatePicker";
    import dayjs, { Dayjs } from "dayjs";
    
    const Container = styled.div`
      margin: 50px;
    `;
    
    export default function MuiDatePicker() {
      const [selectedDate, setSelectedDate] = React.useState<Dayjs | null>(dayjs());
      const today = dayjs();
      const eventDate = dayjs("2024-06-06"); // イベント日 / 登録締切日
    
      return (
        <Container>
          <LocalizationProvider dateAdapter={AdapterDayjs}>
            <DatePicker
              label="申請日"
              value={selectedDate}
              onChange={(date) => setSelectedDate(date)}
              minDate={today} // 今日からのイベント日まで選択可能
              maxDate={eventDate} // 締切日
              format="YYYY/MM/DD"
              views={["year", "month", "day"]}
              slotProps={{
                textField: {
                  helperText: `イベントの登録日を選択してください。締切日:${eventDate.format(
                    "YYYY/MM/DD"
                  )}`,
                },
              }}
            />
          </LocalizationProvider>
        </Container>
      );
    }
    

    Output

    追加説明:

    • minDatemaxDateを設定することで、ユーザーが選択できる日付の範囲を制限しています。

      ここでは、今日から特定のイベント日までの日付を選択可能にしています。

    • formatプロパティを使って、日付の表示フォーマットを"YYYY/MM/DD"に設定しています。
    • viewsプロパティを使用して、ユーザーが年、月、日を選択できるようにビューを設定しています。
    • helperTextを設定することで、ユーザーに対して補助的なメッセージを表示しています。

      ここでは、締切日を案内しています。

    同様に、以下のようにformatとviewsを使用して「年月/日」のDatePickerをカスタマイズすることもできます。

    import * as React from "react";
    import styled from "styled-components";
    import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
    import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
    import { DatePicker } from "@mui/x-date-pickers/DatePicker";
    import dayjs, { Dayjs } from "dayjs";
    
    export default function MuiDatePicker() {
      const [selectedYearMonth, setSelectedYearMonth] =
        React.useState<Dayjs | null>(dayjs());
      const [selectedDay, setSelectedDay] = React.useState<Dayjs | null>(dayjs());
    
      return (
          <LocalizationProvider dateAdapter={AdapterDayjs}>
            <DatePicker
              format="MMMM YYYY"
              label="年月"
              value={selectedYearMonth}
              onChange={(date) => setSelectedYearMonth(date)}
              views={["year", "month"]}
            />
            <DatePicker
              format="DD"
              label="日"
              value={selectedDay}
              onChange={(date) => setSelectedDay(date)}
              views={["day"]}
            />
          </LocalizationProvider>
      );
    }
    

    Output

    例2: カスタムスロットとスタイルの使用

    この例では、slotsslotPropsを使用して、DatePickerの外観と動作をカスタマイズしています。

    特定のコンポーネントをカスタムスタイルでラップし、独自のアイコンを使用しています。

    import styledC from "styled-components";
    import { styled } from "@mui/material/styles";
    import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
    import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
    import { DatePicker } from "@mui/x-date-pickers/DatePicker";
    import dayjs, { Dayjs } from "dayjs";
    import IconButton from "@mui/material/IconButton";
    import EditCalendarRoundedIcon from "@mui/icons-material/EditCalendarRounded";
    import { PickersDay } from "@mui/x-date-pickers/PickersDay";
    
    const StyledButton = styled(IconButton)(({ theme }) => ({
      borderRadius: theme.shape.borderRadius,
    }));
    
    const StyledDay = styled(PickersDay)(({ theme }) => ({
      borderRadius: theme.shape.borderRadius,
      color:
        theme.palette.mode === "light"
          ? theme.palette.secondary.dark
          : theme.palette.secondary.light,
    }));
    
    export default function MuiDatePicker() {
      const today = dayjs();
      return (
          <LocalizationProvider dateAdapter={AdapterDayjs}>
            <DatePicker
              format="YYYY/MM/DD"
              defaultValue={today}
              label="Styled Picker"
              maxDate={today}
              views={["year", "month", "day"]}
              slots={{
                openPickerIcon: EditCalendarRoundedIcon,
                openPickerButton: StyledButton,
                day: StyledDay,
              }}
              slotProps={{
                field: {
                  clearable: true,
                },
                openPickerIcon: { fontSize: "large" },
                openPickerButton: { color: "secondary" },
                textField: {
                  variant: "filled",
                  focused: true,
                  color: "secondary",
                },
              }}
            />
          </LocalizationProvider>
      );
    }
    
    

    追加説明:

    • slotsプロパティを使用して、カスタムコンポーネントを提供しています。

      ここでは、カレンダーアイコン(openPickerIcon)とカレンダーの各日(day)の表示をカスタマイズしています。

    • slotPropsプロパティを使用して、各スロットに対して追加のプロパティを設定しています。

      例えば、カレンダーアイコンのサイズをfontSize: "large"に設定し、ボタンの色をcolor: "secondary"に設定しています。

    • textFieldスロットのプロパティを設定することで、テキストフィールドの外観や動作をカスタマイズしています。

      例えば、variant: "filled"やfocused: trueを使用して、入力フィールドがフォーカスされた状態で表示されるようにしています。

    Output

    MUI DatePickerのカスタマイズは、ユーザーインターフェースをより使いやすく、見た目も美しくするための重要な手段です。

    このガイドを参考にして、さまざまなコンポーネントをカスタマイズし、あなたのアプリケーションに最適なDatePickerを作成してください。

    Happy Coding!

DevpediaCode編集部

DevpediaCodeはWeb、AI、Iot、ローコードなどプログラムに関する最新ITテーマの情報を発信するメディアです。

お問合せ下記のURLからお願いします。

https://devpediacode.com/contact