当前位置:首页 > 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 提供完整的日历功能集成。

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

相关文章

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

vue能实现拖拽

vue能实现拖拽

Vue 实现拖拽的方法 Vue 可以通过多种方式实现拖拽功能,包括原生 HTML5 的拖拽 API、第三方库如 vuedraggable 或自定义指令。以下是几种常见的实现方式: 使用 HTML5…

vue实现盒子拖拽

vue实现盒子拖拽

实现盒子拖拽的基本思路 在Vue中实现盒子拖拽功能,可以通过监听鼠标事件(mousedown、mousemove、mouseup)来实现。核心逻辑是记录拖拽起始位置,计算位移差值,并更新盒子的位置。…

vue实现拖拽排版

vue实现拖拽排版

Vue 实现拖拽排版的方法 使用原生 HTML5 拖拽 API HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

vue实现自由拖拽

vue实现自由拖拽

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

vue实现日历效果

vue实现日历效果

Vue实现日历效果的方法 使用第三方库 Vue生态中有多个成熟的日历组件库,如v-calendar或vue2-calendar,可以快速实现日历功能。安装后直接引入组件即可使用。 npm i…