【记录31】elementUI el-tree 虚线、右键、拖拽

父组件

html 复制代码
<eltree :treeData="treeData"></eltree>
javascript 复制代码
import eltree from "../../components/tree.vue";
export default {
    name: '',
    components: { 
        // org_tree ,
        eltree
    },
    watch: {
        
    },
    data() {
        return {
            orgFormchoose: {},
            orgForm: { type: 0, limits: 1 },
            operateIndex: 1, // 默认 1  查看
            operateDisable: true,
            treeData: [
                { parentId: null, id: 1, level: 1, type: null, checkbox: '1', allname: '组织机构1', name:'机构1简称', code:'机构1编码', show: true, 
                    children: [
                        { parentId: 1, id: 101, level: 2, type: null, checkbox: '2', allname: '组织机构1-1', show: false, },
                        { parentId: 1, id: 102, level: 2, type: null, checkbox: '3', allname: '组织机构1-2', show: false, },
                    ] 
                },
                { parentId: null, id: 2, level: 1, type: null, checkbox: '4', allname: '组织机构2', show: true, 
                    children: [
                        { parentId: 2, id: 201, level: 2, type: null, checkbox: '5', allname: '组织机构2-1', show: false, },
                        { parentId: 2, id: 202, level: 2, type: null, checkbox: '6', allname: '组织机构2-2', show: false, 
                            children: [
                                { parentId: 202, id: 2001, level: 3, type: null, checkbox: '7',  allname: '组织机构2-1-1', show: false,
                                    children: [
                                        { parentId: 2001, id: 20001, level: 3, type: null, checkbox: '8', allname: '8组织机构2-1-1', show: false, },
                                        { parentId: 2001, id: 20002, level: 3, type: null, checkbox: '9', allname: '9组织机构2-2-2', show: false, },
                                        { parentId: 2001, id: 20003, level: 3, type: null, checkbox: '11', allname: '11组织机构2-1-1', show: false, },
                                        { parentId: 2001, id: 20004, level: 3, type: null, checkbox: '12', allname: '12组织机构2-2-2', show: false, },
                                        { parentId: 2001, id: 20005, level: 3, type: null, checkbox: '13', allname: '13组织机构2-1-1', show: false, },
                                    ] 
                                },
                                { parentId: 202, id: 2002, level: 3, type: null, checkbox: '10', allname: '组织机构2-2-2', show: false, },
                            ] 
                        },
                    ] 
                },
                { parentId: null, id: 3, level: 1, type: null, checkbox: '100', allname: '组织机构3', show: true, }
            ],
        }
    },
    mounted() {},
    methods: {
        // 选择的节点信息
        ParentChooseOrgTree(_ulItem) {
            this.orgForm = _ulItem;
        },
        //  右击  删除
        ParentChooseDeleteOrgTree(_ulItem, _item) {
            this.operateIndex = _item.value;
        },
        //  组织机构点击操作
        //operateClick(_item, _index) {
        //    console.log(_item.label, _index);
        //    if (_index == 0 || _index == 2) {
        //        this.operateDisable = false;
        //    }else{
        //        this.operateDisable = true;
        //    }
        //    this.operateIndex = _index;
        //    if (_index === 3) {
        //        this.$alert('','',{
        //            confirmButtonText: '确定',
        //            callback: action  => {
        //                if (action  === 'confirm') {
        //                    this.$message.success('已悉知')
       //                 }
       //             }
       //         })
       //         this.$alert('提醒:当前组织机构树存在下级节点,无法删除!<br/>提醒:请再次确认删除本级组织机构,删除后无法恢复!', '提示', {
      //              confirmButtonText: '确定',
      //              callback: action => {
      //                  if (action == "confirm") {
      //                      this.$message.success('已悉知')
      //                  }
      //              }
      //          });
      //      }
      //  }
    }
}

子组件

