zoukankan      html  css  js  c++  java
  • vue+element 树形穿梭框组件

    <div class="organizational">
             <el-dialog
                :title="dialogTitle"
                :visible.sync="addDialogVisible"
                v-if="addDialogVisible"
                :before-close="handleClose"
                :close-on-click-modal="false"
                width="80%">
                <tree-transfer
                    ref="mytree"
                    :sourceData="sourceData"
                    :targetData="targetData"
                    @detach="detach"
                    @shuttle="shuttle"
                    @target_expand="targetExpand"
                    @source_expand="sourceExpand"
                    @target-check-change="targetCheckChange"
                    @target-check="targetCheck"
                    @source-check-change="sourceCheckChange"
                    @source-check="sourceCheck"
                    @source-click="sourceClick">
                </tree-transfer>
                <div slot="footer" class="dialog-footer">
                    <el-button size="medium" type="primary" @click="addSubmit">确定</el-button>
                    <el-button size="medium" @click="addDialogVisible = false">取消</el-button>
                </div>
            </el-dialog>
        </div>
    

      

    <!--树形穿梭框组件-->
    <template>
        <el-row :gutter="20">
            <el-col :span="11">
                <el-card class="box-card">
                    <div slot="header" class="w-title clearfix">
                        <span>主维度系统数据
                            <el-switch v-model="isOnly" class="switch"></el-switch>
                            <span>
                                <em>{{isOnly ? '移动不包含子机构' : '移动包含子机构'}}</em>
                            </span>
                        </span>
                    </div>
                    <el-tree
                        :data="sourceData"
                        show-checkbox
                        default-expand-all
                        node-key="id"
                        ref="sourceTree"
                        highlight-current
                        :check-strictly="isOnly"
                        :props="defaultProps"
                        @check-change="sourceCheckChange"
                        @check="sourceCheck"
                        @node-expand="sourceExpand"
                        @node-click="sourceClick">
                    </el-tree>
                </el-card>
            </el-col>
            <el-col :span="2" style="margin-top:1%;">
                <div style="text-align: center;">
                    <el-button type="primary" icon="el-icon-back" circle @click="detach" :disabled="l_mutilCk"></el-button>
                    <el-button type="primary" icon="el-icon-right" circle @click="shuttle" :disabled="r_mutilCk"></el-button>
                </div>
            </el-col>
            <el-col :span="11">
                <el-card class="box-card">
                    <div slot="header" class="clearfix">
                        <span>子维度系统数据</span>
                    </div>
                    <el-tree
                        :data="targetData"
                        show-checkbox
                        default-expand-all
                        node-key="id"
                        ref="targetTree"
                        :check-strictly="false"
                        highlight-current
                        @check="targetCheck"
                        @node-expand="targetExpand"
                        @node-click="targetClick"
                        :props="defaultProps">
                    </el-tree>
                </el-card>
            </el-col>
        </el-row>
    </template>
    <script>
    export default {
            name: 'mytreeTransfer',
            props: ["defaultProps", "sourceData", "targetData"],
            data() {
                return {
                    s_AllChecked: false,
                    s_disabled: false,
                    s_indeterminate: false,
                    l_mutilCk:true,
                    t_AllChecked: false,
                    t_indeterminate: false,
                    t_disabled: false,
                    r_mutilCk:true,
                    create_tree:{},
                    isOnly:false,
                }
            },
            methods: {
                targetClick(data,node,com){this.$emit("target_click",data,node,com)},
                sourceClick(data,node,com){this.$emit("source_click",data,node,com)},
                targetExpand(data,node,com){ this.$emit("target_expand",data,node,com)},
                sourceExpand(data,node,com){ this.$emit("source_expand",data,node,com)},
                s_checkAllChange(args) {
                    this.s_AllChecked = args;
                    this.checkAll(this.sourceData, args, 'source');
                    this.s_indeterminate = false;
                },
                t_checkAllChange(args) {
                    this.t_AllChecked = args;
                    this.checkAll(this.targetData, args, 'target');
                    this.t_indeterminate = false;
                },
                targetLoad(node, resolve){
                    // console.log(node);
                },
                sourceCheck(data, checked) {
                    this._sourceCheckAll();
                    this.isDisabledArrow();
                    this.$emit("source-check", { data, checked })
                },
                sourceCheckChange(data, checked, indeterminate) {
                    this.$emit("source-check-change", {data,checked,indeterminate})
                },
                _sourceCheckAll() {
                   this.checkAllButtonStatus('sourceTree');
                },
                targetCheck(data, checked) {
                    this._tagetCheckAll();
                    this.isDisabledArrow();
                    this.$emit("target-check", { data, checked})
                },
                isDisabledArrow(){
                   let targetTree=this.$refs.targetTree.getCheckedNodes().length;
                    let sourceTree=this.$refs.sourceTree.getCheckedNodes().length;
                    this.l_mutilCk= (targetTree>0)?false:true;
                    this.r_mutilCk= (targetTree<2&&sourceTree>0)?false:true;
                },
    
                targetCheckChange(data, checked, indeterminate) {
                    this.$emit("target-check-change", { data, checked, indeterminate})
                },
                _tagetCheckAll() {
                   this.checkAllButtonStatus('targetTree');
                },
                checkAllButtonStatus(args='sourceTree'){
                    let banxuan = this.$refs[args].getHalfCheckedNodes();
                    let checknode = this.$refs[args].getCheckedNodes();
                    let isAllCk= (banxuan.length == 0 && checknode.length > 0);
                    let isIndeterminate= banxuan.length > 0 ? true : false;
                    if(args=='sourceTree'){
                         this.s_AllChecked =isAllCk
                         this.s_indeterminate =isIndeterminate;
                    }else{
                        this.t_AllChecked = isAllCk;
                        this.t_indeterminate = isIndeterminate;
                    }
                },
                //左箭头 移除事件
                detach() {
                    let sourceTree = this.$refs.sourceTree;
                    let targetTree = this.$refs.targetTree;
                    let sourceCurrent = sourceTree.getCheckedNodes();
                    let targetCurrent = targetTree.getCheckedNodes();
                    let havaChild=targetCurrent.filter(item=>item.hasOwnProperty('children'))
                    let noChild=targetCurrent.filter(item=>!item.hasOwnProperty('children'))
                    targetCurrent.forEach(item=>{
                          this.deepDisableFn(this.sourceData, item.id, false);
                          targetTree.remove(item);
                    })
                    this.$refs.sourceTree.setCheckedKeys(targetCurrent.map(item=>item.id));
                    this.$emit("detach", targetCurrent);
                },
                //右箭头 穿梭事件
                shuttle() {
                    //禁用左侧数据同时判断右侧结构
                    let sourceTree = this.$refs.sourceTree;
                    let targetTree = this.$refs.targetTree;
                    let sourceCurrent = sourceTree.getCheckedNodes(false,false);
                    let targetCurrent = targetTree.getCheckedNodes();
                   if (sourceCurrent.length > 0) {
                         let haveChild=[],notChild=[];
                     if(!this.isOnly){
                         sourceCurrent.forEach(item => {
                             let newItem=JSON.parse(JSON.stringify(item));
                             if(newItem.hasOwnProperty('children'))  haveChild.push(newItem);
                             else notChild.push(newItem);
                             this.deepDisableFn(this.sourceData, item.id, true);
                         });
                         haveChild.forEach(element=>{
                           let obj=this.createTree(element,notChild);
                             element=obj.element;
                             notChild=obj.noC;
                         });
                         let newArray=[].concat(haveChild);
                          for (var i = 0; i < newArray.length; i++) {
                              for (var j = 0; j < newArray[i].children.length; j++) {
                                  newArray.forEach((item,index)=>{
                                      if(newArray[i].children[j].id==item.id){
                                          haveChild.splice(haveChild.indexOf(item),1)
                                      }
                                  })
                              }
                          }
                          newArray=[];
                     }else{
                         sourceCurrent.forEach(item => {
                             let newItem=JSON.parse(JSON.stringify(item));
                             delete newItem.children;
                             notChild.push(newItem);
                             this.deepDisableFn(this.sourceData, item.id, true);
                         });
                     }
    
                       let meryAry=[...notChild,...haveChild];
                       if (targetCurrent.length > 0)meryAry.forEach(item=> targetTree.append(item,targetCurrent[0].id))   ; //targetTree.updateKeyChildren(targetCurrent[0].id, meryAry);
                       else meryAry.forEach(item=> this.targetData.push(item));
                       this.$refs.sourceTree.setCheckedKeys([]);
    
                       // setTimeout(()=>{ meryAry.forEach(item=>   this.$refs.targetTree.setCheckedKeys([item.id]))},100)
                   }
                    this.$emit("shuttle", sourceCurrent);
                },
                createTree(element,noC){
                      let newNoC=[],obj={};
                     noC.forEach((item,index)=>{
                                delete item.disabled;
                                if(item.id==element.id) noC.splice(noC.indexOf(item),1);
                       })
                     delete element.disabled;
                     if(element.hasOwnProperty('children')){
                         element.children.forEach(nodeItem=>{
                            let obj=this.createTree(nodeItem,noC);
                            nodeItem=obj.element
                            noC=obj.noC;
                         })
                     }
                    return {element,noC};
                },
                deepDisableFn(treeData, id, bool) {
                    for (let i = 0; i < treeData.length; i++) {
                        if (treeData[i].id == id) {
                            treeData[i].disabled = bool;
                            break;
                        } else {
                            if (treeData[i].hasOwnProperty("children")) {
                                this.deepDisableFn(treeData[i].children, id, bool);
                            }
                        }
                    }
                },
    
                targetPut(id, data,bool=true){
                    let tree=this.$refs.targetTree;
                      tree.append(data,id);
                      if(bool) setTimeout(()=>{tree.setCheckedKeys([id])},100);
    
    			},
    			sourcePut(id, data,bool=true){
                     let tree=this.$refs.sourceTree;
                    tree.append(data,id);
                     if(bool) setTimeout(()=>{tree.setCheckedKeys([id])},100);
    			},
                verdictAllDisable(treeData) {
                    let bool = true;
                    for (let i = 0; i < treeData.length; i++) {
                        if (treeData[i].disabled != true) {
                            bool = false
                            break;
                        }
                        if (treeData[i].hasOwnProperty("children") && bool) {
                            bool = this.verdictAllDisable(treeData[i].children);
                        }
                    }
                    return bool;
                },
    
                checkAll(treeData, bool, type = 'source') {
                    console.log("调用选中",treeData, bool, type);
                    for (let i = 0; i < treeData.length; i++) {
                        if (treeData[i].disabled != true) {
                            if (type == 'source') this.$refs.sourceTree.setChecked(treeData[i].id, bool);
                            else this.$refs.targetTree.setChecked(treeData[i].id, bool);
                            if (treeData[i].hasOwnProperty("children")) {
                                this.checkAll(treeData[i].children, bool, type);
                            }
                        }
                    }
                }
            }
        }
    </script>
    <style lang="less" scoped>
    /deep/ .el-tree-node>.el-tree-node__children{
        overflow: auto;
    }
    /deep/ .el-col-11{
        height:650px;
    }
    /deep/ .el-card {
        height:100%;
    }
    /deep/ .el-tree{
        height:650px;
        overflow:overlay;
    }
    .switch{
        margin-left:10px;
    }
    .w-title em{
        font-size:12px;
        font-style:normal;
        margin-left:5px;
    }
    </style>
    

      

  • 相关阅读:
    Android ViewGroup使用小结
    背包问题
    u3d demo起步第二章
    三国武将查询系统 //Java 訪问 数据库
    全端project师必备技能汇总
    记一次内存泄漏调试(memory leak)-Driver Monkey
    备战软考(4) 软考下午题攻略
    HDU1392:Surround the Trees(凸包问题)
    Nginx系列(二)--模块化
    《与古为徒与娟娟发屋》:书法家们刻意回避的一个问题:为什么推崇古代平民的作品而忽略当代平民的作品。4星。
  • 原文地址:https://www.cnblogs.com/theblogs/p/13902398.html
Copyright © 2011-2022 走看看