当前位置:首页 > VUE

vue实现拖拽实现组件嵌套

2026-03-07 19:49:32VUE

Vue 实现拖拽组件嵌套

使用 vue-draggable-next 库

安装依赖:

npm install vue-draggable-next

基础实现代码:

<template>
  <draggable 
    v-model="list" 
    group="components" 
    @start="drag=true" 
    @end="drag=false"
  >
    <div v-for="element in list" :key="element.id">
      {{ element.name }}
    </div>
  </draggable>
</template>

<script>
import { ref } from 'vue';
import draggable from 'vue-draggable-next';

export default {
  components: { draggable },
  setup() {
    const list = ref([
      { id: 1, name: '组件A' },
      { id: 2, name: '组件B' }
    ]);
    return { list };
  }
};
</script>

嵌套拖拽实现

多层嵌套结构示例:

vue实现拖拽实现组件嵌套

<template>
  <draggable 
    v-model="treeData" 
    group="nested" 
    item-key="id"
    :component-data="{ tag: 'ul', type: 'transition-group' }"
  >
    <template #item="{ element }">
      <li>
        {{ element.name }}
        <draggable 
          v-if="element.children" 
          v-model="element.children"
          group="nested"
          item-key="id"
        >
          <template #item="{ element: child }">
            <div>{{ child.name }}</div>
          </template>
        </draggable>
      </li>
    </template>
  </draggable>
</template>

<script>
import { ref } from 'vue';
import draggable from 'vue-draggable-next';

export default {
  components: { draggable },
  setup() {
    const treeData = ref([
      {
        id: 1,
        name: '父组件1',
        children: [
          { id: 11, name: '子组件1-1' },
          { id: 12, name: '子组件1-2' }
        ]
      },
      {
        id: 2,
        name: '父组件2',
        children: [
          { id: 21, name: '子组件2-1' }
        ]
      }
    ]);
    return { treeData };
  }
};
</script>

自定义拖拽样式

添加拖拽样式控制:

.drag-item {
  padding: 8px;
  margin: 4px;
  background: #f0f0f0;
  border: 1px dashed #ccc;
}

.drag-ghost {
  opacity: 0.5;
  background: #c8ebfb;
}

事件处理

常用事件处理示例:

vue实现拖拽实现组件嵌套

const handleDragStart = (event) => {
  console.log('开始拖拽', event.item);
};

const handleDragEnd = (event) => {
  console.log('结束拖拽', event.item);
};

const handleChange = (event) => {
  console.log('位置变化', event);
};

移动端适配

添加触摸支持:

const dragOptions = {
  animation: 200,
  touchStartThreshold: 3,
  forceFallback: true
};

性能优化

大数据量优化方案:

const virtualOptions = {
  itemSize: 50,
  height: 500,
  delay: 100
};

标签: 嵌套组件
分享给朋友:

相关文章

vue VUE实现日历组件功能

vue VUE实现日历组件功能

Vue 日历组件实现方法 基础日历结构 使用Vue的模板语法构建日历的HTML结构,通常包含头部(年月显示、切换按钮)和日历表格(星期标题和日期格子)。 <template> <…

vue轮播组件实现

vue轮播组件实现

vue轮播组件实现方法 使用第三方库(如Swiper) 安装Swiper库: npm install swiper 在Vue组件中引入: <template> <div cl…

Vue组件实现方法

Vue组件实现方法

Vue组件的基本实现 Vue组件是Vue.js的核心概念之一,允许将UI拆分为独立可复用的代码片段。组件的实现方式有多种,以下是常见的几种方法。 单文件组件(SFC) 单文件组件以.vue为后缀,将…

vue实现tooltips组件

vue实现tooltips组件

实现基础 Tooltip 组件 创建一个名为 Tooltip.vue 的单文件组件,包含模板、样式和逻辑: <template> <div class="tooltip-con…

vue实现水印组件

vue实现水印组件

Vue 水印组件的实现方法 使用Canvas绘制水印 在Vue组件中通过Canvas动态生成水印图案,将其作为背景添加到目标元素上。 <template> <div ref="…

如何判断react组件

如何判断react组件

判断 React 组件的依据 React 组件的判断通常基于其定义方式、功能特性和代码结构。以下是几种常见的判断方法: 函数组件与类组件 函数组件是通过 JavaScript 函数定义的,接收 pr…