Skip to content

Calendar カレンダー - Vant 4

日付選択、範囲選択、複数日選択などの機能を提供します

導入

js
import { Calendar } from 'vant';

app.use(Calendar);

コード例

切り替えモード

switch-mode 属性で、カレンダーの表示モードを設定できます。これにより、年月を素早く切り替えることができます。

html
<van-calendar
  v-model:show="show"
  title="切り替えモード"
  switch-mode="year-month"
/>
<van-button type="primary" @click="show = true">表示</van-button>

単一の日付を選択

typesingle に設定すると、単一の日付を選択できます。これは重要な日付をマークするのに最適です。

html
<van-calendar v-model:show="show" @confirm="onConfirm" />
<van-cell title="日付" :value="date || '選択してください'" @click="show = true" is-link />
js
import { ref } from 'vue';
export default {
  setup() {
    const date = ref('');
    const show = ref(false);
    const formatDate = (date) => {
      return `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`;
    };
    const onConfirm = (value) => {
      show.value = false;
      date.value = formatDate(value);
    };
    return { date, show, onConfirm };
  },
};

複数の日付を選択

typemultiple に設定すると、複数の日付を一度に選択できます。フィットネス計画や休日のマークなどに便利です。

html
<van-calendar
  v-model:show="show"
  type="multiple"
  @confirm="onConfirm"
/>
<van-cell title="複数日付" :value="text || '選択してください'" @click="show = true" is-link />
js
import { ref } from 'vue';
export default {
  setup() {
    const text = ref('');
    const show = ref(false);
    const onConfirm = (dates) => {
      show.value = false;
      text.value = `${dates.length} 日を選択しました`;
    };
    return { text, show, onConfirm };
  },
};

日付範囲を選択

typerange に設定すると、開始日と終了日からなる日付範囲を選択できます。休暇計画やプロジェクト期間の設定などに最適です。

html
<van-calendar
  v-model:show="show"
  type="range"
  @confirm="onConfirm"
/>
<van-cell title="日付範囲" :value="date || '選択してください'" @click="show = true" is-link />
js
import { ref } from 'vue';
export default {
  setup() {
    const date = ref('');
    const show = ref(false);
    const formatDate = (date) => `${date.getMonth() + 1}/${date.getDate()}`;
    const onConfirm = (values) => {
      const [start, end] = values;
      show.value = false;
      date.value = `${formatDate(start)} - ${formatDate(end)}`;
    };
    return { date, show, onConfirm };
  },
};

Tips: デフォルトでは、日付範囲の開始と終了は同日にできませんが、allow-same-day 属性を設定することで同日を選択できるようになります。

即時選択

show-confirmfalse に設定すると、確認ボタンが非表示になり、日付を選択するとすぐに confirm イベントがトリガーされます。よりスムーズな体験が実現できます。

html
<van-calendar
  v-model:show="show"
  :show-confirm="false"
  @confirm="onConfirm"
/>
<van-cell title="即時選択" :value="date || '選択してください'" @click="show = true" is-link />

カスタムカラー

color 属性を使用して、カレンダーのテーマカラーをカスタマイズできます。ブランドカラーに合わせて変更することができます。

html
<van-calendar v-model:show="show" color="#07c160" />
<van-button type="success" @click="show = true">緑色カレンダー</van-button>

カスタム日付範囲

min-datemax-date 属性を使用して、ユーザーが選択できる日付範囲を制限できます。予約システムやイベント登録などの時間制限がある場面に最適です。

html
<van-calendar
  v-model:show="show"
  :min-date="minDate"
  :max-date="maxDate"
/>
<van-button type="primary" @click="show = true">範囲を制限</van-button>
js
import { ref } from 'vue';
export default {
  setup() {
    const show = ref(false);
    return {
      show,
      minDate: new Date(2010, 0, 1),
      maxDate: new Date(2010, 0, 31),
    };
  },
};

カスタムボタンテキスト

confirm-text 属性で確認ボタンのテキストをカスタマイズできます。より個性的なボタン文案にすることができます。

html
<van-calendar
  v-model:show="show"
  confirm-text="決定"
  confirm-disabled-text="選択してください"
/>
<van-button type="primary" @click="show = true">カスタムボタン</van-button>

カスタム日付文案

formatter 関数を使用して、各日付の表示内容をカスタマイズできます。特別な日付に独自の表示を追加することができます。

html
<van-calendar
  v-model:show="show"
  type="range"
  :formatter="formatter"
/>
<van-button type="primary" @click="show = true">カスタムフォーマット</van-button>
js
export default {
  setup() {
    const formatter = (day) => {
      const month = day.date.getMonth() + 1;
      const date = day.date.getDate();
      
      if (month === 5) {
        if (date === 1) {
          day.topInfo = '労働者の日';
        } else if (date === 4) {
          day.topInfo = '青年の日';
        } else if (date === 11) {
          day.text = '今日';
        }
      }
      
      if (day.type === 'start') {
        day.bottomInfo = 'チェックイン';
      } else if (day.type === 'end') {
        day.bottomInfo = 'チェックアウト';
      }
      
      return day;
    };
    
    return { formatter };
  },
};

カスタムポップアップ位置

position 属性でポップアップの表示位置をカスタマイズできます。topleftright から選択できます。

html
<van-calendar v-model:show="show" position="right" />
<van-button type="primary" @click="show = true">右側に表示</van-button>

日付範囲の最大範囲

max-range 属性を使用して、日付範囲の最大選択日数を指定できます。選択範囲が制限を超えると、指定したメッセージが表示されます。

html
<van-calendar
  v-model:show="show"
  type="range"
  :max-range="3"
  range-prompt="最大3日間まで選択できます"
/>
<van-button type="primary" @click="show = true">範囲制限</van-button>

週の開始日をカスタマイズ

first-day-of-week 属性で週の開始日を設定できます。

html
<van-calendar v-model:show="show" :first-day-of-week="1" />
<van-button type="primary" @click="show = true">月曜日を開始に</van-button>

フラット表示

poppablefalse に設定すると、カレンダーはポップアップ形式ではなく、ページ内に直接表示されます。

html
<van-calendar
  title="フラット表示"
  :poppable="false"
  :show-confirm="false"
/>

API

Props

パラメータ説明デフォルト値
type選択タイプ:single 単一の日付選択、multiple 複数の日付選択、range 日付範囲選択stringsingle
switch-mode v4.9.0切り替えモード:none すべての月をフラット表示、month 月単位で切り替え、year-month 年と月単位で切り替えstringnone
titleカレンダーのタイトルstring日付選択
colorテーマカラー、下部ボタンと選択された日付に適用string#1989fa
min-date選択可能な最小日付Dateswitch-modenone の場合は現在の日付
max-date選択可能な最大日付Dateswitch-modenone の場合は現在の日付の6か月後
default-dateデフォルトで選択される日付、typemultiple または range の場合は配列、null を渡すとデフォルトで選択なしDate | Date[] | null今日
row-height日付の行の高さnumber | string64
formatter日付フォーマット関数(day: Day) => Day-
poppableカレンダーをポップアップ形式で表示するかどうかbooleantrue
lazy-render表示領域のコンテンツのみをレンダリングするかどうかbooleantrue
show-mark月の背景ウォーターマークを表示するかどうかbooleantrue
show-titleカレンダーのタイトルを表示するかどうかbooleantrue
show-subtitleカレンダーのサブタイトル(年月)を表示するかどうかbooleantrue
show-confirm確認ボタンを表示するかどうかbooleantrue
readonly読み取り専用モードかどうか、読み取り専用モードでは日付を選択できないbooleanfalse
confirm-text確認ボタンのテキストstring確認
confirm-disabled-text確認ボタンが無効な状態のテキストstring確認
first-day-of-week週の開始日を設定0-60

