当前位置:首页 > VUE

vue 中实现拖拽

2026-01-08 14:44:20VUE

Vue 中实现拖拽功能

使用 HTML5 原生拖拽 API

HTML5 提供了原生的拖拽 API,可以通过 draggable 属性、dragstartdragenddragoverdrop 等事件实现基础拖拽功能。

<template>
  <div>
    <div 
      draggable="true" 
      @dragstart="handleDragStart"
      @dragend="handleDragEnd"
    >
      拖拽元素
    </div>
    <div 
      @dragover.prevent
      @drop="handleDrop"
    >
      放置区域
    </div>
  </div>
</template>

<script>
export default {
  methods: {
    handleDragStart(event) {
      event.dataTransfer.setData('text/plain', '拖拽数据');
    },
    handleDrop(event) {
      const data = event.dataTransfer.getData('text/plain');
      console.log('接收到的数据:', data);
    },
    handleDragEnd() {
      console.log('拖拽结束');
    }
  }
};
</script>

使用第三方库 Vue.Draggable

Vue.Draggable 是一个基于 Sortable.js 的 Vue 组件,适用于列表拖拽排序等复杂场景。

安装 Vue.Draggable:

vue 中实现拖拽

npm install vuedraggable

示例代码:

<template>
  <div>
    <draggable 
      v-model="list" 
      @end="onDragEnd"
    >
      <div v-for="item in list" :key="item.id">
        {{ item.name }}
      </div>
    </draggable>
  </div>
</template>

<script>
import draggable from 'vuedraggable';

export default {
  components: { draggable },
  data() {
    return {
      list: [
        { id: 1, name: '项目 1' },
        { id: 2, name: '项目 2' }
      ]
    };
  },
  methods: {
    onDragEnd() {
      console.log('拖拽后的列表:', this.list);
    }
  }
};
</script>

使用自定义指令实现拖拽

可以通过 Vue 自定义指令封装拖拽逻辑,适用于需要高度定制的场景。

vue 中实现拖拽

<template>
  <div v-draggable>可拖拽元素</div>
</template>

<script>
export default {
  directives: {
    draggable: {
      inserted(el) {
        el.draggable = true;
        el.addEventListener('dragstart', (e) => {
          e.dataTransfer.setData('text/plain', '自定义拖拽数据');
        });
      }
    }
  }
};
</script>

拖拽与动画结合

结合 Vue 的过渡动画(Transition)可以提升拖拽体验,例如在拖拽时添加缩放或阴影效果。

<template>
  <draggable v-model="items">
    <transition-group name="drag">
      <div v-for="item in items" :key="item.id" class="drag-item">
        {{ item.text }}
      </div>
    </transition-group>
  </draggable>
</template>

<style>
.drag-item {
  transition: all 0.3s ease;
}
.drag-move {
  transition: transform 0.5s;
}
</style>

跨组件拖拽

通过 Vuex 或事件总线(Event Bus)实现跨组件的拖拽数据传递。

// 在拖拽源组件中
handleDragStart(event) {
  this.$emit('drag-start', { data: '跨组件数据' });
}

// 在目标组件中监听事件
created() {
  this.$on('drag-start', (data) => {
    console.log('接收跨组件数据:', data);
  });
}

以上方法涵盖了从基础到高级的拖拽实现方式,可根据具体需求选择合适方案。

标签: 拖拽vue
分享给朋友:

相关文章

vue实现图片轮播

vue实现图片轮播

使用 Swiper 实现图片轮播 安装 Swiper 依赖 npm install swiper 在 Vue 组件中引入 Swiper <template> <div c…

vue 实现直播

vue 实现直播

Vue 实现直播的基本方法 在Vue中实现直播功能,通常需要结合WebRTC、RTMP或HLS等技术。以下是几种常见的实现方式: 使用WebRTC实现实时直播 WebRTC适合低延迟的实时直播场景,…

vue实现oauth

vue实现oauth

Vue 实现 OAuth 的步骤 安装必要的依赖 确保项目中安装了 axios 和 vue-router。OAuth 通常需要发送 HTTP 请求和处理路由跳转。 npm install axio…

vue 实现全屏

vue 实现全屏

Vue 实现全屏功能 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 完成。以下是一个完整的实现方案: 安装依赖(可选) 如果需要跨浏览器兼容性更好,可以安装 sc…

vue实现list

vue实现list

Vue 实现列表渲染 在 Vue 中,可以使用 v-for 指令来渲染列表。v-for 指令基于一个数组或对象来渲染一个列表,可以遍历数组或对象的属性。 基本列表渲染 <template>…

vue实现日历

vue实现日历

Vue 实现日历的基本方法 使用 Vue 实现日历可以通过自定义组件或借助第三方库完成。以下是两种常见实现方式: 自定义日历组件 创建基于 Vue 的日历组件需要处理日期计算和渲染逻辑。核心是生成…