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

相关推荐
小码哥_常4 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮6 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
sbjdhjd7 小时前
网工进阶笔记:H3CSE 园区网全栈技术与协议汇总
网络·笔记·云计算·ssh·网络工程·vlan·aaa
她说可以呀8 小时前
Vue插槽
前端·javascript·vue.js
qq_448011168 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan8 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352909 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝9 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing0310 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
海绵宝宝的月光宝盒10 小时前
14-AutoCAD-阵列命令应用与案例实战(AR)
经验分享·笔记·自动化·课程设计·制造·学习方法·cad