多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Vuetify 月份选择器(VDatePicker type=“month“)完全指南:从基础用法到进阶实战

Vuetify 月份选择器(VDatePicker type=“month“)完全指南:从基础用法到进阶实战 Vuetify 月份选择器VDatePicker typemonth完全指南从基础用法到进阶实战【免费下载链接】vuetify Vue Component Framework项目地址: https://gitcode.com/gh_mirrors/vu/vuetify导读本文聚焦 Vuetify 中v-date-picker组件以typemonth形态运行时的月份选择能力。作为独立的月份选择器界面它允许用户单独选择月份或同时选择月份与年份是构建报表筛选、账期选择、订阅周期管理等场景的高频组件。读完本文你将掌握月份选择器的两种朝向配置、allowed-months 等核心 prop 的三种传参方式、与v-text-field集成的 Dialog/Menu 组合方案以及多选、国际化、只读等进阶用法并了解其底层源码VDatePicker.tsx、VDatePickerMonths.tsx是如何支撑这些行为的。一、月份选择器是什么在 Vuetify 中v-date-picker是一个全能型日期选择组件通过切换type属性可以在三种模式间流转typedate默认完整日期日、月、年选择typemonth月份选择即本文主题typeyear年份选择。当设置typemonth时组件渲染为独立的月份选择器。从源码结构看VDatePicker.tsxVDatePicker内部实际上是一个组合式容器它将 VDatePickerControls顶部年月导航控件、VDatePickerHeader头部标题区、VDatePickerMonths12 个月份网格与 VDatePickerYears年份列表按viewMode切换渲染。当用户点击年份控件时视图会切换到年份列表点击月份后切回月份网格。月份网格本身由VDatePickerMonths承担它基于createRange(12)生成 12 个按钮并通过useGridSelection提供键盘方向键导航与data-v-month网格定位。注意本文档对应仓库中的packages/docs/src/pages/en/components/date-pickers-month.md在 docs 源码中该页面标记为disabled: truedate-pickers-month.md但这不影响其示例与组件行为在源码仓库中的可用性所有示例文件均存在于 v-date-picker-month 目录下。二、基础用法Usage月份选择器有 portrait竖版默认和 landscape横版两种朝向。最简单的用法如下template v-row classjustify-center v-date-picker v-modelpicker typemonth /v-date-picker /v-row /template script export default { data () { return { picker: (new Date(Date.now() - (new Date()).getTimezoneOffset() * 60000)).toISOString().substr(0, 10), } }, } /script对应示例文件usage.vue。几点需要说明model 值格式月份选择器的v-model接受YYYY-MM形式的月份字符串如2017-12示例中为了统一演示初始值用 ISO 字符串截取得到。请以实际业务需要的YYYY-MM字符串为准。默认选中若不给v-model赋值从源码看VDatePickerMonths.tsx 中的watchEffect内部会用adapter.getMonth(adapter.date())将模型回填为当前月份。朝向切换通过landscapeprop 切换为横版布局横版下头部会显示在侧边。相关示例见 misc-orientation.vuev-date-picker v-modelpicker :landscapelandscape typemonth /v-date-picker三、核心 Props 详解月份选择器继承自VDatePicker的整套 props定义于 VDatePicker.tsx下面按文档示例逐一展开。3.1 Allowed months限定可选月份allowed-datesprop 可以限制可选择的月份支持三种传参形式数组显式列出允许的日期字符串对象以日期为键、布尔值为值的映射函数接收日期字符串返回布尔值true表示允许选择。官方示例prop-allowed-months.vue配合min/max使用函数形式只允许偶数月template v-row classjustify-center v-date-picker v-modeldate :allowed-datesallowedMonths classmt-4 max2019-10 min2017-06 typemonth /v-date-picker /v-row /template script export default { data () { return { date: 2017-12, } }, methods: { // 只允许选择偶数月份 allowedMonths: val parseInt(val.split(-)[1], 10) % 2 0, }, } /script提示min2017-06、max2019-10在这里同样接受YYYY-MM格式的月份字符串作为边界。源码侧佐证VDatePicker会把allowed-dates解析为allowedMonths计算属性见 VDatePicker.tsx 与isMonthAllowed实现数组形式会检查“该月内是否存在任一被允许的日期”函数形式则遍历该月每一天调用回调随后传入VDatePickerMonths的allowedMonthsprop在 VDatePickerMonths.tsx 中逐月计算isDisabled禁用态月份按钮不可点击。3.2 Colors颜色定制月份选择器的颜色通过color和header-color两个 prop 控制color选中月份按钮的主色header-color头部标题区颜色若未提供头部自动使用color的值。对应源码逻辑在 VDatePicker.tsxconst headerColor toRef(() props.headerColor ?? props.color)官方示例prop-colors.vuev-date-picker v-modelpicker colorgreen-lighten-1 typemonth /v-date-picker v-date-picker v-modelpicker2 colorgreen-lighten-1 header-colorprimary typemonth /v-date-picker第一个只设置了color头部与选中态共用绿色第二个额外设置header-colorprimary头部独立使用主题 primary 色。3.3 Icons图标覆盖picker 默认使用的导航图标可以通过next-icon、prev-icon、year-icon等 prop 覆盖为任意 Material Design Icons 名称依赖项目已安装的 mdi 图标集。官方示例prop-icons.vuev-date-picker v-modelpicker next-iconmdi-skip-next prev-iconmdi-skip-previous typemonth year-iconmdi-calendar-blank /v-date-picker这些图标最终由 VDatePickerControls.tsx 渲染在顶部导航按钮上分别对应“下一个月/上一个月/切换到年份视图”。3.4 Multiple多选月份通过multipleprop 可以一次选择多个月份此时v-model必须为数组。官方示例prop-multiple.vuev-date-picker v-modelmonths typemonth multiple /v-date-pickermonths: [2018-09, 2018-10]源码侧VDatePicker的useProxiedModel转换逻辑VDatePicker.tsx在multiple为真时将模型包裹为数组写入时若为单值则取v[0]。此外multiple也支持range字符串值或数字上限见 VDatePickerMonth.tsx 的类型定义当作为数字传入时表示最多可选的月份数量。3.5 Readonly只读模式添加readonlyprop 即可禁止用户选择新日期适合展示型场景。官方示例prop-readonly.vuev-date-picker v-modeldate typemonth readonly /v-date-picker3.6 Show current高亮“当前月份”默认情况下当前月份会以描边outlined按钮形式突出显示。show-currentprop 允许你设为false移除当前月份的高亮边框传一个月份字符串如2013-07指定将哪个月份作为“当前”高亮显示。官方示例prop-show-current.vue!-- 取消当前月高亮 -- v-date-picker v-modelmonth1 :show-currentfalse typemonth /v-date-picker !-- 将 2013-07 作为“当前”月份高亮 -- v-date-picker v-modelmonth2 show-current2013-07 typemonth /v-date-picker3.7 Width 与 Full-width宽度控制使用widthprop 指定固定宽度支持数字或带单位的字符串如290使用full-width让 picker 撑满父容器宽度。官方示例prop-width.vuev-date-picker v-modeldate typemonth width290 /v-date-picker v-date-picker v-modeldate typemonth full-width /v-date-picker四、进阶实战Dialog 与 Menu 集成在表单中月份选择器最常见的用法是挂载到v-text-field上通过v-menu或v-dialog弹出。官方示例misc-dialog-and-menu.vue给出了完整实现核心要点如下给v-text-field添加readonly避免点击输入框时弹出移动端键盘使用no-title隐藏 picker 标题节省垂直空间利用 picker 暴露的 slot 挂钩保存/取消逻辑v-menu的save(date)会在确认时把暂存值写回模型取消则维持旧值不变。以 Menu 为例v-menu refmenu v-modelmenuActive v-model:return-valuedate :close-on-content-clickfalse max-width290px min-widthauto transitionscale-transition template v-slot:activator{ props } v-text-field v-modeldate labelPicker in menu prepend-iconmdi-calendar readonly v-bindprops /v-text-field /template v-date-picker v-modeldate typemonth no-title scrollable v-spacer/v-spacer v-btn colorprimary varianttext clickmenu false Cancel /v-btn v-btn colorprimary varianttext clickmenu.save(date) OK /v-btn /v-date-picker /v-menuDialog 的写法几乎相同区别在于使用v-dialog包裹width290px且persistent点击遮罩不自动关闭确定按钮调用dialog.save(date)取消按钮直接modal false。这套模式能实现“确认前不改值、取消即还原”的交互因为v-menu/v-dialog的return-value绑定会在save()被调用时才提交到date。五、国际化Internationalization月份选择器通过 JavaScript 原生Date对象支持国际化使用localeprop 传入 BCP 47 语言标签月份名称、头部文案、导航文案等都会随之本地化。官方示例misc-internationalization.vue演示了泰语th与瑞典语sv-sev-date-picker v-modelpicker localeth typemonth /v-date-picker v-date-picker v-modelpicker localesv-se typemonth /v-date-picker从源码看月份按钮的文本与无障碍标签由日期适配器useDate()的format(date, monthShort)/format(date, month)生成见 VDatePickerMonths.tsx因此月份名完全跟随所设置的 locale。Vuetify 默认使用原生 Intl 能力date适配器位于 packages/vuetify/src/composables/date也支持通过date选项替换为 dayjs 等自定义适配器。六、朝向切换Orientation月份选择器支持两种朝向默认portrait竖版设置landscape后切换为横版头部信息区移动到左侧、内容区占据剩余宽度。官方示例misc-orientation.vue用一个v-checkbox动态切换v-checkbox v-modellandscape labelLandscape /v-checkbox v-date-picker v-modelpicker :landscapelandscape typemonth /v-date-picker横版下头部文案的行内换行处理可以在 VDatePicker.tsx 中看到当格式化后的头部日期为三段式含星期时VDatePicker会用换行符将其拆成两行显示以适应横版较窄的头部区域。横版头部的宽度还可以通过landscapeHeaderWidthprop 进一步定制。七、使用注意事项Caveats::: warningv-date-picker接受ISO 8601的日期字符串YYYY-MM-DD。关于 ISO 8601 及其它日期标准的更多信息请参阅国际标准化组织ISO发布的官方标准文档。 :::落实到月份选择器场景需要特别注意模型格式月份选择器的v-model使用YYYY-MM如2018-09、2013-07这种“月份级”字符串而底层日期适配器解析时仍遵循 ISO 8601 规范如show-current2013-07会被解析为 2013 年 7 月当与v-text-field、v-menu的return-value组合时请保持全链路格式一致。时区与截取官方示例中常用new Date().toISOString().substr(0, 7)生成当前月份字符串请注意toISOString()返回的是 UTC 时间在非 UTC 时区边缘场景可能产生一天偏差生产代码建议使用YYYY-MM显式构造。readonly与键盘将 picker 嵌入v-text-field时务必给输入框加readonly否则移动端会弹出软键盘干扰操作见本文第四节。八、相关组件与继续探索月份选择器与以下 Vuetify 组件/文档配合使用效果最佳日期选择器整体能力date-pickers弹出层容器menus时间选择器time-pickers月份网格源码VDatePickerMonths.tsx组合容器源码VDatePicker.tsx月份模式测试VDatePicker.month.spec.ts含快照 VDatePicker.month.spec.ts.snap可用来验证月份选择、多选、范围选择等行为。结语本文围绕v-date-picker typemonth从基础用法、核心 propsallowed-dates、color/header-color、icons、multiple、readonly、show-current、width/full-width到 Dialog/Menu 集成、国际化与朝向切换做了完整梳理并结合 VDatePicker.tsx 与 VDatePickerMonths.tsx 等源码解释了这些能力背后的实现机制。掌握了这些内容你就可以在报表筛选、账期管理、订阅周期等业务场景中快速构建出体验完整的月份选择交互。【免费下载链接】vuetify Vue Component Framework项目地址: https://gitcode.com/gh_mirrors/vu/vuetify创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表