渲染树形菜单,有很多的后台数据,怎么筛选

如何对树形图进行遍历,在vue页面显示


首先根据element-ui中的典型树形菜单结构图
在这里插入图片描述

<el-tree
  :data="data"
  show-checkbox
  node-key="id"
  :default-expanded-keys="[2, 3]"
  :default-checked-keys="[5]">
</el-tree>

<script>
  export default {
    data() {
      return {
        data: [{
          id: 1,
          label: '一级 2',
          children: [{
            id: 3,
            label: '二级 2-1',
            children: [{
              id: 4,
              label: '三级 3-1-1'
            }]
          }, ],
        defaultProps: {
          children: 'children',
          label: 'label'
        }
      };
    }
  };
</script>

我们请求后端数据后得到的打印结果为:
在这里插入图片描述
怎么只保留date中的[{id,label,children}]
递归加循环实现:

getId(treeData) { // treeData是后台获取的对象
      let arr=[] // 用来对数据遍历 返回满足要求的树形菜单数据
      treeData.forEach(ele => {
        // 判断有子元素,并且子元素的长度大于0就再次调用自身
        if (ele.children && ele.children.length > 0) {
        // 依次把符合的push进数组
          arr.push({
            id:ele.id,
            label:ele.name,
            children:this.getId(ele.children)
          })
        }else{
          arr.push({
            id:ele.id,
            label:ele.name
          })
        }  
      })
      console.log(arr)
      return arr
    }

然后 this.data=我们return的arr即可实现
结果页面:
在这里插入图片描述

第二种类型

后台数据是以下情况,子父节点的连接靠的是parentId,怎么变成chrildren这种类型的数据结构

在这里插入图片描述

SetFunctionPermissions(row){
      this.SettingPermission = true;
      this.SettingPermissionId = row.id;
      this.FirstcheckkeysId = this.checkkeysId.filter(item=>item)
      // 获取所有权限
      this.get(
         '/api/system/permission/all',{},
         (res) => {
           if (res.success === 'true') {
             this.permissionDataone = res.data
             console.log('this.permissionDataone',this.permissionDataone)
             this.permissionDataone =  this.permissionDataone.map(item=>{
               if(item.parentId==0){ // 找到第一级
                 return this.DgPermission(item)//递归遍历每一级中的children
               }
             })
           } else {
             this.$message.error(res.msg);
           }
         }
       );
      }
DgPermission(obj){ // 递归筛选数据
      this.permissionDataone.forEach(item=>{
        if(item.parentId == obj.id){
          obj.children =obj.children ? obj.children: [] // children缓存
          obj.children.push(this.DgPermission(item))
        }
      })
      let arr =this.permissionDataone.filter((item)=>{
        item.parentId == obj.id
      })
      if(arr.length==0){
        return obj
      }
    },

方法升级

	
	/**
	 * 构造树型结构数据
	 * @param {*} data 数据源
	 * @param {*} id id字段 默认 'id'
	 * @param {*} parentId 父节点字段 默认 'parentId'
	 * @param {*} children 孩子节点字段 默认 'children'
	 * @param {*} rootId 根Id 默认 0
	 */
	export function handleTree(data, id, parentId, children, rootId) {
		id = id || 'id'
		parentId = parentId || 'parentId'
		children = children || 'children'
		rootId = rootId || Math.min.apply(Math, data.map(item => { return item[parentId] })) || 0
		//对源数据深度克隆
		const cloneData = JSON.parse(JSON.stringify(data))
		//循环所有项
		const treeData = cloneData.filter(father => {
			let branchArr = cloneData.filter(child => {
				//返回每一项的子级数组
				return father[id] === child[parentId]
			});
			branchArr.length > 0 ? father.children = branchArr : '';
			//返回第一层
			return father[parentId] === rootId;
		});
		return treeData != '' ? treeData : data;
	}

使用: this.deptList = this.handleTree(response.data, "parentId");
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值