在实现我的项目性能时, 大多都是左侧是树形构造, 选中的后果应用 表格或者列表的模式展现, 这两个实现起来比拟容易
明天给大家介绍下, 选中的内容, 即右侧也应用树形构造展现
场景: 左侧带过滤关键词&checkbox 多选框的树, 右侧是选中的后果数&反对删除
代码: 左侧树 和 右侧树都应用的是同一个数据源
// 左侧树<el-input :placeholder="请输出关键词过滤" v-model="filterText"></el-input><el-tree :data="mediaPosList" // 展现的数据 node-key="id" //每个节点的惟一标识 :props="defaultMediaProps" // 数据结构的配置项 show-checkbox // 显示勾选框 check-on-click-node //点节点名称时抉择勾选 :filter-node-method="filterNodePosLeftTree" //筛选过滤办法 返回true:显示 false:不显示 :default-checked-keys="selectedPositionIds" //默认勾选节点key 值列表 ref="mediaPosLeftTree"></el-tree>// 右侧树<el-tree :data="mediaPosList" node-key="id" :props="defaultMediaProps" :filter-node-method="filterNodePosRightTree" ref="mediaPosRightTree"> //自定义节点显示 <template slot-scope="{node, data}"> <span> <el-button v-if="!data.position" type="text" icon="el-icon-close" @click="removeOneMedia(data.id)" style="margin-right:10px;" ></el-button> <label>{{node.data.name}}</label> </span> </template></el-tree>
data(){ return { filterText: "", selectedPositionIds: [], defaultMediaProps:{ children: 'position', label: 'name' }, }}//给过滤的filterText 减少监听, 每次变更都会执行树的 filter-node-method 办法watch: { filterText(val) { this.$refs.mediaPosLeftTree.filter(val); }}method: { init(){ fetch.get('/media_pos').then(res => { this.mediaPosList = res.data }) this.$nextTick(() => { // 期待mediaPosList更新到tree dom data上之后,再执行过滤 this.$refs.mediaPosRightTree.filter(this.selectedPositionIds) }); }, //左侧树过滤办法 filterNodePosLeftTree(value, data) { //过滤的是filterText value 值, 即找节点name 蕴含value 的 if (!value) return true return data.name.indexOf(value) !== -1 }, //右侧树 过滤办法 filterNodePosRightTree(value, data) { if (!value) return true return value.includes(data.id) }, //当勾选完左侧树, 确认抉择时,增加按钮函数, 再次执行右侧树的filter 办法 addMedia(){ //getCheckedKeys 获取选中的节点key, true:只有叶子节点 ,默认false let checkedKeys = this.$refs.mediaPosLeftTree.getCheckedKeys(true) if(checkedKeys.length === 0){ this.$message.warning({message: "aaa"), showClose: true}) return } this.selectedPositionIds = checkedKeys //右侧树的filter, 传递的参数会传给filter-node-method, 作为第一个参数 this.$refs.mediaPosRightTree.filter(checkedKeys) },}
后果图: