Vant4 DatePicker 日期選擇

2023-02-16 17:55 更新

介紹

日期選擇器,用于選擇年、月、日,通常與彈出層組件配合使用。

引入

通過以下方式來全局注冊組件,更多注冊方式請參考組件注冊。

import { createApp } from 'vue';
import { DatePicker } from 'vant';

const app = createApp();
app.use(DatePicker);

代碼演示

基礎(chǔ)用法

通過 ?v-model? 綁定當前選中的日期,通過 ?min-date? 和 ?max-date? 屬性來設(shè)定可選的時間范圍。

<van-date-picker
  v-model="currentDate"
  title="選擇日期"
  :min-date="minDate"
  :max-date="maxDate"
/>
import { ref } from 'vue';

export default {
  setup() {
    const currentDate = ref(['2021', '01', '01']);
    return {
      minDate: new Date(2020, 0, 1),
      maxDate: new Date(2025, 5, 1),
      currentDate,
    };
  },
};

選項類型

通過 ?columns-type? 屬性可以控制選項的類型,支持以任意順序?qū)?nbsp;?year?、?month? 和 ?day? 進行排列組合。

比如:

  • 傳入 ?['year']? 來單獨選擇年份。
  • 傳入 ?['month']? 來單獨選擇月份。
  • 傳入 ?['year', 'month']? 來選擇年份和月份。
  • 傳入 ?['month', 'day']? 來選擇月份和日期。
<van-date-picker
  v-model="currentDate"
  title="選擇年月"
  :min-date="minDate"
  :max-date="maxDate"
  :columns-type="columnsType"
/>
import { ref } from 'vue';

export default {
  setup() {
    const currentDate = ref(['2021', '01']);
    const columnsType = ['year', 'month'];
    return {
      minDate: new Date(2020, 0, 1),
      maxDate: new Date(2025, 5, 1),
      currentDate,
      columnsType,
    };
  },
};

格式化選項

通過傳入 ?formatter? 函數(shù),可以對選項文字進行格式化處理。

<van-date-picker
  v-model="currentDate"
  title="選擇年月"
  :min-date="minDate"
  :max-date="maxDate"
  :formatter="formatter"
  :columns-type="columnsType"
/>
import { ref } from 'vue';

export default {
  setup() {
    const currentDate = ref(['2021', '01']);
    const columnsType = ['year', 'month'];

    const formatter = (type, option) => {
      if (type === 'year') {
        option.text += '年';
      }
      if (type === 'month') {
        option.text += '月';
      }
      return option;
    };

    return {
      minDate: new Date(2020, 0, 1),
      maxDate: new Date(2025, 5, 1),
      formatter,
      currentDate,
      columnsType,
    };
  },
};

過濾選項

通過傳入 ?filter? 函數(shù),可以對選項數(shù)組進行過濾,實現(xiàn)自定義選項間隔。

<van-date-picker
  v-model="currentDate"
  title="選擇年月"
  :filter="filter"
  :min-date="minDate"
  :max-date="maxDate"
  :columns-type="columnsType"
/>
import { ref } from 'vue';

export default {
  setup() {
    const currentDate = ref(['2021', '01']);
    const columnsType = ['year', 'month'];
    const filter = (type, options) => {
      if (type === 'month') {
        return options.filter((option) => Number(option.value) % 6 === 0);
      }
      return options;
    };

    return {
      filter,
      minDate: new Date(2020, 0, 1),
      maxDate: new Date(2025, 5, 1),
      currentTime,
      columnsType,
    };
  },
};

API

Props

參數(shù) 說明 類型 默認值
v-model 當前選中的日期 string[] []
columns-type 選項類型,由 yearmonth 和 day 組成的數(shù)組 string[] ['year', 'month', 'day']
min-date 可選的最小時間,精確到日 Date 十年前
max-date 可選的最大時間,精確到日 Date 十年后
title 頂部欄標題 string ''
confirm-button-text 確認按鈕文字 string 確認
cancel-button-text 取消按鈕文字 string 取消
show-toolbar 是否顯示頂部欄 boolean true
loading 是否顯示加載狀態(tài) boolean false
readonly 是否為只讀狀態(tài),只讀狀態(tài)下無法切換選項 boolean false
filter 選項過濾函數(shù) (type: string, options: PickerOption[]) => PickerOption[] -
formatter 選項格式化函數(shù) (type: string, option: PickerOption) => PickerOption -
option-height 選項高度,支持 px vw vh rem 單位,默認 px number | string 44
visible-option-num 可見的選項個數(shù) number | string 6
swipe-duration 快速滑動時慣性滾動的時長,單位 ms number | string 1000

Events

事件名 說明 回調(diào)參數(shù)
confirm 點擊完成按鈕時觸發(fā) { selectedValues, selectedOptions }
cancel 點擊取消按鈕時觸發(fā) { selectedValues, selectedOptions }
change 選項改變時觸發(fā) { selectedValues, selectedOptions, columnIndex }

Slots

名稱 說明 參數(shù)
toolbar 自定義整個頂部欄的內(nèi)容 -
title 自定義標題內(nèi)容 -
confirm 自定義確認按鈕內(nèi)容 -
cancel 自定義取消按鈕內(nèi)容 -
option 自定義選項內(nèi)容 option: PickerOption
columns-top 自定義選項上方內(nèi)容 -
columns-bottom 自定義選項下方內(nèi)容 -

類型定義

組件導(dǎo)出以下類型定義:

import type { DatePickerProps, DatePickerColumnType } from 'vant';

常見問題

設(shè)置 min-date 或 max-date 后出現(xiàn)頁面卡死的情況?

請注意不要在模板中直接使用類似 ?min-date="new Date()"? 的寫法,這樣會導(dǎo)致每次渲染組件時傳入一個新的 Date 對象,而傳入新的數(shù)據(jù)會觸發(fā)下一次渲染,從而陷入死循環(huán)。

正確的做法是將 ?min-date? 作為一個數(shù)據(jù)定義在 ?data? 函數(shù)或 ?setup? 中。

在 iOS 系統(tǒng)上初始化組件失???

如果你遇到了在 iOS 上無法渲染組件的問題,請確認在創(chuàng)建 Date 對象時沒有使用 ?new Date('2020-01-01')? 這樣的寫法,iOS 不支持以中劃線分隔的日期格式,正確寫法是 ?new Date('2020/01/01')?。

對此問題的詳細解釋:stackoverflow。

在桌面端無法操作組件?

參見桌面端適配。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號