当前位置:首页 > 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:

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 自定义指令封装拖拽逻辑,适用于需要高度定制的场景。

<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实现文档分享

vue实现文档分享

Vue 实现文档分享功能 文档分享功能通常涉及文件上传、存储、生成分享链接以及权限控制等模块。以下是基于 Vue 的实现方案: 文件上传组件 使用 element-ui 或 ant-design-…

vue前端实现搜索

vue前端实现搜索

实现搜索功能的基本方法 在Vue中实现搜索功能通常涉及以下几个关键步骤,结合数据绑定、计算属性和方法调用来动态过滤和显示结果。 数据绑定与输入处理 使用v-model双向绑定搜索输入框的值,监听用…

vue怎么实现页面返回

vue怎么实现页面返回

Vue 实现页面返回的方法 在 Vue 中实现页面返回功能,可以通过以下几种方式完成,具体取决于项目使用的路由模式和技术栈。 使用 Vue Router 的编程式导航 通过 this.$route…

在线脑图 vue 实现

在线脑图 vue 实现

在线脑图 Vue 实现方案 使用开源库实现 推荐使用 mind-elixir 或 jsmind 这类开源库,它们专为脑图设计且支持 Vue 集成。 安装依赖: npm install mi…

vue实现用户信息表

vue实现用户信息表

Vue 实现用户信息表的方法 使用 Vue CLI 创建项目 安装 Vue CLI 并初始化项目: npm install -g @vue/cli vue create user-info-tab…

vue里实现增删改查

vue里实现增删改查

在Vue中实现增删改查 数据初始化 在Vue组件的data中定义初始数据和表单绑定的变量: data() { return { items: [ { id: 1, name:…