vue获取到树形结构后递归遍历数据,生成树形结构数据,无限级

1.需求

做的是个三级联动的数据
在这里插入图片描述

options: [{
	  value: 1,
	  label: '东南',
	  children: [{
	      value: 2,
	      label: '上海',
	      children: [
	      { value: 3, label: '普陀' },
	      { value: 4, label: '黄埔' },
	      { value: 5, label: '徐汇' }
	      ]
	  }, {
	      value: 7,
	      label: '江苏',
	      children: [
	      { value: 8, label: '南京' },
	      { value: 9, label: '苏州' },
	      { value: 10, label: '无锡' }
	      ]
	  }, {
	      value: 12,
	      label: '浙江',
	      children: [
	      { value: 13, label: '杭州' },
	      { value: 14, label: '宁波' },
	      { value: 15, label: '嘉兴' }
	      ]
	  }]
	  }, {
	  value: 17,
	  label: '西北',
	  children: [{
	      value: 18,
	      label: '陕西',
	      children: [
	          { value: 19, label: '西安', 
	              children: [{
	                  value: 19,
	                  label: '陕西',
	                  children: [
	                  { value: 30, label: '西安' },
	                  { value: 40, label: '延安' }
	                  ]
	              }, {
	                  value: 41,
	                  label: '新疆维吾尔族自治区',
	                  children: [
	                  { value: 42, label: '乌鲁木齐' },
	                  { value: 43, label: '克拉玛依' }
	                  ]
	              }]
	          },
	          { value: 20, label: '延安' }
	      ]
	  }, {
	      value: 21,
	      label: '新疆维吾尔族自治区',
	      children: [
	          { value: 22, label: '乌鲁木齐' },
	          { value: 23, label: '克拉玛依' }
	      ]
	  }]
	}]

需要的是这种数据结构的,而且获取到的数据也是树形结构的,需要不停的往下循环,但是又不确定是几层,那么这样需要用到递归方法。

2.实现方法

三级联动,elementui官网中只能单选,多选是用不了的,所以只能用另一个插件来进行多选,先下载包

npm install ele-multi-cascader

在main.js中引入和使用

import elCascaderMulti from "el-cascader-multi";
Vue.use(elCascaderMulti);

需要页面template中代码

<el-collapse accordion>
   <el-collapse-item v-for="item in usersTree" :key="item.id">
     <template slot="title">
       标题啦<i class="header-icon el-icon-info"></i>
     </template>
     <el-cascader-multi v-model="checkList" :data="item.children" filterable> </el-cascader-multi>
   </el-collapse-item>
</el-collapse>

data中:

data () {
	return {
		usersTree: []
	}
}

methods中

methods {
	organizManage () {
      //  从后台获取树形机构数据
      this.axios.get('system/organizManage/tree').then(res => {
          if (res.code === '0') {
              this.usersTree = res.data
              this.usersTree.forEach(item => {
                  if (item.children.length > 0) {
                  	  // 即:this.digui(item);在这地方添加的
                      item.children.forEach(items => {
                          // 下面的就是执行递归的方法,因为我是从第二层才开始需要往下挖的,所以这里多了个forEach,如果从第一层起,从item就好了,即:this.digui(item);在上面添加
                          this.digui(items); // 这里是源头,把一个对象开始递归,开始循环
                          // 如果想看完整数据,那么是在这里打印数据哦
                          console.log(items, '看我查看完整的数据哦')
                          // 因为上一步递归时,就已经把循环children的动作做完了,这里是验收递归方法的地方。
                      })
                  } else {
                      // 如果第一层没有子项做的操作。。。。。
                  }
              })
          } else {
              this.$message.error(res.message);
          }
      });
  },
  digui (item) {
  	  // 一层一层往下面执行,循环,直到不满足情况的条件下,会自动跳出这个递归方法,然后又到上面方法的源头处,开始执行下一个对象。。。
      if (item.children.length > 0) {
          item.value = item.orgCode
          item.label = item.orgName
          // 因为三级联动的数据格式是value和label,所以需要自己手动添加,没有的忽略。
          item.children.forEach(ff => {
          	  // 这里就是判断他的children下面还有没有值,有的话我就要往下挖,就又开始自己调用自己了
              this.digui(ff)
          })
      }  else {
      	   // 这里就是判断,如果我这一层的children下面没有东西的时候该做什么操作 
          item.value = item.orgCode
          item.label = item.orgName // 要添加value和label,否则会看不到标签名字和值
          // --------------------------分割线---------------------------------
          // 下面部分是我的需求,如果他的chilren下面没有值,那么发送请求获取本层数据下有没有值,没有children就是空,有的话,就把值push进他的children。这里看自己需求
          let form = {
              orgCode: item.orgCode,
              orgName: item.orgName,
              pageNum: 1,
              pageSize: 100000,
              companyId: item.companyId
          }
          this.store.dispatch('system/usersManage/list', form).then(res => {
              if (res.code === '0') {
                  if (res.data.list.length > 0) {
                      for (var i = 0; i < res.data.list.length; i++) {
                          res.data.list[i].value = res.data.list[i].userId
                          res.data.list[i].label = res.data.list[i].userName
                          item.children.push(res.data.list[i])
                      }
                  }
              }
          });
      }
      // 到这里为止,不能在这里打印数据,不然数据就是个断层的,因为在这里打印的数据是当前循环的这一层的数据,如果想看完整数据效果,那么就需要在递归方法第一次调用的地方打印需要递归的值,即上一个方法中。
  },
}

这样子一个递归方法基本就完成了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值