ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

shadcn-vue RangeCalendar 组件完整指南:日期区间选择日历的安装、用法与源码剖析

shadcn-vue RangeCalendar 组件完整指南:日期区间选择日历的安装、用法与源码剖析 UI组件前端【免费下载链接】shadcn-vueVue port of shadcn-ui项目地址https://gitcode.com/gh_mirrors/sh/shadcn-vue点击查看免费下载本文以 Range Calendar 官方文档 为核心系统讲解 shadcn-vue 中RangeCalendar日期区间选择组件的功能定位、安装方式、基础用法并结合仓库内 new-york-v4 风格实现 与演示代码深入剖析其基于 Reka UI 与internationalized/date的底层实现原理。读完本文你将掌握如何在 Vue 3 Tailwind CSS 项目中快速接入并定制一个支持多月份、区间高亮、禁用日期等功能的范围日历组件。组件概览什么是 RangeCalendarRangeCalendar /是 shadcn-vue 提供的一类**专门用于选择日期区间start ~ end**的日历组件与普通的单日期Calendar组件不同它天然支持起始日 结束日的连续选中语义适合酒店预订、行程规划、报表区间筛选等场景。从 组件文档 可知该组件具备以下技术特征构建在Reka UI Range Calendar之上继承其完整的无障碍交互与键盘导航能力内部使用internationalized/date包处理日期对象保证日期运算与时区处理的严谨性若你需要的是普通单日选择日历请参阅仓库中的 Calendar 组件文档两者文档互相交叉引用可通过文档中的链接跳转。安装安装RangeCalendar有两种方式CLI 自动安装与手动复制。方式一CLI 一键安装推荐在项目根目录执行npx shadcn-vuelatest add range-calendarCLI 会自动完成依赖安装、组件文件落盘与导入路径配置是最省事的方式。方式二手动安装按以下三步操作安装核心依赖npm install reka-uireka-ui是组件运行时依赖提供RangeCalendarRoot、RangeCalendarCell等底层原语日期类型DateRange与运算工具today、CalendarDate来自internationalized/date通常随reka-ui的 peer 依赖一并引入。复制组件源码从仓库的 new-york-v4/ui/range-calendar 目录复制以下 12 个文件到项目的components/ui/range-calendar/目录RangeCalendar.vue根组件导出RangeCalendarRangeCalendarCell.vueRangeCalendarCellTrigger.vueRangeCalendarGrid.vueRangeCalendarGridBody.vueRangeCalendarGridHead.vueRangeCalendarGridRow.vueRangeCalendarHeadCell.vueRangeCalendarHeader.vueRangeCalendarHeading.vueRangeCalendarNextButton.vueRangeCalendarPrevButton.vue更新导入路径将各文件顶部的/registry/new-york-v4/ui/range-calendar改为你项目实际的对齐路径如/components/ui/range-calendar并确认cn工具函数来自/lib/utils与buttonVariants来自/registry/new-york-v4/ui/button的导入路径与本项目一致。基础用法安装完成后最简单的用法如下script setup langts import { RangeCalendar } from /components/ui/range-calendar; /script template RangeCalendar / /template仅渲染一个默认的范围日历更常见的是通过v-model双向绑定一个DateRange对象script setup langts import type { DateRange } from reka-ui import { getLocalTimeZone, today } from internationalized/date import { RangeCalendar } from /registry/new-york-v4/ui/range-calendar // 默认区间今天 ~ 7 天后 const start today(getLocalTimeZone()) const end start.add({ days: 7 }) const dateRange ref({ start, end, }) as RefDateRange /script template RangeCalendar v-modeldateRange classrounded-md border shadow-sm :number-of-months2 disable-days-outside-current-view / /template该示例来自仓库中的 CalendarRangeDemo.vue是文档预览区component-preview引用CalendarRangeDemo实际渲染的代码可直接运行验证。要点v-model绑定值为{ start, end }结构类型为 Reka UI 导出的DateRangetoday(getLocalTimeZone())获取当前时区的今天日期start.add({ days: 7 })通过internationalized/date的不可变日期运算得到区间结束日:number-of-months2一次展示两个月disable-days-outside-current-view禁用非当前视图月份的日期配合区间选择可避免跨月误选。组件结构与源码剖析RangeCalendar是典型的组合式compound组件根组件内部通过reka-ui原语拼装出完整日历。下面以 new-york-v4 实现 为例逐层拆解。根组件RangeCalendarRoot 与 Slot 结构RangeCalendarRoot v-slot{ grid, weekDays } >RangeCalendarCell >RangeCalendarCellTrigger :classcn( buttonVariants({ variant: ghost }), h-8 w-8 p-0 font-normal>const props definePropsRangeCalendarXxxProps { class?: HTMLAttributes[class] }() const delegatedProps reactiveOmit(props, class) const forwardedProps useForwardProps(delegatedProps)即把用户传入的 props除class外以响应式方式转发给 Reka UI 原语class通过cn()与内置 Tailwind 类合并。这意味着 Reka UI 的绝大部分属性如numberOfMonths、pagedNavigation、minValue、maxValue、isDateDisabled等都能直接透传到RangeCalendar上使用。高级用法示例仓库在 registry/bases/reka/examples/range-calendar 目录下提供了两个可参考的示例。基本区间选择RangeCalendarBasic.vue 展示了用CalendarDate直接构造默认区间script setup langts import type { DateRange } from reka-ui import { CalendarDate } from internationalized/date import { ref } from vue import { RangeCalendar } from /registry/bases/reka/ui/range-calendar const range ref({ start: new CalendarDate(new Date().getFullYear(), 1, 1), end: new CalendarDate(new Date().getFullYear(), 1, 7), } as DateRange) /script template RangeCalendar v-model(range as any) / /template与前面 demo 的区别在于这里直接使用new CalendarDate(year, month, day)构造不依赖当前时间与时区适合设定固定的默认区间。多月份展示RangeCalendarMultipleMonths.vue 演示了跨月区间选择script setup langts const range ref({ start: new CalendarDate(new Date().getFullYear(), 1, 10), end: new CalendarDate(new Date().getFullYear(), 2, 15), } as DateRange) /script template RangeCalendar v-model(range as any) :number-of-months2 / /template通过:number-of-months2并排展示两个月同时默认区间跨越 1 月与 2 月直观呈现了连续区间高亮的效果。与其他组件的关联Calendar单日选择的普通日历文档见 calendar.md两个文档互为交叉引用可按需选择DatePicker / CalendarDateAndTimePicker仓库 demo 目录 中还有 CalendarDateAndTimePicker.vue 等演示展示了日期选择与时间选择的组合场景可作为扩展参考多风格注册表除 new-york-v4 外仓库的 styles/reka-* 各目录下均维护了一份独立的range-calendar实现如 styles/reka-luma/ui/range-calendar说明该组件可随设计系统主题一键切换底层 API 保持一致。小结RangeCalendar是 shadcn-vue 中实现日期区间选择的标准组件CLI 一条命令即可安装v-model绑定DateRange即可获得完整的区间选择、键盘导航与无障碍支持通过number-of-months、disable-days-outside-current-view等属性可快速定制展示形态。其源码层面由 12 个薄封装组件叠加 Reka UI 原语构成区间高亮完全由data-selected/data-selection-start/data-selection-end等 data 属性驱动 Tailwind 类完成理解这一机制后你便可以自由定制区间配色、圆角、禁用态等视觉细节将其无缝融入自己的业务界面。赞分享UI组件前端【免费下载链接】shadcn-vueVue port of shadcn-ui项目地址https://gitcode.com/gh_mirrors/sh/shadcn-vue点击查看免费下载相关推荐shadcn-vue Range Calendar 组件完全指南日期区间选择的安装、组合与源码解析shadcn vue Range Calendar 组件完全指南日期区间选择的安装、组合与源码解析 本指南围绕 shadcn vue 项目中的 Range CUI组件前端Radix Vue RangeCalendar 组件完全指南构建可访问的日期区间选择器Radix Vue RangeCalendar 组件完全指南构建可访问的日期区间选择器 导读 本文围绕 range calendar.md https://l前端UI组件设计系统Vant Weapp Calendar 日历组件完全指南日期选择、区间选择与高级定制Vant Weapp Calendar 日历组件完全指南日期选择、区间选择与高级定制 Calendar 是 Vant Weapp 小程序组件库中用于选择日期或前端小程序UI组件移动开发上一篇Vant 4 NumberKeyboard 数字键盘组件完全指南从基础用法到源码级原理剖析下一篇Cilium 节点配置解析实战cilium-dbg build-config 命令完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表