🗓️
Vue3.5で Vue Datepicker を使用して日付選択を実装する
はじめに
お仕事でプラグイン「Vue Datepicker」を使用して日付選択を実装したのと、
Vueのv3.5で開発してみたかったので、備忘録として残します。
以下のコンポーネントを作成したので参考にしてください。
- 日付選択
- 日付時刻選択
- 時刻選択
- 日付範囲選択
動作環境・使用するツールや言語
- Vue: v3.5.13
- Vuetify: v3.7.16
- Vue Datepicker: v11.0.2
作成したリポジトリ
導入
公式ドキュメントに沿って進めます。
npm install @vuepic/vue-datepicker
グローバル設定
グローバルに設定したい場合は、こちらをmain.ts
に追記してください。
main.ts
import { createApp } from "vue";
import App from './App.vue';
+ import VueDatePicker from '@vuepic/vue-datepicker';
+ import '@vuepic/vue-datepicker/dist/main.css'
const app = createApp(App);
+ app.component('VueDatePicker', VueDatePicker);
app.mount('#app');
ローカル設定
都度インポートして使用します。
sample.vue
<script setup>
import { ref } from 'vue';
import VueDatePicker from '@vuepic/vue-datepicker';
import '@vuepic/vue-datepicker/dist/main.css'
const date = ref();
</script>
<template>
<VueDatePicker v-model="date"></VueDatePicker>
</template>
オプション
今回使用したオプション一覧です。
-
format-locale
- ローカライズ設定。
-
date-fns
はプラグインをインストール時に依存パッケージに含まれている。
-
format
- 入力欄のフォーマット設定。
-
model-type
- v-modelのフォーマット設定。
-
text-input
- 入力欄でキーボード操作をできるようにする設定。
- フォーマットも変更可能。
-
auto-apply
- 日付を選択したら、自動で内部的にも選択が完了する設定。
-
enable-time-picker
- 時刻選択の表示/非表示
-
teleport
- 選択メニューを親要素ではなく、bodyに配置する設定。
-
time-picker-inline
- 時刻選択をインライン要素とする設定。
-
select-text
- 選択ボタンのテキスト設定。
-
cancel-text
- キャンセルボタンのテキスト設定。
-
time-picker
- 時刻選択モード
-
range
- 範囲選択モード
-
multi-calendars
- カレンダーを複数表示するモード
- オプション
日付選択コンポーネント
AppDatePicker.vue
<script setup lang="ts">
import VueDatePicker from '@vuepic/vue-datepicker'
import '@vuepic/vue-datepicker/dist/main.css'
import { ja } from 'date-fns/locale'
const { format = 'yyyy/MM/dd', teleport = true } = defineProps<{
format?: string
teleport?: boolean
}>()
const date = defineModel<string>('date')
</script>
<template>
<VueDatePicker
v-model="date"
:format-locale="ja"
:format="format"
:model-type="format"
:text-input="{ format }"
:auto-apply="true"
:enable-time-picker="false"
:teleport="teleport"
>
</VueDatePicker>
</template>
日付時刻選択コンポーネント
時刻部分はインラインにしました。
AppDateTimePicker.vue
<script setup lang="ts">
import VueDatePicker from '@vuepic/vue-datepicker'
import '@vuepic/vue-datepicker/dist/main.css'
import { ja } from 'date-fns/locale'
const { format = 'yyyy/MM/dd HH:mm', teleport = true } = defineProps<{
format?: string
teleport?: boolean
}>()
const date = defineModel<string>('date')
</script>
<template>
<VueDatePicker
v-model="date"
:format-locale="ja"
:format="format"
:model-type="format"
:text-input="{ format }"
:teleport="teleport"
time-picker-inline
select-text="選択"
cancel-text="取消"
>
</VueDatePicker>
</template>
時刻選択コンポーネント
AppTimePicker.vue
<script setup lang="ts">
import VueDatePicker from '@vuepic/vue-datepicker'
import '@vuepic/vue-datepicker/dist/main.css'
import { ja } from 'date-fns/locale'
const { format = 'HH:mm', teleport = true } = defineProps<{
format?: string
teleport?: boolean
}>()
const date = defineModel<string>('date')
</script>
<template>
<VueDatePicker
v-model="date"
time-picker
:format-locale="ja"
:format="format"
:model-type="format"
:text-input="{ format }"
:teleport="teleport"
select-text="選択"
cancel-text="取消"
>
</VueDatePicker>
</template>
日付範囲選択コンポーネント
AppDateRangePicker.vue
<script setup lang="ts">
import VueDatePicker from '@vuepic/vue-datepicker'
import '@vuepic/vue-datepicker/dist/main.css'
import { ja } from 'date-fns/locale'
const { format = 'yyyy/MM/dd', teleport = true } = defineProps<{
format?: string
teleport?: boolean
}>()
const date = defineModel<string[]>('date')
</script>
<template>
<VueDatePicker
ref="datepicker"
v-model="date"
range
multi-calendars
:format-locale="ja"
:format="format"
:model-type="format"
:text-input="{ format }"
:teleport="teleport"
:enable-time-picker="false"
select-text="選択"
cancel-text="取消"
>
</VueDatePicker>
</template>
コンポーネント使用例
VueDatePicker.vue
<script setup lang="ts">
import { ref } from 'vue'
import TheWrapper from '@/components/TheWrapper.vue'
import AppDatePicker from '@/components/controls/AppDatePicker.vue'
import AppDateTimePicker from '@/components/controls/AppDateTimePicker.vue'
import AppTimePicker from '@/components/controls/AppTimePicker.vue'
import AppDateRangePicker from '@/components/controls/AppDateRangePicker.vue'
const date = ref<string>('')
const datetime = ref<string>('')
const time = ref<string>('')
const dateRange = ref<string[]>([])
</script>
<template>
<TheWrapper>
<v-container fluid>
<v-row>
<v-col cols="12" lg="6" md="6" sm="6">
<v-card title="日付選択">
<v-card-item>
<AppDatePicker v-model="date" />
</v-card-item>
</v-card>
</v-col>
<v-col cols="12" lg="6" md="6" sm="6">
<v-card title="日付時刻選択">
<v-card-item>
<AppDateTimePicker v-model="datetime" />
</v-card-item>
</v-card>
</v-col>
<v-col cols="12" lg="6" md="6" sm="6">
<v-card title="時刻選択">
<v-card-item>
<AppTimePicker v-model="time" />
</v-card-item>
</v-card>
</v-col>
<v-col cols="12" lg="6" md="6" sm="6">
<v-card title="日付範囲選択">
<v-card-item>
<AppDateRangePicker v-model="dateRange" />
</v-card-item>
</v-card>
</v-col>
</v-row>
</v-container>
</TheWrapper>
</template>
おわりに
複数カレンダーの独立表示については、今回の実装で初めて気づきました。
公式ドキュメントをよく見るって大事ですね。
ここまで読んでいただき、ありがとうございました。
Discussion