📐

Vuetifyを使って日付ピッカーでYYYYMMDD形式でセットするテキストフィールドをつくる方法

2021/07/16に公開

はじめに

フォームで YYYYMMDD 形式の日付入力欄を作りたくなったので、Vuetifyを使って日付ピッカーでセットするテキストフィールドを作ることを検討しました。

イメージはこんな感じです。

具体的な動作はこんな感じです。

  • テキストフィールドにフォーカスしたら日付ピッカーがポップアップする
  • ピッカーに入力した内容がテキストフィールドに入る
  • テキストフィールドは20210716のように YYYYMMDD の形式になっている

ただ、v-date-pickerには YYYYMMDD 形式で入力できないため、入力時にテキストフィールドに値をセットし、フォームではテキストフィールドから値を取り出す形になりそうでした。
[参考]https://vuetifyjs.com/ja/components/date-pickers/#section-30b530f330d730eb

そんなUIを、公式ドキュメントを参考にしつつ、できるだけシンプルなもので作成してみました。

やってみたこと

  • v-date-pickerのv-modelにセットするデータとv-text-fieldのv-modelにセットするデータは分ける
  • v-date-pickerで入力したら、データを YYYYMMDD 形式に変換してv-text-fieldのv-modelにセットしたデータに入れる(&ピッカーを閉じる)

実際に作ってみたコードは次のようになりました

<template>
  <div>
    <v-menu v-model="menu">
      <template v-slot:activator="{ on, attrs }">
        <v-text-field v-model="text" v-bind="attrs" v-on="on" readonly clearable>
        </v-text-field>
      </template>
      <v-date-picker v-model="picker" @input="formatDate(picker)">
      </v-date-picker>
    </v-menu>
    picker: {{ picker }}
  </div>
</template>
<script>
export default {
  data() {
    return {
      menu: "",
      text: "",
      picker: "",
    };
  },
  methods: {
    formatDate(date) {
      if (!date) return null;
      const [year, month, day] = date.split("-");
      this.text = `${year}${month}${day}`;
      this.menu = false;
      return;
    },
  },
};
</script>

動作はこのようになります

まとめ

  • v-date-pickerには YYYYMMDD 形式で入力できない
  • v-date-pickerを使って YYYYMMDD 形式でセットするフィールドをつくるには、v-text-fieldを組み合わせると楽
    • v-date-pickerのv-modelにセットするデータとv-text-fieldのv-modelにセットするデータは分ける
    • v-date-pickerで入力したら、データを YYYYMMDD 形式に変換してv-text-fieldのv-modelにセットしたデータに入れる(&ピッカーを閉じる)

Discussion