Calendar Poppable Props

Calendar の poppabletrue の場合、以下の props が使用可能です:

パラメータ説明デフォルト値
v-model:showカレンダーポップアップを表示するかどうかbooleanfalse
positionポップアップの位置、toprightleft から選択stringbottom
round角丸のポップアップを表示するかどうかbooleantrue
close-on-popstateページを戻るときに自動的に閉じるかどうかbooleantrue
close-on-click-overlayマスクをクリックして閉じるかどうかbooleantrue
safe-area-inset-top上部安全領域の適応を有効にするかどうかbooleanfalse
safe-area-inset-bottom下部安全領域の適応を有効にするかどうかbooleantrue
teleportマウント先のノードを指定、Teleport コンポーネントの to 属性と同じstring | Element-

Calendar Range Props

Calendar の typerange の場合、以下の props が使用可能です:

パラメータ説明デフォルト値
max-range日付範囲の最大選択日数number | string制限なし
range-prompt範囲選択が最大選択日数を超えた場合のメッセージstring最多选择 xx 天
show-range-prompt範囲選択が最大選択日数を超えた場合にメッセージを表示するかどうかbooleantrue
allow-same-day日付範囲の開始と終了を同日に許可するかどうかbooleanfalse

Calendar Multiple Props

Calendar の typemultiple の場合、以下の props が使用可能です:

パラメータ説明デフォルト値
max-range日付の最大選択数number | string制限なし
range-prompt選択が最大数を超えた場合のメッセージstring最多选择 xx 天

Day データ構造

カレンダーの各日付は Day オブジェクトに対応します。formatter 属性で Day オブジェクトの内容をカスタマイズできます。

キー名説明
date日付に対応する Date オブジェクトDate
type日付のタイプ、selectedstartmiddleenddisabledstart-endmultiple-selectedmultiple-middleplaceholder から選択string
text中央に表示されるテキストstring
topInfo上部のヒント情報string
bottomInfo下部のヒント情報string
className追加のクラス名string

Events

イベント名説明コールバックパラメータ
select任意の日付をクリックして選択したときにトリガーされますvalue: Date | Date[]
confirm日付の選択が完了したときにトリガーされます。show-confirmtrue の場合は、確認ボタンをクリックするとトリガーされますvalue: Date | Date[]
openポップアップを開くときにトリガーされます-
closeポップアップを閉じるときにトリガーされます-
openedポップアップを開いてアニメーションが終了したときにトリガーされます-
closedポップアップを閉じてアニメーションが終了したときにトリガーされます-
unselectCalendar コンポーネントの typemultiple の場合、日付の選択を解除したときにトリガーされますvalue: Date
month-showある月が表示領域に入ったときにトリガーされます(switch-modenone の場合に有効){ date: Date, title: string }
over-range範囲選択が最大選択日数を超えたときにトリガーされます-
click-subtitleカレンダーのサブタイトルをクリックしたときにトリガーされますevent: MouseEvent
click-disabled-date v4.7.0無効な日付をクリックしたときにトリガーされますvalue: Date | Date[]
click-overlay v4.9.16マスクをクリックしたときにトリガーされますevent: MouseEvent
panel-changeカレンダーパネルが切り替わったときにトリガーされます(switch-modenone 以外の場合に有効){ date: Date }

Slots

名前説明パラメータ
titleカスタムタイトル-
subtitleカスタムカレンダーサブタイトル{ text: string, date?: Date }
month-title v4.0.9各月のサブタイトルをカスタマイズ{ text: string, date: Date }
footer下部領域の内容をカスタマイズ-
confirm-text確認ボタンの内容をカスタマイズ{ disabled: boolean }
top-info日付の上部のヒント情報をカスタマイズday: Day
bottom-info日付の下部のヒント情報をカスタマイズday: Day
text日付の内容をカスタマイズday: Day
prev-month前の月のボタンをカスタマイズ{ disabled: boolean }
prev-year前の年のボタンをカスタマイズ{ disabled: boolean }
next-month次の月のボタンをカスタマイズ{ disabled: boolean }
next-year次の年のボタンをカスタマイズ{ disabled: boolean }

