当前位置:首页 > 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 实现广告组件的核心方法 数据驱动的广告内容渲染 通过 props 接收广告数据(如图片URL、跳转链接等),使用 v-bind 动态绑定属性。典型结构包含 <a> 标签嵌套 <…

uniapp如何将底部导航组件化

uniapp如何将底部导航组件化

在 uniapp 中将底部导航组件化 将底部导航组件化可以提高代码复用性和维护性。以下是具体实现方法: 创建自定义底部导航组件 新建一个组件文件,例如 tab-bar.vue,放置在 compon…

组件elementui

组件elementui

ElementUI 简介 ElementUI 是一套基于 Vue.js 的桌面端组件库,由饿了么前端团队开发并开源。它提供了丰富的 UI 组件(如按钮、表单、表格等),适合快速构建企业级中后台产品。…

Vue组件实现方法

Vue组件实现方法

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

如何判断react组件

如何判断react组件

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

vue实现秒表组件

vue实现秒表组件

实现秒表组件的基本思路 使用Vue实现秒表组件需要管理时间状态、控制计时器的启动/暂停/重置功能,并通过计算属性动态显示格式化时间。核心逻辑包括利用setInterval更新计时数据,并通过生命周期钩…