Vue中el-tree结合vuedraggable实现跨组件元素拖拽

实现效果:

左侧el-tree:

<template>
    <el-tree
      class="filter-tree"
      :data="treeData"
      :props="defaultProps"
      :filter-node-method="filterNode"
      node-key="id"
      draggable
      :allow-drop="allowDrop"
      @node-drag-start="handleDragStart"
      @node-drag-end="handleDragEndz"
      ref="tree">
    </el-tree>
</template>
<script>
    data() {
        return {
            treeData:[],
            defaultProps: {
                children: 'children',
                label: 'datasetColumnName'
            },
        }
    },
    methods: {
        filterNode(value, data) {
            if (!value) return true;
            return data.datasetColumnName.indexOf(value) !== -1;
        },
        // 阻止el-tree默认拖拽
        allowDrop() {
            return false;
        },
        handleDragStart() {
            console.log(node.data)
            if(!node.data.aqlStr) return
            this.draggingItem = node.data
            this.isShowDragging = true
        },
        handleDragEndz() {
            this.isShowDragging = false
        },
    }
</script>

右侧vuedraggable接收,先npm install vuedraggable,main.js中引入:

import draggable from 'vuedraggable';

Vue.use(draggable)

使用如下:

<draggable v-model="dragList" class="drag_list" :class="{ 'hint': isShowDragging?true:false }" animation="1000"  group="items" @dragover="handleDragOver" @drop="handleTargetDrop($event)">
    <div class="add_tip" v-if="dragList.length <= 0">
        <i class="el-icon-plus"></i>
    </div>
    <template v-else v-for="(item, index) in dragList" :key="index">
        其他代码
    </template>
</draggable>
<script>
    export default {
        data() {
            return {}
        },
        methods: {
            handleDragOver(e) {
                e.preventDefault();
            },
            handleTargetDrop(e, index) {
                e.preventDefault();
                // 阻止冒泡
                e.stopPropagation();
                // 将el-tree选中的数据放入dragList中
                this.dragList.push(this.draggingItem)
                // 刷新页面
                this.$forceUpdate()
            }
        }
    
    }
</script>

文章参考:

https://blog.csdn.net/Turn_to_empty/article/details/126759544

Vue3 中,`el-tree` 是 Element UI 提供的一款树状组件,它支持拖拽功能。要实现 `el-tree` 的拖拽功能,你可以按照以下步骤操作: 1. 首先,在你的项目中安装 Element UI 和相关的依赖,例如 `@element-plus/draggable`,可以使用 npm 或 yarn 进行安装: ```bash npm install element-ui @element-plus/draggable # 或者 yarn add element-ui @element-plus/draggable ``` 2. 然后在 `Vue` 组件中引入并注册 draggable 插件: ```javascript import { Draggable } from '@element-plus/draggable'; import { ElTree } from 'element-ui'; Vue.use(Draggable); Vue.component('el-tree', ElTree); ``` 3. 定义你的数据结构,包含拖拽所需的属性,比如 `draggable`、`key` 和 `parent-key`: ```json { "data": [ { "label": "节点A", "key": "node-a", "draggable": true, "children": [ // 子节点... ] }, // 其他节点... ], "options": { /* 树选项配置 */ } } ``` 4. 在 `el-tree` 上启用拖拽功能,并设置合适的回调函数处理拖动事件: ```html <template> <el-tree :data="treeData" :props="defaultProps" :expand-on-click-node="false" :drag-enabled="true" :drop-shadow="false" @drag-over="onDragOver" @drop="onDrop" @drag-start="onDragStart" @drag-end="onDragEnd" ></el-tree> </template> <script setup> import { reactive, computed } from 'vue'; const treeData = ...; // 初始化的数据 const defaultProps = { children: '__children__', label: 'name', parentKey: 'pid' }; // 拖放事件处理器 function onDragOver(e) { if (e.dropTarget && e.dropPosition === 'before') { e.preventDefault(); } } function onDrop(e) { const sourceNode = e.source; const targetNode = e.target; if (sourceNode === targetNode) return; // 更新源节点和目标节点的位置 moveNode(sourceNode, targetNode); } function onDragStart(e) { e.dataTransfer.setData('text/plain', e.item.key); } function onDragEnd() { // 清除数据 e.dataTransfer.clearData(); } function moveNode(sourceNode, targetNode) { // 通过源节点和目标节点的操作,调整它们在数组中的位置 // 这里只是一个简单的示例,实际应用中需要根据业务逻辑调整 const sourceIndex = sourceNode.parent.children.findIndex(node => node.key === sourceNode.key); const targetIndex = targetNode.parent.children.findIndex(node => node.key === targetNode.key); // 移除 sourceNode 从其当前的 parent.children [...sourceNode.parent.children].splice(sourceIndex, 1); // 将 sourceNode 插入到 targetNode 后面 if (targetIndex > -1) { sourceNode.parent.children.splice(targetIndex + 1, 0, sourceNode); } else { sourceNode.parent.children.push(sourceNode); } } </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木易66丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值