当前位置:首页 > VUE

vue实现多远效果

2026-02-24 14:51:42VUE

Vue 实现拖拽效果

Vue 中实现拖拽效果可以通过原生 HTML5 的拖放 API 或第三方库(如 vuedraggable)来完成。以下是两种常见方法的实现方式:

使用 HTML5 拖放 API

HTML5 提供了原生的拖放 API,可以通过 draggable 属性和事件监听实现拖拽功能。

<template>
  <div>
    <div
      v-for="item in items"
      :key="item.id"
      draggable="true"
      @dragstart="handleDragStart($event, item)"
      @dragover.prevent
      @drop="handleDrop($event, item)"
      class="draggable-item"
    >
      {{ item.text }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      items: [
        { id: 1, text: "Item 1" },
        { id: 2, text: "Item 2" },
        { id: 3, text: "Item 3" },
      ],
      draggedItem: null,
    };
  },
  methods: {
    handleDragStart(event, item) {
      this.draggedItem = item;
      event.dataTransfer.effectAllowed = "move";
    },
    handleDrop(event, targetItem) {
      if (this.draggedItem === targetItem) return;
      const draggedIndex = this.items.indexOf(this.draggedItem);
      const targetIndex = this.items.indexOf(targetItem);
      this.items.splice(draggedIndex, 1);
      this.items.splice(targetIndex, 0, this.draggedItem);
    },
  },
};
</script>

<style>
.draggable-item {
  padding: 10px;
  margin: 5px;
  background: #f0f0f0;
  cursor: move;
}
</style>

使用 vuedraggable

vuedraggable 是一个基于 Sortable.js 的 Vue 拖拽组件,简化了拖拽列表的实现。

安装:

npm install vuedraggable

使用:

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

<script>
import draggable from "vuedraggable";
export default {
  components: { draggable },
  data() {
    return {
      items: [
        { id: 1, text: "Item 1" },
        { id: 2, text: "Item 2" },
        { id: 3, text: "Item 3" },
      ],
    };
  },
  methods: {
    onDragEnd() {
      console.log("拖拽完成");
    },
  },
};
</script>

<style>
.draggable-item {
  padding: 10px;
  margin: 5px;
  background: #f0f0f0;
  cursor: move;
}
</style>

实现拖拽排序

如果需要实现拖拽排序功能,可以通过以下方式调整数据顺序:

handleDrop(event, targetItem) {
  const draggedIndex = this.items.findIndex(item => item.id === this.draggedItem.id);
  const targetIndex = this.items.findIndex(item => item.id === targetItem.id);
  const newItems = [...this.items];
  newItems.splice(draggedIndex, 1);
  newItems.splice(targetIndex, 0, this.draggedItem);
  this.items = newItems;
}

跨组件拖拽

跨组件拖拽可以通过共享状态(如 Vuex)或事件总线实现。以下是一个简单示例:

<!-- ComponentA -->
<template>
  <div>
    <div
      v-for="item in itemsA"
      :key="item.id"
      draggable="true"
      @dragstart="$emit('drag-start', item)"
      class="draggable-item"
    >
      {{ item.text }}
    </div>
  </div>
</template>

<!-- ComponentB -->
<template>
  <div @dragover.prevent @drop="$emit('drop', $event)">
    <div v-for="item in itemsB" :key="item.id" class="draggable-item">
      {{ item.text }}
    </div>
  </div>
</template>

<!-- Parent Component -->
<template>
  <div>
    <component-a @drag-start="handleDragStart" />
    <component-b @drop="handleDrop" />
  </div>
</template>

注意事项

  • 拖拽事件需要阻止默认行为(如 @dragover.prevent)。
  • 跨浏览器兼容性可能需要额外处理。
  • 移动端支持可能需要引入触摸事件库(如 hammer.js)。

vue实现多远效果

标签: 多远效果
分享给朋友:

相关文章

vue实现突出效果

vue实现突出效果

Vue 实现突出效果的方法 在 Vue 中实现突出效果可以通过多种方式,包括动态样式绑定、过渡动画、第三方库等。以下是几种常见的方法: 动态样式绑定 通过 v-bind:class 或 v-bind…

vue实现对话框效果

vue实现对话框效果

Vue 对话框实现方法 使用组件化方式封装对话框 创建一个独立的对话框组件(如Dialog.vue),通过v-model控制显示隐藏: <template> <div cla…

h5所能实现的效果

h5所能实现的效果

H5能实现的效果 H5(HTML5)作为最新的HTML标准,具备强大的功能和丰富的API支持,能够实现多种现代Web应用效果。以下是H5的主要能力分类: 多媒体支持 H5原生支持音频和视频播放,无…

vue效果实现

vue效果实现

Vue 效果实现方法 Vue.js 提供了多种方式实现动态效果,包括过渡动画、状态驱动的 UI 变化以及第三方动画库集成。以下是常见效果的实现方案: 过渡动画 使用 Vue 内置的 <tra…

vue实现点选效果

vue实现点选效果

实现点选效果的基本思路 在Vue中实现点选效果通常涉及监听用户的点击事件,并通过动态绑定类名或样式来改变元素的外观。核心是利用Vue的响应式数据和事件绑定机制。 使用v-bind和v-on实现 通过…

vue 实现toogle效果

vue 实现toogle效果

使用 v-if 和 v-else 实现切换 通过 Vue 的指令 v-if 和 v-else 可以轻松实现元素的显示与隐藏切换。 <template> <button @c…