Vue3日历点击按钮传递新数组后不更新问题求助
问题解决:日历日期列表未随月份切换更新
核心原因是days变量未使用Vue的响应式包装,导致重新赋值时无法触发视图更新,同时存在一处逻辑错误导致新月份日期无法正确标记为当前月份。
关键修复步骤:
1. 将days改为响应式ref
Vue 3中普通变量的赋值不会触发响应式更新,必须用ref包装。修改初始化代码:
// 原代码 let days = eachDayOfInterval({...}).map(...) // 修改后 const days = ref(eachDayOfInterval({ start: startOfWeek(startOfMonth(getNewDays), {weekStartsOn: 1}), end: endOfWeek(endOfMonth(getNewDays), {weekStartsOn: 1}) }).map((dates) => { return { date: format(dates, 'yyyy-MM-dd'), isCurrentMonth: isSameMonth(getNewDays, dates), isToday: isToday(dates), isSelected: isSameDay(dates, currentDay), events: [] } }))
2. 在nextMonth函数中更新days.value
直接赋值给days.value而非重新赋值变量,确保响应式系统检测到变化:
function nextMonth() { let firstDayCurrentMonth = parse(currentMonth.value, 'MMM, yyyy', new Date()) let firstDayNextMonth = add(firstDayCurrentMonth, { months: 1}) currentMonth.value = format(firstDayNextMonth, 'MMM, yyyy') let nextM = eachDayOfInterval({ start: startOfWeek(startOfMonth(firstDayNextMonth), {weekStartsOn: 1}), end: endOfWeek(endOfMonth(firstDayNextMonth), {weekStartsOn: 1}) }) nextM = nextM.map((dates) => { return { date: format(dates, 'yyyy-MM-dd'), // 修复:使用新月份日期判断是否为当前月份 isCurrentMonth: isSameMonth(firstDayNextMonth, dates), isToday: isToday(dates), isSelected: isSameDay(dates, currentDay), events: [] } }) // 更新响应式变量的value属性 days.value = nextM getNewDays = firstDayNextMonth }
3. 模板无需修改
Vue在模板中会自动解包ref变量,原模板的v-for="day in days"可以直接保留。
原代码无效的原因:
- 普通
let days不是响应式变量,重新赋值days = nextM时Vue无法感知变化,不会更新视图。 isCurrentMonth判断使用了旧的getNewDays,导致新月份日期无法被标记为当前月份,即使视图更新也会显示错误样式。
内容的提问来源于stack exchange,提问作者DMantas
相关产品推荐
相关产品推荐