メソッド

ref を使用して Calendar インスタンスを取得し、インスタンスメソッドを呼び出すことができます。詳細については、コンポーネントインスタンスメソッドを参照してください。

メソッド名説明パラメータ戻り値
reset選択した日付を指定された日付にリセットします。パラメータがない場合はデフォルトの日付にリセットしますdate?: Date | Date[]-
scrollToDate特定の日付までスクロールしますdate: Date-
getSelectedDate選択された日付を取得します-Date | Date[] | null

タイプ定義

コンポーネントは次のTypeScriptタイプをエクスポートしています:

ts
export type CalendarSwitchMode = 'none' | 'month' | 'year-month';
export type CalendarType = 'single' | 'multiple' | 'range';
export type CalendarProps = {
  type?: CalendarType;
  switchMode?: CalendarSwitchMode;
  title?: string;
  color?: string;
  minDate?: Date;
  maxDate?: Date;
  defaultDate?: Date | Date[] | null;
  rowHeight?: number | string;
  formatter?: (day: CalendarDayItem) => CalendarDayItem;
  poppable?: boolean;
  lazyRender?: boolean;
  showMark?: boolean;
  showTitle?: boolean;
  showSubtitle?: boolean;
  showConfirm?: boolean;
  readonly?: boolean;
  confirmText?: string;
  confirmDisabledText?: string;
  firstDayOfWeek?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
  // Poppable props
  show?: boolean;
  position?: 'top' | 'bottom' | 'left' | 'right';
  round?: boolean;
  closeOnPopstate?: boolean;
  closeOnClickOverlay?: boolean;
  safeAreaInsetTop?: boolean;
  safeAreaInsetBottom?: boolean;
  teleport?: string | Element;
  // Range props
  maxRange?: number | string;
  rangePrompt?: string;
  showRangePrompt?: boolean;
  allowSameDay?: boolean;
};

export type CalendarDayItem = {
  date: Date;
  type: CalendarDayType;
  text: string;
  topInfo?: string;
  bottomInfo?: string;
  className?: string;
};

export type CalendarDayType = 
  | 'selected'
  | 'start'
  | 'middle'
  | 'end'
  | 'disabled'
  | 'start-end'
  | 'multiple-selected'
  | 'multiple-middle'
  | 'placeholder';

export type CalendarInstance = {
  reset: (date?: Date | Date[]) => void;
  scrollToDate: (date: Date) => void;
  getSelectedDate: () => Date | Date[] | null;
};

テーマカスタマイズ

CSS変数

以下のCSS変数を使用して、コンポーネントのスタイルをカスタマイズできます。カスタマイズ方法については、テーマカスタマイズガイドを参照してください。

変数名デフォルト値説明
--van-calendar-backgroundvar(--van-background-2)-
--van-calendar-popup-height80%-
--van-calendar-header-shadow0 2px 10px rgba(125, 126, 128, 0.16)-
--van-calendar-header-title-height44px-
--van-calendar-header-title-font-sizevar(--van-font-size-lg)-
--van-calendar-header-subtitle-font-sizevar(--van-font-size-md)-
--van-calendar-header-action-width28px-
--van-calendar-header-action-colorvar(--van-text-color)-
--van-calendar-header-action-disabled-colorvar(--van-text-color-3)-
--van-calendar-weekdays-height30px-
--van-calendar-weekdays-font-sizevar(--van-font-size-sm)-
--van-calendar-month-title-font-sizevar(--van-font-size-md)-
--van-calendar-month-mark-colorfade(var(--van-gray-2), 80%)-
--van-calendar-month-mark-font-size160px-
--van-calendar-day-height64px-
--van-calendar-day-font-sizevar(--van-font-size-lg)-
--van-calendar-day-margin-bottom4px-
--van-calendar-day-disabled-colorvar(--van-text-color-3)-
--van-calendar-range-edge-colorvar(--van-white)-
--van-calendar-range-edge-backgroundvar(--van-primary-color)-
--van-calendar-range-middle-colorvar(--van-primary-color)-
--van-calendar-range-middle-background-opacity0.1-
--van-calendar-selected-day-size54px-
--van-calendar-selected-day-colorvar(--van-white)-
--van-calendar-selected-day-backgroundvar(--van-primary-color)-
--van-calendar-info-font-sizevar(--van-font-size-xs)-
--van-calendar-info-line-heightvar(--van-line-height-xs)-
--van-calendar-confirm-button-height36px-
--van-calendar-confirm-button-margin7px 0-

