el-tree-transfer是基于vue和element-ui的树形穿梭组件,使用前请确认是否引入element-ui。此组件类似element-ui的transfer组件,该组件分别是Checkbox多选框,Button按钮和Tree树形控件整合页成,在遇到需要树形穿梭功能时,推荐使用!

github文档:https://github.com/hql7/tree-transfericon-default.png?t=N7T8https://github.com/hql7/tree-transfer

一、安装

npm install el-tree-transfer --save

//或者

npm i el-tree-transfer -S

二、基本使用

<template>
    <div>
        // 你的代码
        ...
        // 使用树形穿梭框组件
        <tree-transfer :title="title" 
            :from_data='fromData'                 //源数据,类型:Array,必填项
            :to_data='toData'                     //目标数据,类型:Array,必填项
            :defaultProps="{label:'label'}"       //配置项,匹配数据集中对应键值,非必填项
            @add-btn='add'                        //点击添加按钮时触发的事件
            @remove-btn='remove'                  //点击移除按钮时触发的事件
            :mode='mode'                          //设置模式,字段可选transfer或addressList,类型String
            height='540px'                        //高度,类型:String,非必填项 
            filter                                //是否开启筛选功能,类型:Boolean
            openAll                               //是否默认展开全部,类型:Boolean
        >
        </tree-transfer>
    </div>
</template>

  <script>
      import treeTransfer from 'el-tree-transfer' // 引入

      export defult {
        data(){
          return:{
            mode: "transfer", // transfer addressList
            fromData:[
              {
                id: "1",
                pid: 0,
                label: "一级 1",
                children: [
                  {
                    id: "1-1",
                    pid: "1",
                    label: "二级 1-1",
                    disabled: true,
                    children: []
                  },
                  {
                    id: "1-2",
                    pid: "1",
                    label: "二级 1-2",
                    children: [
                      {
                        id: "1-2-1",
                        pid: "1-2",
                        children: [],
                        label: "二级 1-2-1"
                      },
                      {
                        id: "1-2-2",
                        pid: "1-2",
                        children: [],
                        label: "二级 1-2-2"
                      }
                    ]
                  }
                ]
              },
            ],
            toData:[]
          }
        },
        methods:{
          // 切换模式 现有树形穿梭框模式transfer 和通讯录模式addressList
          changeMode() {
            if (this.mode == "transfer") {
              this.mode = "addressList";
            } else {
              this.mode = "transfer";
            }
          },
          // 监听穿梭框组件添加
          add(fromData,toData,obj){
            // 树形穿梭框模式transfer时,返回参数为左侧树移动后数据、右侧树移动后数据、移动的{keys,nodes,halfKeys,halfNodes}对象
            // 通讯录模式addressList时,返回参数为右侧收件人列表、右侧抄送人列表、右侧密送人列表
            console.log("fromData:", fromData);
            console.log("toData:", toData);
            console.log("obj:", obj);
          },
          // 监听穿梭框组件移除
          remove(fromData,toData,obj){
            // 树形穿梭框模式transfer时,返回参数为左侧树移动后数据、右侧树移动后数据、移动的{keys,nodes,halfKeys,halfNodes}对象
            // 通讯录模式addressList时,返回参数为右侧收件人列表、右侧抄送人列表、右侧密送人列表
            console.log("fromData:", fromData);
            console.log("toData:", toData);
            console.log("obj:", obj);
          }
        },
        components:{ treeTransfer } // 注册
      }
    </script>

    <style>
    ...
    </style>

三、文档

