- 前端
- UI组件
【免费下载链接】v-calendar
An elegant calendar and datepicker plugin for Vue.
V-Calendar 是一个面向 Vue.js 的现代、灵活的日历与日期选择器插件,通过「属性(Attributes)」机制为日历添加高亮区域、圆点、横条、内容样式乃至弹出层(Popover)等视觉装饰。本篇快速上手指南将带你完成从安装、注册到渲染第一个日历与日期选择器的全过程,并深入插件源码,理解
Vue.use()背后的组件注册与全局默认配置机制。读完本文,你将能够在自己基于 Vue 2.5+ 的应用中独立接入 V-Calendar,并正确配置其全局默认项。
认识 V-Calendar
V-Calendar 的核心设计理念是:用数据描述视觉。它使用attributes(属性数组)来装饰日历,每一种属性都可以表现为以下视觉指示器:
- 高亮的日期区域(highlight)
- 圆点(dot)
- 横条(bar)
- 内容样式类(content classes)
- 用于简单提示或自定义插槽内容的弹出层(popover)
这些指示器不仅适用于单个日期、日期区间,还支持复杂日期模式,例如:
- 每隔一个周五(every other Friday)
- 每月 15 号
- 每隔一月的最后一个周五
与此同时,插件开箱即用地内置了日期选择器v-date-picker,支持单日期、多日期、日期范围三种选择模式。由于v-date-picker本质上是v-calendar的一个包装组件,因此它继承了后者相同的 props、插槽与自定义主题能力。此外,V-Calendar 具备响应式布局,对移动端友好。
在动手之前,需要注意版本前提:插件要求 Vue.js)。当前仓库package.json中声明的主版本为2.4.2,其peerDependencies明确为vue: "^2.5.18",与文档要求一致。
安装 V-Calendar
1. 通过 NPM 安装
npm install v-calendar安装完成后,插件的主要产物位于lib目录(main字段指向lib/v-calendar.umd.min.js),源码则位于src,二者均已通过package.json的files字段声明随包发布。
2. 通过 CDN 引入
<html> <head> <meta charset='utf-8'> <meta name='viewport' content='width=device-width, initial-scale=1, shrink-to-fit=no'> <meta http-equiv='x-ua-compatible' content='ie=edge'> <!-- 注意:自 v1 起无需引入 CSS 链接,样式已全部内联 --> <!-- v1.0.0 之前的版本需要引入压缩后的 css --> <!-- <link rel='stylesheet' href='https://unpkg.com/v-calendar/lib/v-calendar.min.css'> --> </head> <body> <div id='app'> <v-calendar></v-calendar> <v-date-picker v-model='selectedDate' /> </div> <!-- 1. 引入 Vue --> <script src='https://unpkg.com/vue/dist/vue.js'></script> <!-- 2. 引入 VCalendar(插件会自动安装) --> <script src='https://unpkg.com/v-calendar'></script> <!-- 3. 创建 Vue 实例 --> <script> new Vue({ el: '#app', data: { selectedDate: null, } }) </script> </body> </html>为什么 CDN 场景不需要单独的 CSS 文件?这可以从构建配置中找到依据:vue.config.js 中设置了css.extract: false,同时 package.json 的build:lib脚本以库模式构建src/lib.js,样式会被直接内联进 JS 产物,因此运行时无需额外请求样式表。
在应用中引入并注册组件
方式 A:插件方法(推荐)
这是最常见的用法,通过Vue.use()一次性注册全部组件:
import Vue from 'vue'; import VCalendar from 'v-calendar'; // 注册 v-calendar 与 v-date-picker 组件 Vue.use(VCalendar, { componentPrefix: 'vc', // 使用 <vc-calendar /> 代替 <v-calendar /> // ...其他全局默认配置 });componentPrefix用于给所有组件名加前缀,当v-calendar、v-date-picker与项目中的其他组件库命名冲突时,通过它即可轻松规避。
方式 B:组件方法
如果只需要个别组件,可以单独引入(以构建产物lib/components下的 UMD 文件为例):
import Calendar from 'v-calendar/lib/components/calendar.umd' import DatePicker from 'v-calendar/lib/components/date-picker.umd' // 在 main.js 中全局注册 Vue.component('calendar', Calendar) Vue.component('date-picker', DatePicker) // 或者在某个组件内局部注册 export default { components: { Calendar, DatePicker } // ... }若采用组件方式引入、但仍希望提供 插件默认配置,需要在任何组件使用之前调用setupCalendar:
import { setupCalendar } from 'v-calendar' // main.js setupCalendar({ componentPrefix: 'vc', // ...其他默认配置 });插件安装原理:Vue.use()背后的调用链
理解了两种注册方式后,不妨从源码层面看一下插件到底做了什么。核心实现在 src/lib.js:
// src/lib.js(节选) function install(Vue, opts) { // 防止重复安装 if (install.installed) return; install.installed = true; // 用选项初始化全局默认配置 const defaults = utils.setupCalendar(opts); // 逐个注册组件,组件名带上前缀 Object.entries(components).forEach(([componentName, component]) => { Vue.component(`${defaults.componentPrefix}${componentName}`, component); }); }关键调用链如下:
install()被Vue.use(plugin, opts)触发,首先通过install.installed标志保证只安装一次;- 调用
setupCalendar(opts)(见 src/utils/setup.js),它内部会依次执行setupDefaults(opts)注册插件默认值、setupScreens(defaults.screens, true)安装响应式屏幕断点支持; - 遍历 src/components/index.js 导出的组件(
Calendar、CalendarNav、DatePicker、Popover等),以`${componentPrefix}${componentName}`的形式注册为全局组件——这就是componentPrefix前缀生效的位置。
值得注意的一点:lib.js还会探测全局 Vue 实例(window.Vue或global.Vue),一旦检测到就自动执行Vue.use(plugin)。这正是 CDN 场景下「无需手动注册、引入即用」的原因(见src/lib.js第 24-33 行)。
默认配置的存储也颇有讲究:在 src/utils/defaults/index.js 中,setupDefaults使用defaultsDeep(opts, pluginDefaults)将用户选项与内置默认值深度合并,并挂载到一个内部 Vue 实例的data上,使其具备响应式能力;同时导出的defaultsMixin为各组件提供$defaults与$locales计算属性,组件内通过propOrDefault()即可读取「组件 prop 优先、全局默认值兜底」的配置值。
第一个日历组件:<v-calendar />
安装与注册完成后,只需一行模板即可渲染出一个日历:
<v-calendar />v-calendar是插件的核心组件(实现见 src/components/Calendar.vue)。其默认设计是中性的——不预设品牌风格,可以自然融入任意 Web 应用,并提供了丰富的布局与交互配置:
- 响应式多行、多列布局:可通过
rows、columns属性构建网格状日历面板,并配合全局screens断点实现响应式切换; - 插槽支持:可自定义头部与日期单元格内容;
- 语义化导航弹出层:点击头部标题弹出月份/年份导航面板,支持快捷跳转;
- 导航过渡动画:切换月份/年份时支持水平滑动(slide-h)、垂直滑动(slide-v)与淡入淡出(fade)等过渡效果(相关过渡实现见
CustomTransition组件)。
结合「属性」机制,日历可以立即变得生动。属性的基础结构(详见 Attributes 文档)如下:
data() { return { // 属性以数组形式提供 attributes: [ { // 可选 key,便于后续检索该属性 key: 'today', // 视觉指示器:高亮 / 圆点 / 横条 / 内容样式,均支持 Boolean、String、Object highlight: { color: '#ff8080' }, dot: true, bar: 'red', content: { class: 'is-holiday' }, popover: { label: '今天有安排' }, // 自定义数据,便于事件处理时取回业务信息 customData: { todoCount: 3 }, // 单个日期、日期数组、日期区间或复杂日期模式 dates: new Date(), // 可选:排除的日期 excludeDates: null, // 类似 z-index,用于控制多个属性叠加时的层级 order: 0 } ]; } }<v-calendar :attributes='attributes' />当多个高亮区域相互重叠时,插件默认按「信息量最大化」排序:单日期区域高于日期区间,起始日期更晚的区间位于更早的区间之上;如需强制某个属性置顶,为其设置大于 0 的order值即可。
开箱即用的日期选择器:<v-date-picker />
日期选择器是插件的另一大卖点,它内置三种选择模式:单日期(single)、多日期(multiple)、日期范围(range)。基本用法:
<v-date-picker v-model='selectedDate' />v-date-picker是v-calendar的包装组件,因此它继承了日历的全部 props、插槽与主题定制能力,同时额外提供日期选择器专属的全局默认项(见下节)。例如,datePicker.updateOnInput控制是否在每次input事件时即时更新选中值(默认true),datePicker.inputDebounce控制输入防抖时长(默认1000ms),datePicker.popover则控制弹出层的行为(如visibility默认hover-focus、placement默认bottom-start、keepVisibleOnInput默认false,源码见 src/utils/defaults/index.js 第 19-28 行)。
更完整的选择模式、事件与插槽说明可查阅 Date Picker 文档 与 v2.0 日历 API。
全局默认配置一览
无论是通过Vue.use(VCalendar, {...})还是setupCalendar({...})传入的选项,都会被深度合并进插件默认配置。以下为主要默认项(说明见 默认配置 API,默认值可对照 src/utils/defaults/index.js 的pluginDefaults与masks.json、screens.json、touch.json):
| 配置项 | 类型 | 说明 | 默认值 |
|---|---|---|---|
componentPrefix | String | 组件名前缀,用于规避命名冲突 | "v" |
titlePosition | String | 头部标题位置:left/center/right | "center" |
navVisibility | String | 导航面板显示时机:focus/hover/visible/hidden(当前仓库源码默认click) | "focus" |
transition | String | 页面切换过渡:slide-h/slide-v/fade/none | 单行单列时slide-h,否则fade |
masks | Object | 各区域日期显示与解析的掩码 | 见masks.json |
screens | Object | 响应式布局断点 | sm: 640px、md: 768px、lg: 1024px、xl: 1280px |
locale | String/Object | 语言区域标识(language-region格式)或区域配置对象 | undefined |
locales | Object | 覆盖/新增语言区域,可配置firstDayOfWeek(1-7,周日至周六)、masks等 | — |
datePicker | Object | 仅作用于日期选择器的默认项 | 见下文 |
touch | Object | 触摸滑动手势参数 | maxSwipeTime: 300ms、minHorizontalSwipeDistance: 60px、maxVerticalSwipeDistance: 80px |
其中datePicker的子项包括:
| 配置项 | 类型 | 说明 | 默认值 |
|---|---|---|---|
datePicker.updateOnInput | Boolean | 是否在每次input事件后更新选中值 | true |
datePicker.inputDebounce | Number | 输入防抖时长(毫秒) | 1000 |
datePicker.popover.visibility | String | 弹出层显示时机:hover-focus/hover/focus/click/visible/hidden | "hover-focus" |
datePicker.popover.keepVisibleOnInput | Boolean | 有效输入后是否保持弹出层可见 | false |
datePicker.popover.placement | String | 弹出层建议位置(可能随窗口尺寸变化) | "bottom"(源码默认"bottom-start") |
一个同时定制前缀与常用默认项的完整示例:
import Vue from 'vue'; import VCalendar from 'v-calendar'; Vue.use(VCalendar, { componentPrefix: 'vc', titlePosition: 'left', navVisibility: 'hover', transition: 'fade', masks: { title: 'YYYY 年 MMMM', input: ['YYYY-MM-DD'], }, screens: { sm: '600px', md: '900px', }, datePicker: { updateOnInput: true, inputDebounce: 800, popover: { visibility: 'click', placement: 'bottom', keepVisibleOnInput: false, }, }, });说明:以上默认值中,个别项在 默认配置 API 与当前仓库源码(版本 2.4.2)的
pluginDefaults之间存在细微差异(如navVisibility、placement),实际行为以你安装版本对应的src/utils/defaults/index.js与defaults.json为准。文档与源码不一致时,源码是运行时事实。
更多资源与下一步
- 安装指南:完整的安装、引入与 CDN 使用说明
- Attributes 文档:深入理解高亮、圆点、横条、内容与弹出层的组合玩法
- Date Picker 文档:日期选择器的模式、事件与插槽
- 默认配置 API:全部可全局配置项的详细说明
- v2.0 日历 API:
v-calendar组件的完整 props、事件与插槽参考 - 源码:src/lib.js(插件安装入口)、src/utils/setup.js(默认配置初始化)、src/components/Calendar.vue(核心日历组件)
- 测试:Calendar.spec.js 与 DatePicker.spec.js 展示了组件行为的可验证示例
至此,你已经掌握了 V-Calendar 的安装、注册、基础渲染与全局配置方法。下一步可以从 Attributes 文档 入手,用数据驱动的方式为日历注入高亮、圆点与弹出层,构建真正贴合业务场景的日历体验。
- 前端
- UI组件
【免费下载链接】v-calendar
An elegant calendar and datepicker plugin for Vue.
相关推荐
Classic Power Menu社区贡献指南:如何参与这个开源Android项目的开发
Classic Power Menu社区贡献指南:如何参与这个开源Android项目的开发 Classic Power Menu是一个专为Android 11+
V-Calendar:优雅的Vue.js日历和日期选择器插件
V Calendar:优雅的Vue.js日历和日期选择器插件 V Calendar是一个专为Vue.js设计的现代化日历和日期选择器插件,它提供了丰富的视觉指示
前端UI组件CANN/asc-devkit废弃类型转换API
asc_int4x22bfloat16 废弃 产品支持情况 | 产品 | 是否支持 | | | : : | | Ascend 950PR/Ascend 950D
人工智能深度学习算子库CANNAscend
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考