Skip to content

日期选择器配置

通过给 dateRange / datetimeRange 类型的 item 配置 pickerOptions,可以透传给内部 tiny-date-pickerpicker-options,支持快捷选项(shortcuts)、自定义周首日(firstDayOfWeek)、选中回调(onPick)以及禁用日期(disabledDate)。

其中 disabledDate 会与组件内部基于 maxTimeLength / min / max 的禁用逻辑合并:任一返回 true 即禁用该日期,方便在保留内置校验的同时叠加自定义限制。

注意

search-box 内部使用两个独立的单日期选择器(开始 / 结束),并非一个 daterange 范围选择器。因此 shortcutsonClick 中应通过 picker.$emit('pick', 单个日期) 回填单个日期(emit 数组无法回填),快捷项会填入当前打开的那个选择器。建议使用「今天 / 昨天 / 一周前 / 一个月前」这类单日期快捷项。

<template>
  <ClientOnly>
    <tiny-search-box v-model="tags" :items="items" @change="onChange" />
  </ClientOnly>
</template>

<script setup lang="ts">
import { reactive, ref } from "vue";

const tags = ref([]);

const items = reactive([
  {
    label: "日期",
    field: "date",
    type: "dateRange",
    format: "yyyy/MM/dd",
    // 通过 pickerOptions 透传给内部 tiny-date-picker,这里演示快捷选项与自定义周首日
    // 注意:search-box 内部使用两个独立的单日期选择器(开始/结束),并非一个 daterange 范围选择器,
    // 因此 shortcuts 的 onClick 需 emit 单个日期(emit 数组无法回填),快捷项会填入当前打开的那个选择器
    pickerOptions: {
      firstDayOfWeek: 1,
      shortcuts: [
        {
          text: "今天",
          onClick(picker) {
            picker.$emit("pick", new Date());
          },
        },
        {
          text: "昨天",
          onClick(picker) {
            const date = new Date();
            date.setTime(date.getTime() - 3600 * 1000 * 24);
            picker.$emit("pick", date);
          },
        },
        {
          text: "一周前",
          onClick(picker) {
            const date = new Date();
            date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
            picker.$emit("pick", date);
          },
        },
        {
          text: "一个月前",
          onClick(picker) {
            const date = new Date();
            date.setMonth(date.getMonth() - 1);
            picker.$emit("pick", date);
          },
        },
      ],
      // 自定义 disabledDate,会与组件内部禁用逻辑合并(任一返回 true 即禁用)
      disabledDate(time) {
        // 禁用今天之后的所有日期
        return time.getTime() > Date.now();
      },
    },
  },
  {
    label: "时间日期",
    field: "datetime",
    type: "datetimeRange",
    format: "yyyy/MM/dd HH:mm:ss",
    pickerOptions: {
      firstDayOfWeek: 7,
      shortcuts: [
        {
          text: "今天",
          onClick(picker) {
            picker.$emit("pick", new Date());
          },
        },
        {
          text: "昨天",
          onClick(picker) {
            const date = new Date();
            date.setTime(date.getTime() - 3600 * 1000 * 24);
            picker.$emit("pick", date);
          },
        },
      ],
    },
  },
]);

const onChange = (newFilters, oldFilters) => {
  console.log("changeEvent:", newFilters, oldFilters);
};
</script>