序号参数说明类型默认值补充
1width宽度String100%建议在外部盒子设定宽度和位置
2height高度String320px-
3title标题String["源列表", "目标列表"]-
4button_text按钮名字Array--
5from_data源数据Array-数据格式同element-ui tree组件,但必须有id和pid
6to_data目标数据Array-数据格式同element-ui tree组件,但必须有id和pid
7defaultProps配置项-同el-tree中propsObject{ label: "label", children: "children", isLeaf: "leaf", disable: "disable" }用法和el-tree的props一样
8node_key自定义node-key的值,默认为idStringid必须与treedata数据内的id参数名一致,必须唯一
9pid自定义pid的参数名,默认为"pid"Stringpid有网友提出后台给的字段名不叫pid,因此增加自定义支持
10leafOnly废弃---
11filter是否开启筛选功能Booleanfalse根据defaultProps参数的label字段筛选
12openAll是否默认展开全部Booleanfalse存在性能问题
13renderContent renderContentLeft, renderContentRight自定义树节点, 用法同element-ui treeFunction-2.2.3版本拆为两个函数分别定义左右两侧自定义节点
14mode设置穿梭框模式Stringtransfermode默认为transfer模式,即树形穿梭框模式,可配置字段为addressList改为通讯录模式,通讯录模式时按钮不可自定义名字,如要自定义标题名在title数组传入四个值即可,addressList模式时标题默认为通讯录、收件人、抄送人、密送人
15transferOpenNode穿梭后是否展开穿梭的节点Booleantrue默认为true即展开穿梭的节点,便于视觉查看,增加此参数是因为数据量大时展开会有明显卡顿问题,但注意,如此参数设置为false则穿梭后不展开,毕竟无法确定第几层就会有庞大数据
16defaultCheckedKeys默认选中节点Arrayfalse只匹配初始时默认节点,不会在你操作后动态改变默认节点
17placeholder设置搜索框提示语String输入关键词进行筛选-
18defaultTransfer是否自动穿梭一次默认选中defaultCheckedKeys的节点Booleanfalse用来满足用户不想将数据拆分成fromData和toData的需求
19arrayToTree是否开启一维数组转化为树形结构Booleanfalse数据必须存在根节点,并且不会断节,数据格式详见github上app.vue,根据id、pid对应关系转化,存在一定的性能问题
20addressOptions通讯录模式配置项Object{num: Number, suffix: String, connector: String}num-> 所需右侧通讯录个数,默认3 suffix-> label后想要拼接的字段(如id,即取此条数据的id拼接在后方)默认suffix connector -> 连接符(字符串)默认-
21lazy是否启用懒加载Booleanfalse效果动el-tree懒加载,不可和openAll或默认展开同时使用
22lazyFn懒加载的回调函数Function-当适用lazy时必须传入回调函数,示例:lazyFn='loadNode',返回参数loadNode(node, resolve, from), node->当前展开节点node,resolve->懒加载resolve,from -> left/right 表示回调来自左侧/右侧
23high-light是否高亮当前选中节点Booleanfalse-
24filterNode自定义搜索函数Function-不传则仍默认根据defaultProps参数的label字段筛选
25defaultExpandedKeys默认展开节点Array-要展开的节点id数组,会自动去重生效在左右两侧
26lazyRight2.2.9 版本lazy属性只对左侧树生效,如果需要右侧也是用懒加载->lazyRightBoolean--
27sjr通讯录模式,设置右侧收件人数据Array--
28csr通讯录模式,设置右侧抄送人数据Array--
29msr通讯录模式,设置右侧密送人数据Array--
30rootPidValue穿梭框模式,根节点数据pid的值,用于匹配退出循环,重要String,Number0-
31checkStrictly是否父子不关联Booleanfalse此模式不支持lazy,返回的fromData和toData是最新数据,obj里面的keys,nodes不完整。且对删空子节点后的父节点左右两边处理逻辑有差异:当授权时既然要在右边出现,必然需要左侧父节点,而删除授权时,移除子权限并不代表想移除父权限
32renderAfterExpand是否在第一次展开某个树节点后才渲染其子节点Booleantrue-
33expandOnClickNode是否在点击节点的时候展开或者收缩节点Booleantrue-
34checkOnClickNode是否在点击节点的时候选中节点Booleanfalse-
35indent相邻级节点间的水平缩进,单位为像素Number16-
36icon-class自定义树节点的图标String--
37draggable是否开启拖拽节点功能Booleanfalse-
38allow-drag判断节点能否被拖拽Function(node)--
39allow-drop拖拽时判定目标节点能否被放置Function(draggingNode, dropNode, type)-type 参数有三种情况:'prev'、'inner' 和 'next',分别表示放置在目标节点前、插入至目标节点和放置在目标节点后
40checkStrictlyType父子不关联的三种模式:authorization授权模式,puppet木偶模式modular积木模式Stringauthorization:左侧选择子节点自动带着父节点;右侧选择父节点自动带着子节点;此模式两侧可能存在相同的非叶子节点;puppet:纯父子不关联穿梭,但要保持完整的树形结构,只自动带上穿梭到对面拼接所需的骨架结构;此模式两侧可能存在相同的非叶子节点;modular纯父子不关联穿梭,也不保持完整的树形结构,像积木一样右侧要形成树形则需要把左侧拆除,左侧拆的越多右侧形成的树结构越完整;此模式左右两侧保证严格的唯一性

