当前位置:首页 > VUE

vue拖拉拽实现方式

2026-01-23 03:33:13VUE

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拖拉拽实现方式

npm install vuedraggable

使用示例:

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

<script>
import draggable from 'vuedraggable';

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

使用自定义指令实现拖拽

通过 Vue 自定义指令可以实现更灵活的拖拽逻辑。

vue拖拉拽实现方式

<template>
  <div v-draggable>拖拽我</div>
</template>

<script>
export default {
  directives: {
    draggable: {
      inserted(el) {
        el.setAttribute('draggable', 'true');
        el.addEventListener('dragstart', (e) => {
          e.dataTransfer.setData('text/plain', el.textContent);
        });
      }
    }
  }
};
</script>

拖拽与动画结合

结合 Vue 的过渡动画可以让拖拽效果更流畅。

<template>
  <transition-group name="list" tag="div">
    <div 
      v-for="item in items" 
      :key="item.id"
      draggable="true"
      @dragstart="dragStart(item)"
      @dragover.prevent
      @drop="drop(item)"
    >
      {{ item.text }}
    </div>
  </transition-group>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, text: 'Item 1' },
        { id: 2, text: 'Item 2' }
      ],
      draggedItem: null
    };
  },
  methods: {
    dragStart(item) {
      this.draggedItem = item;
    },
    drop(item) {
      const indexDragged = this.items.indexOf(this.draggedItem);
      const indexTarget = this.items.indexOf(item);
      [this.items[indexDragged], this.items[indexTarget]] = 
        [this.items[indexTarget], this.items[indexDragged]];
    }
  }
};
</script>

<style>
.list-move {
  transition: transform 0.5s;
}
</style>

跨组件拖拽实现

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

// 使用事件总线
const EventBus = new Vue();

// 拖拽组件
EventBus.$emit('drag-start', data);

// 放置组件
EventBus.$on('drag-start', (data) => {
  this.draggedData = data;
});

拖拽限制与验证

通过事件验证实现拖拽条件的限制。

methods: {
  handleDragOver(event) {
    if (this.allowDrop) {
      event.preventDefault();
    }
  },
  handleDrop(event) {
    if (!this.allowDrop) return;
    const data = event.dataTransfer.getData('text/plain');
    // 处理数据
  }
}

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

标签: 拖拉方式
分享给朋友:

相关文章

vue路由实现方式

vue路由实现方式

Vue 路由的实现方式 Vue 路由主要通过 vue-router 库实现,它是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。以下是常见的实现方式: 安装 vue-router 通…

react native 实现方式

react native 实现方式

React Native 的实现方式 React Native 是一种流行的跨平台移动应用开发框架,允许开发者使用 JavaScript 和 React 构建原生移动应用。以下是其核心实现方式: 架…

翻转实现方式js

翻转实现方式js

翻转数组的 JavaScript 实现方法 方法一:使用 Array.prototype.reverse() 直接调用数组的 reverse() 方法,会原地修改原数组并返回翻转后的结果: cons…

php 实现跳转方式

php 实现跳转方式

使用 header 函数进行跳转 header 函数是 PHP 中最常用的跳转方式,通过发送 HTTP 头部信息实现页面跳转。使用时需确保在调用 header 前没有输出任何内容。 header("…

vue路由实现方式

vue路由实现方式

Vue 路由的实现方式 Vue 路由主要通过 vue-router 库实现,以下是常见的几种实现方式: 基于 vue-router 的基本配置 安装 vue-router 后,在项目中配置路由表:…