よくある質問

formatter で非同期で返されるデータを使用するには?

formatter で非同期で返されるデータを使用する必要がある場合は、計算プロパティを使用して動的に formatter 関数を作成できます。以下に例を示します:

js
const asyncData = ref();
const formatter = computed(() => {
  if (!asyncData.value) {
    return (day) => day;
  }
  return (day) => {
    day.bottomInfo = asyncData.value;
    return day;
  };
});
setTimeout(() => {
  asyncData.value = 'バックエンドからのテキスト';
}, 3000);

iOS でコンポーネントの初期化に失敗する?

iOS でコンポーネントがレンダリングされない問題に直面した場合、new Date('2020-01-01') のような中線で区切られた日付形式を使用していないか確認してください。iOS はこの形式をサポートしていません。正しい方法は new Date('2020/01/01') です。

この問題の詳細な説明:stackoverflow

あるいは、new Date(2020, 0, 1) のような、すべてのシステムとブラウザで互換性がある方法を採用するべきです。ただし、月は 0 から始まることに注意してください。

🎯 ベストプラクティス

💡 使用シナリオ推奨

Calendar コンポーネントは万能キーのようなもので、日付選択が必要な様々なシナリオに適しています:

🏨 ホテル予約システム

js
// チェックインとチェックアウトの日付を設定し、最小宿泊日数を制限
<van-calendar
  type="range"
  :min-date="new Date()"
  :max-range="30"
  :formatter="hotelFormatter"
/>

📅 会議室予約

js
// 平日のみを選択可能にし、週末を除外
<van-calendar
  type="multiple"
  :formatter="workdayFormatter"
  :min-date="new Date()"
/>

🎂 誕生日リマインダー設定

js
// 単日選択で、過去の日付も選択可能
<van-calendar
  type="single"
  :max-date="new Date()"
  title="誕生日を選択"
/>

⚡ パフォーマンス最適化のヒント

  1. lazy-render の適切な使用:月数が多いカレンダーの場合、レイジーレンダリングを有効にするとパフォーマンスが大幅に向上します
  2. formatter の頻繁な更新を避ける:formatter 関数は安定したままにし、レンダリングごとに新しい関数を作成しないようにします
  3. switch-mode の使用:大量の月を表示する必要がある場合、フラットモードではなく切り替えモードを使用します

🎨 デザインの推奨事項

  • カラーマッチング:ブランドの色調と調和するテーマカラーを選択し、あまり鮮やかな色を避けます
  • ユーザーフレンドリーな文案:「日付選択」のようなユーザーに馴染みのある言語を使用します
  • 迅速なフィードバック:ユーザーの操作後に視覚的なフィードバックをすぐに提供し、インタラクティブ体験を向上させます

🔗 関連コンポーネント

📚 拡張リーディング


💡 ヒント:Calendar コンポーネントは単なる日付選択ツールではなく、ユーザーエクスペリエンスを向上させる重要なコンポーネントです。その様々な機能を適切に活用することで、アプリをよりユーザーフレンドリーで専門的なものにすることができます!

Vant に基づく企業向けモバイルソリューション