四、事件

序号事件名称说明回调参数
1add-btn点击添加按钮时触发的事件(2.4.0以前为addBtn)function(fromData,toData,obj),树形穿梭框transfer模式分别为1.移动后左侧数据,2.移动后右侧数据,3.移动的节点keys、nodes、halfKeys、halfNodes对象;通讯录addressList模式时返回参数为右侧收件人列表、右侧抄送人列表、右侧密送人列表
2remove-btn点击移除按钮时触发的事件(2.4.0以前为removeBtn)function(fromData,toData,obj),树形穿梭框transfer模式分别为1.移动后左侧数据,2.移动后右侧数据,3.移动的节点keys、nodes、halfKeys、halfNodes对象;通讯录addressList模式时返回参数为右侧收件人列表、右侧抄送人列表、右侧密送人列表
3left-check-change左侧源数据勾选事件function(nodeObj, treeObj, checkAll)见el-tree组件check事件返回值, 新增checkAll参数表示是否全部选中
4right-check-change右侧目标数据勾选事件function(nodeObj, treeObj, checkAll)见el-tree组件check事件返回值, 新增checkAll参数表示是否全部选中
5node-drag-start节点开始拖拽时触发的事件共3个参数,依次为:"left"/"right"、被拖拽节点对应的 Node、event
6node-drag-enter拖拽进入其他节点时触发的事件共4个参数,依次为:"left"/"right"、被拖拽节点对应的 Node、所进入节点对应的 Node、event
7node-drag-leave拖拽离开某个节点时触发的事件共4个参数,依次为:"left"/"right"、被拖拽节点对应的 Node、所离开节点对应的 Node、event
8node-drag-over在拖拽节点时触发的事件(类似浏览器的 mouseover 事件)共4个参数,依次为:"left"/"right"、被拖拽节点对应的 Node、当前进入节点对应的 Node、event
9node-drag-end拖拽结束时(可能未成功)触发的事件共5个参数,依次为:"left"/"right"、被拖拽节点对应的 Node、结束拖拽时最后进入的节点(可能为空)、被拖拽节点的放置位置(before、after、inner)、event
10node-drop拖拽成功完成时触发的事件共5个参数,依次为:"left"/"right"、被拖拽节点对应的 Node、结束拖拽时最后进入的节点、被拖拽节点的放置位置(before、after、inner)、event

五、方法

序号名称说明
1clearChecked清除选中节点,默认清除全部 type:string left左边 right右边 all全部 默认all
2getChecked获取选中数据
3setChecked设置选中数据 function(leftKeys = [], rightKeys = [])
4clearFilter清除搜索框条件,默认清除全部 function(type: String) left左边 right右边 all全部 默认all

六、slot

序号名字说明
1left-footer穿梭框左侧、右侧底部slot
2right-footer穿梭框左侧、右侧底部slot
3title-left穿梭框标题区左侧、右侧自定义内容
4title-right穿梭框标题区左侧、右侧自定义内容
5form左侧内容区上部slot
6to右侧内容区上部slot
7content-left自定义左侧树节点
8content-right自定义右侧树节点

七、获取选中项id

export default{
    data (){
        return {
            selected: []
        }
    },
    methods: {
        add(fromData,toData,obj){
            //追加选中数据ID
            this.selected.concat(obj.keys);
        },
        remove(fromData,toData,obj){
            //移除删除项数据
            this.selected = this.selected.filter(item => obj.keys.indexOf(item)==-1);
        }
    }
}

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