工作中遇到一个需求,需要将一个数据选择做成穿梭框,但是要求穿梭框左侧为树形结构、右侧为无层级结构的数据展示,ElementUI自身无法在穿梭框中添加树形结构,网上搜到了大佬封装的插件但是对于右侧的无树形结构一点还是不太满足,于是自己基于ElementUI和VUE2.X做了一个小组件,优化的地方还很多,但是能够基本满足业务需求,后面有时间也会努力去改的更加灵活。我是新手程序员,大佬们看到了有什么可以优化的地方希望能够指正。

<template>
<!-- 自定义树形穿梭框组件、理论上左右均可选择是否为树形结构,目前固定为左侧树形、右侧无层级结构 -->
<div class="tree-transfer">
<!-- 穿梭框左侧 -->
<div class="tree-transfer-left">
<!-- 左侧采用element-ui的el-tree -->
<el-tree
ref="treeLeft"
:data="dataLeft"
show-checkbox
node-key="id"
:props="defaultProps">
</el-tree>
</div>
<!-- 穿梭框中间按钮区域 -->
<div class="tree-transfer-middle">
<el-button circle type="info" icon="el-icon-arrow-left" @click="remove"></el-button>
<el-button circle type="info" icon="el-icon-arrow-right" @click="add"></el-button>
</div>
<!-- 穿梭框右侧 -->
<div class="tree-transfer-right">
<!-- 右侧直接放置结果 -->
<!-- 这里也采用tree结构,默认是对数据进行处理使得没有树形结构,也可以选择有树形结构 -->
<el-tree
ref="treeRight"
:data="dataRight"
show-checkbox
node-key="id"
:props="defaultProps">
</el-tree>
</div>
</div>
</template> <script>
export default{
props:['datas','defaultProps'],
data(){
return{
yuansiData:[],
dataLeft:[],
dataRight:[]
}
},
mounted() {
console.log(this.datas)
this.dataLeft = this.datas
this.yuansiData = JSON.parse(JSON.stringify(this.datas))
},
methods:{
add(){
// 定义一个递归过滤的方法,用来删掉父级中给的元素
// 获取所有选中的项并且去掉父级
let list = this.$refs.treeLeft.getCheckedNodes()
// 走原始数据中删掉已经选择的
// 1.父级的删除
const parList = list.filter(item=>{
return item.parameterInfoList
})
for(let item1 of parList){
let index = this.dataLeft.findIndex(item2=>{
return item2.id == item1.id
})
if(index>=0){
this.dataLeft.splice(index,1)
}
}
// 2.子级的删除
list = list.filter((item=>{
return !item.parameterInfoList
}))
// 这里做了三重循环,如果有可能需要对其进行优化
for(let item of list){
for(let ind in this.dataLeft){
if(this.dataLeft[ind].parameterInfoList.length){
let index = this.dataLeft[ind].parameterInfoList.findIndex(item2=>{
return item2.id == item.id
})
if(index>=0){
this.dataLeft[ind].parameterInfoList.splice(index,1)
}
}
}
}
this.$refs.treeLeft.setCheckedNodes([])
// 将选择的项添加到右侧
this.dataRight.push(...list)
},
remove(){
// 从右侧移除时的方法
// 1.从右侧删除选中的数据
let list = this.$refs.treeRight.getCheckedNodes()
for(let item of list){
let index = this.dataRight.findIndex(item2=>{
return item.id == item2.id
})
if(index>=0){
this.dataRight.splice(index,1)
}
}
// 2.把右侧删除的数据添加给左侧,但是要注意父级的问题
this.dataLeft = JSON.parse(JSON.stringify(this.yuansiData))
for(let index in this.dataLeft){
// 如果有子级去删除子级
for(let item of this.dataRight){
let ind = this.dataLeft[index].parameterInfoList.findIndex(item2=>{
return item2.id == item.id
})
if(ind>=0){
this.dataLeft[index].parameterInfoList.splice(ind,1)
}
}
this.dataLeft = this.dataLeft.filter(item2=>{
return item2.parameterInfoList.length!=0
})
}
},
getResult(){
return this.dataRight
}
}
}
</script> <style scoped lang="less">
.tree-transfer{
display: flex;
min-height: 250px;
.tree-transfer-left{
min-width: 200px;
border:1px #E5E5E5 solid;
border-radius: 10px;
padding: 10px;
}
.tree-transfer-middle{
display: flex;
justify-content: center;
align-items: center;
min-width: 120px;
}
.tree-transfer-right{
min-width: 200px;
border:1px #E5E5E5 solid;
border-radius: 10px;
padding: 10px;
}
}
</style>

父组件需要传递带层级结构的datas,和ElementUI中tree的props。

这里使用的datas中的唯一标识是id,子元素放在parameterInfoList字段中。

defaultProps: {
children: 'parameterInfoList',
label: 'name'
}