html 复制代码
<template>
  <div>
    <el-tree
    class="tree"
    :indent="0"
    ref="tree"
    :show-checkbox="true"
    :data="data"
    :props="defaultProps"
    node-key="checkbox"
    empty-text="暂无节点权限,联系管理员"
    :default-expand-all="false"
    :check-strictly="true"
    :check-on-click-node="true"
    :accordion="false"
    :highlight-current="true"
    @node-contextmenu="nodeMenu"
    @node-drop="handleDrop"
    draggable
    :allow-drop="allowDrop"
    style="padding-left: 0px;">
    <span slot-scope="{ data }">
      <!-- <span slot-scope="{ node, data }"> -->
      <span class="typecss">{{ data.level == 1?'局':data.level == 2?'司':data.level == 3?'项':data.level == 4?'隧': '' }}</span>
      <span class="identy" :style="{ color: data.type == 1?'#2762e2':data.type == 0?'#36b636': '#999' }">{{ data.type == 1?'管':data.type == 0?'用': '' }}</span><span id="LABEL">{{ data.allname }}</span>
      <!-- <span class="idty">{{ node.level == 1?'主':node.level == 2?'次':node.level == 3?'项':node.level == 4?'隧': '其' }}</span> -->
    </span>
  </el-tree>
  <!--  -->
  <div v-show="optionCardShow" id="right-menu" ref="container" :style="{top: optionCardY  +'px', left: optionCardX  +'px'}" @contextmenu.prevent="rightrightClick($event)">
    <span style="position:absolute; top:0px; right:0px; color:#333;border:1px solid #999; font-size:13px;" @click="optionCardShow=false"><i class="el-icon-close"></i></span>
    <div style="margin-top:5px;">
      <div class="btu" v-for="(item, index) in btuList" :key="index" @click="BtuClick(item)"><span>{{ item.label }}</span></div>
      <!-- <div class="btu"><span>查看本级机构</span></div>
      <div class="btu"><span>修改本级机构</span></div>
      <div class="btu" @click="BtuClick"><span>删除本级机构</span></div>
      <div class="btu"><span>映射本级机构</span></div> -->
    </div>
  </div>
  </div>
