You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 11:20:37