本文实例为大家分享了vue穿梭框实现上下移动的具体代码,供大家参考,具体内容如下
使用elementUI的树形组件 tree组件
功能需求:
1、左侧的子节点移动到右侧的表格中
2、右侧选中的内容移动到左侧树中,单一移动和全部移动
3、点击右侧节点实现上下移动
首先会遇到的问题可能是如何实现左侧只让子节点显示checkbox,我这边是根据后端返回了一个参数来判断是否是父节点(其实只要后端给父节点加一个nocheck=true就可以)
1
2
3
4
5
6
7
8
9
10
11
12
|
// setLeftAgency :封装好的请求接口名称 setLeftAgency(params).then((res) => { // 当返回的code==0时就意味着成功 if (res.data.code == 0) { let { data } = res.data; data.forEach((item) => { //遍历返回的数据,如果当这个参数是Item时候就给当前这条数据加上nocheck=true,这样就不会显示checkbox if (item.Type!== 'Item' ){ item.nocheck= true } // delete item.children; }); this .parentNodes = data; // 把修改好的数据放在数组中再渲染 } |
左侧树结构,中间的按钮和右侧表格(左侧树结构和表格是封装好的,直接引入)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
< div class = "leftTree" > // 这里绑定的onCreated是左侧树的初始化函数,parentNodes储存了左侧树的所有数据 < ztree :setting = "setting" @ onCreated = 'onCreated' :parentNodes = "parentNodes" ></ ztree > </ div > < div class = "centerBtn" > < el-button type = "danger" plain icon = "el-icon-arrow-right" @ click = "moveTable" ></ el-button > < el-button type = "danger" plain icon = "el-icon-d-arrow-left" @ click = "moveTreeAll" ></ el-button > < el-button type = "danger" plain icon = "el-icon-arrow-left" @ click = "moveTree" ></ el-button > < el-button type = "danger" plain @ click = "moveUp(index)" >上移</ el-button > < el-button type = "danger" plain @ click = "moveDown(index)" >下移</ el-button > </ div > < div class = "rightTable" > < table :data.sync = "tableData" // 表格接口返回的数据 ref = "personListSettingPage" :loading = 'vxeLoading' v-model = "selectGroups" // 绑定右侧table选中项的数组 id = "personListSettingPage" :showPagination = 'false' :height-full-screen = 'false' @ sort-change = "sortChange" @ checkbox-change = "selectChange" // 右侧选中的单选事件 @ checkbox-all = "selectAll" // 右侧选中项的全选事件 @ data-refresh = "getTableData()" > // 获取右侧表格数据的函数 < vxe-table-column type = "checkbox" width = "60" align = "center" ></ vxe-table-column > < table-column field = "text" show-overflow = "title" title = "已选指标" filterType = '' > </ table-column > </ table > </ div > |
用到的参数
1
2
3
4
5
6
|
moveDownId: "" , //下移时储存的数据 moveUpId: "" , //上移时遍历右侧表格数据储存的数据 selectGroups:[], // 用来存放右侧选中的数据 tableData:[], // 请求回来后会把左侧的所有数据存放在此数组中 parentNodes:[], //左侧树的所有数据 treeObj: "" , |
左侧树初始化和右侧表格复选框选择事件
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 初始化ztree onCreated(treeObj){ this .treeObj = treeObj let nodes = this .treeObj.getCheckedNodes( true ); }, //复选框事件 selectChange({ checked, records}) { this .selectGroups = records // 把选择的那条数据存储到数组中 }, //复选框全选事件 selectAll({ checked, records }) { this .selectGroups = records }, |
上移
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
moveUp(index){ if ( this .selectGroups.length>0){ // 判断右侧是否有选中的项 let goOrnot = true this .selectGroups.find((seItem)=>{ //遍历右侧tab中选中的项,找到对应的id if (seItem.id== this .moveUpId.id){ this .$message.warning( this .moveUpId.text+ "此行没有上移的空间了" ) goOrnot = false } }) if (goOrnot){ this .tableData.forEach((item,index)=>{ // 遍历右侧表格所有数据, this .$set(item, 'rowIndex' ,index) //由于受JavaScript的限制,vue.js不能监听对象属性的添加和删除,所以要使用$set或者Object.assign(target, sources),这样试图才会更新 }) let flag = true this .selectGroups.forEach((val,index2)=>{ this .tableData.find((itm,ind)=>{ if (val.id==itm.id){ if (itm.rowIndex==0){ // 遍历右侧选中数据和所有数据相对比,如果id相同,在判断刚刚添加的rowIndex属性值是多少 this .$message.warning(itm.text+ "此行没有上移的空间了" ) this .moveUpId = itm // 把当前这条数据存起来 flag = false return } else { if (flag){ // 此时可以对多条数据进行移动了 let changeItem = JSON.parse(JSON.stringify( this .tableData[itm.rowIndex-1])) this .tableData.splice(itm.rowIndex-1,1); this .tableData.splice(itm.rowIndex,0,changeItem) } } } }) }) } } else { this .$message.warning( '请选择要移动的数据' ) } }, |
下移
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
moveDown(index){ if ( this .selectGroups.length>0){ let goOrnot = true this .selectGroups.find((seItem)=>{ if (seItem.id== this .moveDownId.id){ this .$message.warning( this .moveDownId.text+ "此行没有下移的空间了" ) goOrnot = false } else { this .moveFlag = true } }) if (goOrnot){ this .tableData.forEach((item,index)=>{ this .$set(item, 'rowIndex' ,index) }) let selectData = JSON.parse(JSON.stringify( this .tableData)) let a=[... this .selectGroups] a.reverse().forEach((val,index2)=>{ selectData.find((itm,ind)=>{ if (val.id==itm.id){ if (itm.rowIndex==selectData.length-1){ this .$message.warning(itm.text+ "此行没有下移的空间了" ) this .moveDownId = itm this .moveFlag = false } else { if ( this .moveFlag){ let changeItem = itm let delIndex=selectData.findIndex(i=>i.id == changeItem.id) this .tableData.splice(delIndex,1); this .tableData.splice(delIndex+1,0,changeItem) this .$refs.personListSettingPage.$refs.Table.setCheckboxRow( this .tableData[itm.rowIndex+1], true ) // 给右侧table加了一个ref=personListSettingPage } } } }) }) } } else { this .$message.warning( '请选择要移动的数据' ) } } |
表格移动到树
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/* 移入tree */ moveTree(){ if ( this .selectGroups.length>0){ this .selectGroups.forEach(item=>{ this .parentNodes.find(val=>{ if (val.id == item.pid){ /* 添加节点 */ let node = this .treeObj.getNodeByParam( "id" , val.id, null ); this .treeObj.addNodes(node,item) /* 取消新增节点的选中状态 */ let cancelNode = this .treeObj.getNodeByParam( "id" , item.id, null ); this .treeObj.checkNode(cancelNode, false , true ); } }) this .tableData.splice( this .tableData.findIndex(val => val.id === item.id), 1) }) } else { this .$message.warning( '请选择要移动的数据' ) } }, |
树移到表格
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/* 移入表格 */ moveTable(){ let arr=[] let nodes = this .treeObj.getCheckedNodes( true ); if (nodes.length>0){ nodes.forEach(item=>{ this .tableData.find(val=>{ arr.push(val.id) }) if (arr.indexOf(item.id)>-1) return this .$message.error( "数据重复,请勿重新添加" ) this .treeObj.removeNode(item) this .tableData.push( this .filterObj(item,[ "checked" , "codeSetId" , 'id' , 'img' , 'infoItemFlag' , 'isMult' , 'itemType' , 'locked' , 'mult' , 'orgCode' , 'pid' , 'sort' , 'syrs' , 'text' ])) // 调用下面的方法,去除多余字段 }) } else { this .$message.warning( '请勾选数据' ) } }, |
封装的过滤字段
1
2
3
4
5
6
7
8
|
/* 过滤对象多余字段 */ filterObj(obj, arr) { const result = {} Object.keys(obj).filter((key) => arr.includes(key)).forEach((key) => { result[key] = obj[key] }) return result } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/g1437353759/article/details/113108556