</template>
javascript 复制代码
<script>
  export default {
    props: [ 'treeData'],
    data() {
      return {
        optionCardShow: false,
        optionCardY: 100, optionCardX: 100, postionStyle:{},
        data:this.treeData,  //  父组件传值
        selectNode: {},
        rightoptionData: {},
        btuList: [{ label: '新增', value: 0 },{ label: '查看', value: 1 },{ label: '修改', value: 2 },{ label: '删除', value: 3 },{ label: '迁移', value: 4 }],
        btuUserList: [],
        defaultProps: {
          children: 'children',
          label: 'allname'
        }
      };
    },
    beforeDestroy() {
      window.removeEventListener('resize', this.handleResize);
    },
    mounted() {
      console.log(this.treeData);
      // this.data = this.treeData;
      window.addEventListener('resize', this.handleResize);
    },
    methods: {
      // handleDragStart(node, ev) {  // 节点开始拖拽时触发的事件
      //   console.log('节点开始拖拽时触发的事件  drag start', node, ev);
      // },
      // handleDragEnter(draggingNode, dropNode, ev) {  //  拖拽进入其他节点时触发的事件
      //   console.log('拖拽进入其他节点时触发的事件  tree drag enter: ',draggingNode, dropNode, ev);
      // },
      // handleDragLeave(draggingNode, dropNode, ev) {  //  拖拽离开某个节点时触发的事件
      // if (draggingNode.data.parentId !== dropNode.data.parentId) {
      //    alert('超出拖拽的节点范围,拖拽只能在同父节点下')
      // }
        // console.log('****************拖拽离开某个节点时触发的事件 tree drag leave: ',draggingNode, dropNode.label, ev);
      // },
      // handleDragOver(draggingNode, dropNode, ev) {  // 在拖拽节点时触发的事件(类似浏览器的 mouseover 事件)
      // // if (condition) {
      // // }
      //   console.log('在拖拽节点时触发的事件(类似浏览器的 mouseover 事件)  tree drag over: ', draggingNode, dropNode.label, ev);
      // },
      // handleDragEnd(draggingNode, dropNode, dropType, ev) {  //  拖拽结束时(可能未成功)触发的事件
      //   console.log('拖拽结束时(可能未成功)触发的事件  tree drag end: ',draggingNode, dropNode && dropNode.label, dropType, ev);
      // },
      handleDrop(draggingNode, dropNode, dropType, ev) {    //   拖拽成功完成时触发的事件
        this.getProjectVolumeTree();  //  拖拽成功 触发相应接口
        console.log('拖拽成功完成时触发的事件  tree drop: ',draggingNode, dropNode.label, dropType, ev);
      },
      allowDrop(draggingNode, dropNode, type) {  //  拖拽时判定目标节点能否被放置
        console.log('拖拽时判定目标节点能否被放置  allowDrop', draggingNode, dropNode, type);
        if (draggingNode.data.level === dropNode.data.level) {
          if (draggingNode.data.parentId === dropNode.data.parentId) {
            return type === "prev" || type === "next";
          } else {
            return false;
          }
        } else {
          // 不同级进行处理
          return false;
        }
      },
      //tree拖拽成功完成时触发的事件 
      getProjectVolumeTree() {
        console.log('tree拖拽成功完成时触发的事件');
      },
      allowDrag(draggingNode) {
        console.log('8989', draggingNode.data.allname);
        // return draggingNode.data.label.indexOf('三级 3-2-2') === -1;
        return true;
      },
      //  单选
      handleNodeClick (data, checked, node) {
        console.log(data,'ppp');
        console.log( checked, 'll');
        console.log(node);
        
        if (checked) {
          this.$refs.tree.setCheckedNodes([data])
          this.selectNode = data;
          this.$parent.ParentChooseOrgTree(data);
        }
      },
      //  右击
      nodeMenu(e, data, n, t) {
        console.log(e, data, n,t, '右击');
        this.optionCardShow = false
        this.optionCardX = e.x // 让右键菜单出现在鼠标右键的位置
        this.optionCardY = e.y
        this.$parent.ParentChooseOrgTree(data);
        this.rightoptionData = data
        // this.node = n // 将当前节点保存
        this.optionCardShow = true // 展示右键菜单
      },
      rightMenuClose(event) {
        let dom = document.getElementById('right-menu')
        if (dom) {
          if (!dom.contains(event.target)) {
            //点击到了id为right-menu以外的区域,就隐藏菜单
            this.optionCardShow = false
          }
        }
      },
      // 右击demo事件
      BtuClick(_item) {
        console.log(_item);
        switch (_item.value) {
          case 0:
            this.$message.warning(_item.label)
            break;
          case 1:
            this.$message.warning(_item.label)
            break;
          case 2:
            this.$message.warning(_item.label)
            break;
          case 3: //删除事件
          this.$parent.ParentChooseDeleteOrgTree(this.selectNode, _item);  //  父组件事件,在这里是子组件调用父组件函数
            this.$message.warning(_item.label)
            break;
          case 4:
            this.$message.warning(_item.label)
            break;
          default:
            break;
        }
      },
      //
      rightrightClick(event) {
        event.preventDefault();
      },
    }
  };
</script>
css 复制代码
在这里插入代码片
相关推荐
逐·風4 小时前
unity关于自定义渲染、内存管理、性能调优、复杂物理模拟、并行计算以及插件开发
前端·unity·c#
Devil枫4 小时前
Vue 3 单元测试与E2E测试
前端·vue.js·单元测试
尚梦5 小时前
uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
前端·小程序·uni-app
GIS程序媛—椰子5 小时前
【Vue 全家桶】6、vue-router 路由(更新中)
前端·vue.js
前端青山6 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
毕业设计制作和分享6 小时前
ssm《数据库系统原理》课程平台的设计与实现+vue
前端·数据库·vue.js·oracle·mybatis
程序媛小果6 小时前
基于java+SpringBoot+Vue的旅游管理系统设计与实现
java·vue.js·spring boot
从兄7 小时前
vue 使用docx-preview 预览替换文档内的特定变量
javascript·vue.js·ecmascript
凉辰7 小时前
设计模式 策略模式 场景Vue (技术提升)
vue.js·设计模式·策略模式
清灵xmf8 小时前
在 Vue 中实现与优化轮询技术
前端·javascript·vue·轮询