当前位置:首页 > VUE

vue日历拖拽实现

2026-02-19 16:40:52VUE

Vue 日历拖拽实现方案

实现日历拖拽功能通常需要结合 Vue 的响应式特性和第三方库(如 vuedraggable 或原生 HTML5 Drag and Drop API)。以下是几种常见方法:

使用 vuedraggable 库

安装依赖:

vue日历拖拽实现

npm install vuedraggable

基础实现代码:

<template>
  <div>
    <draggable 
      v-model="events" 
      @end="onDragEnd"
      :options="{ group: 'calendar' }"
    >
      <div v-for="event in events" :key="event.id" class="calendar-event">
        {{ event.title }}
      </div>
    </draggable>
  </div>
</template>

<script>
import draggable from 'vuedraggable'

export default {
  components: { draggable },
  data() {
    return {
      events: [
        { id: 1, title: 'Meeting', date: '2023-01-01' },
        { id: 2, title: 'Lunch', date: '2023-01-02' }
      ]
    }
  },
  methods: {
    onDragEnd(evt) {
      console.log('New index:', evt.newIndex)
      // 更新事件日期逻辑
    }
  }
}
</script>

使用 HTML5 原生拖拽

基础实现示例:

vue日历拖拽实现

<template>
  <div 
    v-for="day in days" 
    :key="day.date"
    @drop="onDrop($event, day.date)"
    @dragover.prevent
    @dragenter.prevent
    class="calendar-day"
  >
    <div 
      v-for="event in day.events"
      :key="event.id"
      draggable="true"
      @dragstart="onDragStart($event, event)"
      class="event"
    >
      {{ event.title }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      days: [
        { date: '2023-01-01', events: [...] },
        // 其他日期数据
      ],
      draggedEvent: null
    }
  },
  methods: {
    onDragStart(evt, event) {
      this.draggedEvent = event
      evt.dataTransfer.setData('text/plain', event.id)
    },
    onDrop(evt, newDate) {
      const eventId = evt.dataTransfer.getData('text')
      // 更新事件到新日期
    }
  }
}
</script>

完整日历组件集成

结合 fullcalendar-vue 和拖拽功能:

npm install @fullcalendar/core @fullcalendar/daygrid @fullcalendar/interaction

实现代码:

<template>
  <FullCalendar :options="calendarOptions" />
</template>

<script>
import FullCalendar from '@fullcalendar/vue'
import dayGridPlugin from '@fullcalendar/daygrid'
import interactionPlugin from '@fullcalendar/interaction'

export default {
  components: { FullCalendar },
  data() {
    return {
      calendarOptions: {
        plugins: [dayGridPlugin, interactionPlugin],
        initialView: 'dayGridMonth',
        editable: true,
        events: [
          { title: 'Event 1', start: '2023-01-01' }
        ],
        eventDrop: this.handleEventDrop
      }
    }
  },
  methods: {
    handleEventDrop(info) {
      console.log('Event moved to:', info.event.start)
    }
  }
}
</script>

关键注意事项

  • 跨日期拖拽时需要处理日期变更逻辑
  • 移动端支持可能需要额外处理触摸事件
  • 性能优化:对于大量事件建议使用虚拟滚动
  • 数据持久化:拖拽后需要同步到后端或本地存储

以上方案可根据具体需求选择,vuedraggable 适合自定义UI的简单场景,fullcalendar 提供完整的日历功能集成。

标签: 拖拽日历
分享给朋友:

相关文章

vue实现拖拽连线

vue实现拖拽连线

Vue 实现拖拽连线的方法 使用第三方库(推荐) 对于快速实现拖拽连线功能,推荐使用成熟的第三方库如 jsplumb 或 vue-draggable。这些库提供了丰富的 API 和事件支持,能够简化开…

vue实现日历组件

vue实现日历组件

Vue 日历组件实现步骤 基础结构搭建 使用Vue 3的Composition API或Options API创建组件框架。核心结构包括年份/月份切换按钮、星期标题栏和日期网格。 <templ…

vue实现表单拖拽

vue实现表单拖拽

实现表单拖拽的基本思路 在Vue中实现表单拖拽功能通常需要结合HTML5的拖放API和Vue的数据绑定特性。通过监听拖放事件,动态更新表单元素的顺序或位置。 使用HTML5拖放API HTML5提供…

vue实现拖拽滚动

vue实现拖拽滚动

Vue 实现拖拽滚动的方法 在 Vue 中实现拖拽滚动功能,可以通过监听鼠标事件并结合 CSS 或 JavaScript 控制滚动行为。以下是几种常见的实现方式: 使用原生事件监听 通过监听 mou…

vue拖拽功能实现

vue拖拽功能实现

Vue 拖拽功能实现方法 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,通过 draggable 属性和相关事件实现基础拖拽功能。 <template>…

vue实现导航拖拽

vue实现导航拖拽

Vue 实现导航拖拽功能 在 Vue 中实现导航拖拽功能,可以通过原生 HTML5 的拖放 API 或第三方库(如 vuedraggable)来完成。以下是两种方法的详细实现步骤: 使用 HTML5…