Skip to content

Calendar 日历

像素风格的日历组件,支持日期选择、月份导航、键盘操作和多语言。

名称分类说明类型默认值
type? 风格颜色类型'primary' | 'success' | 'info' | 'warning' | 'danger'
color? 颜色自定义十六进制颜色string
modelValue / v-model? 状态当前选中的日期Date
defaultMonth? 状态初始显示月份Date
minDate? 状态可选范围的最小日期Date
maxDate? 状态可选范围的最大日期Date
disabledDate? 行为判断日期是否禁用的函数(date: Date) => boolean
showOutsideDays? 行为是否显示当前月份之外的日期booleantrue
weekStartsOn? 行为每周起始日(0=周日,1=周一)0 | 10
yearRange? 行为年份下拉选择器的范围 [起始年, 结束年][number, number][currentYear - 10, currentYear + 10]
update:modelValue? 事件选中日期变化时触发(date: Date) => void
month-change? 事件切换月份时触发(date: Date) => void
focus? 暴露聚焦到日历() => void
prevMonth? 暴露导航到上个月() => void
nextMonth? 暴露导航到下个月() => void

基础用法

使用 v-model 绑定选中的日期。日历默认显示当前月份。

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

const date = ref<Date>();
</script>

<template>
  <div class="demo-calendar">
    <px-calendar v-model="date" />
    <p v-if="date">Selected: {{ date.toLocaleDateString() }}</p>
  </div>
</template>

<style scoped>
.demo-calendar {
  display: flex;
  flex-direction: column;
  gap: 12px;
  align-items: flex-start;
}
</style>

类型

使用 type 属性设置日历颜色主题。

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

const date = ref<Date>();
</script>

<template>
  <div class="demo-calendar-types">
    <px-calendar v-model="date" type="primary" />
    <px-calendar v-model="date" type="success" />
    <px-calendar v-model="date" type="warning" />
    <px-calendar v-model="date" type="danger" />
    <px-calendar v-model="date" type="info" />
  </div>
</template>

<style scoped>
.demo-calendar-types {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
}
</style>

禁用日期

使用 disabledDate 函数或 minDate/maxDate 来限制可选日期。

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

const date = ref<Date>();

const isWeekend = (d: Date) => d.getDay() === 0 || d.getDay() === 6;

const today = new Date();
const minDate = new Date(today.getFullYear(), today.getMonth(), 1);
const maxDate = new Date(today.getFullYear(), today.getMonth() + 1, 0);
</script>

<template>
  <div class="demo-calendar-disabled">
    <div>
      <p>Disable weekends:</p>
      <px-calendar v-model="date" :disabled-date="isWeekend" />
    </div>
    <div>
      <p>Date range (current month only):</p>
      <px-calendar v-model="date" :min-date="minDate" :max-date="maxDate" />
    </div>
  </div>
</template>

<style scoped>
.demo-calendar-disabled {
  display: flex;
  flex-wrap: wrap;
  gap: 24px;
}
</style>

自定义颜色

使用 color 属性设置自定义十六进制颜色。

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

const date = ref<Date>();
</script>

<template>
  <div class="demo-calendar-color">
    <px-calendar v-model="date" color="#e64553" />
    <px-calendar v-model="date" color="#8839ef" />
    <px-calendar v-model="date" color="#40a02b" />
  </div>
</template>

<style scoped>
.demo-calendar-color {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
}
</style>