Vuetify日历@click:more触发@click:day问题解决方案求助
解决v-calendar点击“更多事件”触发@click:day的问题
问题核心在于v-calendar的@click:more是自定义组件事件,抛出的参数不是原生DOM事件,所以用.stop修饰符会报错——因为这个参数根本没有stopPropagation方法。同时原生的“更多事件”按钮点击事件会冒泡到父级的day点击事件,导致两个事件同时触发。
给你两个可行的解决办法:
方法一:自定义“更多事件”按钮(推荐)
利用event-more插槽替换原生按钮,在自定义按钮上使用@click.stop阻止冒泡,完全可控:
<v-calendar @click:day="handleDayClick" > <template #event-more="{ events, date }"> <!-- 自定义按钮,用@click.stop阻止冒泡到day的点击事件 --> <v-btn @click.stop="handleMoreClick({ events, date })" size="small" > 更多事件 ({{ events.length }}) </v-btn> </template> </v-calendar>
在脚本里正常编写处理函数:
const handleDayClick = (date) => { // 处理日期点击逻辑 } const handleMoreClick = ({ events, date }) => { // 处理更多事件逻辑,比如打开模态框展示所有事件 }
这种方法和你之前解决@click:event问题的思路一致,通过插槽接管元素,直接控制事件行为,最可靠也最灵活。
方法二:在day点击事件里判断来源
如果不想自定义插槽,可以在handleDayClick里检查点击的DOM元素是否属于“更多事件”按钮,不过这种方法依赖组件内部的DOM结构,后续组件更新可能失效:
const handleDayClick = (date, evt) => { // 检查点击目标是否是更多事件按钮(根据v-calendar的默认类名判断) if (evt.target.closest('.v-calendar-event-more')) { return // 是更多按钮,直接返回不执行day的逻辑 } // 正常处理日期点击逻辑 }
注意:可以通过浏览器开发者工具确认v-calendar默认“更多事件”按钮的类名是否为v-calendar-event-more。
内容的提问来源于stack exchange,提问作者Raphael Rlt
相关产品推荐
相关产品推荐

