vue 3日历组件通过ref管理选中日期、v-for渲染格子并绑定@click事件、:class动态控制高亮样式实现点击与高亮;需用issameday标准化日期比较,避免时区或时间差异导致失效。

在 Vue 3 中实现日历组件的日期点击与高亮,核心是:用响应式数据记录选中日期、为每个日期格子绑定 @click 事件、通过动态 class 控制高亮样式。
1. 定义选中日期状态
使用 ref 或 reactive 管理当前选中日期(支持单选或范围选择):
import { ref } from 'vue'
// 单选场景:存储 Date 实例或 YYYY-MM-DD 字符串
const selectedDate = ref(null) // 初始未选中
// 多选/范围选中可改为数组
// const selectedDates = ref([])
2. 渲染日期格子并绑定点击事件
假设你用循环渲染当月所有日期(含上月/下月补位),每个 <td> 或 <code><div> 格子需:
<ul>
<li>显示对应日期(如 <code>2024-05-15)
@click,将该日期赋值给 selectedDate
:class 判断是否为当前选中项示例模板片段:
<div v-for="day in calendarDays" :key="day.date" :class="{ 'date-selected': isSameDay(day.date, selectedDate) }" day.date>
{{ day.text }}
</div>
其中 isSameDay 是一个工具函数,用于忽略时分秒比较日期是否相同:
const isSameDay = (date1, date2) => {
if (!date1 || !date2) return false
return (
new Date(date1).toDateString() === new Date(date2).toDateString()
)
}
3. 添加高亮样式
在 CSS 中定义 .date-selected 类,例如:
.date-selected {
background-color: #409eff;
color: white;
border-radius: 50%;
}
注意:确保该样式优先级足够,不被日历默认样式覆盖;若用 CSS Modules 或 scoped,需正确导出或穿透。
4. 可选增强:支持取消选中与键盘导航
- 点击已选中的日期时设为
null,实现“再点取消” - 添加
@keydown.enter支持回车触发选中(提升无障碍体验) - 配合
focus状态做键盘焦点高亮,便于 tab 导航
例如:
@click="selectedDate = selectedDate === day.date ? null : day.date"
不复杂但容易忽略细节:日期比较必须标准化(推荐转成 YYYY-MM-DD 字符串或用 toDateString()),避免因时区或时间部分不同导致高亮失效。