VUE+ElementUI实现左侧为树形结构、右侧无层级结构的穿梭框的更多相关文章

  1. vue Element-ui el-menu 左侧导航条

    <template> <!--实现左侧导航条动态渲染(三级)--> <el-menu class="el-menu-vertical-demo" @o ...

  2. 网页html结构右侧栏固定,左侧自适应大小。

    最近写了一个项目,写页面的结构,html树形结构是有header,container,footer部分,其中container部分是右侧栏是固定宽度,左侧是自适应宽度与屏幕高度. 第一次写的博客文章是 ...

  3. vue+element-ui之tree树形控件有关子节点和父节点之间的各种选中关系详解

    做后端管理系统,永远是最蛋疼.最复杂也最欠揍的事情,也永远是前端开发人员最苦逼.最无奈也最尿性的时刻.蛋疼的是需求变幻无穷,如同二师兄的三十六般变化:复杂的是开发难度寸步难行,如同蜀道难,难于上青天: ...

  4. 【vue系列】elementUI 穿梭框右侧获取当前选中项的值的思路

    最近 做了一个需求 在查询结果的表格中,选取(可多选)一些值,获取到保单号后,打开一个elementUI的穿梭框,然后获取到所有业务员,选取一些业务员后,将上一步获取到的保单号传递给业务员. 画个示意 ...

  5. spring boot + vue + element-ui全栈开发入门——前端列表页面开发

     一.页面 1.布局 假设,我们要开发一个会员列表的页面. 首先,添加vue页面文件“src\pages\Member.vue” 参照文档http://element.eleme.io/#/zh-CN ...

  6. spring boot + vue + element-ui全栈开发入门——基于Electron桌面应用开发

     前言 Electron是由Github开发,用HTML,CSS和JavaScript来构建跨平台桌面应用程序的一个开源库. Electron通过将Chromium和Node.js合并到同一个运行时环 ...

  7. 保姆级别的vue + ElementUI 搭建后台管理系统教程

    vue + ElementUI 搭建后台管理系统记录 本文档记录了该系统从零配置的完整过程 项目源码请访问:https://gitee.com/szxio/vue2Admin,如果感觉对你有帮助,请点 ...

  8. spring boot + vue + element-ui全栈开发入门——开篇

    最近经常看到很多java程序员朋友还在使用Spring 3.x,Spring MVC(struts),JSP.jQuery等这样传统技术.其实,我并不认为这些传统技术不好,而我想表达的是,技术的新旧程 ...

  9. 递归函数 Vue ElementUI

    对树形菜单的递归操作,首先应该对树形菜单数据进行整理,优化成自己需要的类型 比如Vue + ElementUI的动态侧边栏数据 export function routerRoleToPretty ( ...

随机推荐

  1. maven项目多环境打包问题

    1.xxx-api是基于springboot的模块 2.配置文件 application.properties spring.profiles.active=@activeEnv@ applicati ...

  2. H.265视频编码与技术全析(上)

    H.265视频编码与技术全析(上) 一. 概述 作为新一代视频编解码格式,H.265得到越来越广泛的应用.不久之前,苹果公司在翘首期盼中发布了iPhone6,该款手机较之以往的iPhone,不仅仅只是 ...

  3. CodeGen CreateFile实用程序

    CodeGen CreateFile实用程序 CreateFile实用程序允许根据存储库文件或结构定义创建ISAM文件. CreateFile实用程序的命令行选项如下: CreateFile -f & ...

  4. Hadoop 数据迁移用法详解

    数据迁移使用场景 冷热集群数据分类存储,详见上述描述. 集群数据整体搬迁.当公司的业务迅速的发展,导致当前的服务器数量资源出现临时紧张的时候,为了更高效的利用资源,会将原A机房数据整体迁移到B机房的, ...

  5. 1-3. SpringBoot基础,Java配置(全注解配置)取代xml配置

    最近突发奇想,整合一下以前一些学习笔记,分享自己这几年爬过的坑,逐步更新文章,谢谢大家的关注和支持. 这节讲一下SpringBoot的学习必须的一些基础,Java配置.其实在Spring2.0时代就已 ...

  6. [Azure DevOps] 使用 Inno Setup 制作桌面软件安装包

    1. 桌面应用程序的 CI/CD 桌面应用程序的 CI/CD 过程和网站有一些不同,毕竟桌面应用程序的"部署"只是将安装包分发到目标位置,连应用商店都不用上,根据公司的管理流程可以 ...

  7. 【NX二次开发】切换模块的方法,切换到制图模块

    源码(NX12.0): Session theSession = NXOpen::Session::GetSession(); theSession->ApplicationSwitchImme ...

  8. 学习响应式编程 Reactor (4) - reactor 转换类操作符(1)

    Reactor 操作符 数据在响应式流中的处理,就像流过一条装配流水线.Reactor 既是传送带,又是一个个的装配工或机器人.原材料从源头(最初的 Publisher )流出,经过一个个的装配线中装 ...

  9. Python使用websocket调用语音识别,语音转文字

    @ 目录 0. 太长不看系列,直接使用 1. Python调用标贝科技语音识别websocket接口,实现语音转文字 1.1 环境准备: 1.2 获取权限 1.2.1 登录 1.2.2 创建新应用 1 ...

  10. WPF Frame 的 DataContext 不能被 Page 继承

    转载至https://blog.csdn.net/sinat_31608641/article/details/88914517 已测试解决方案可行,因为WPF相关资料稀少,防止日后404,特搬运到自 ...