递归获取异步数据 - 拼接成树形结构

开发中通常会遇到要获取类似文件目录结构偶的数据
而接口返回的数据往往只有单层目录的数据
如果需要将这些数据一次性输出出来,则需要通过层层遍历找到最底层数据(如空文件夹)

获取异步数据,递归遍历拼接子节点

export default {
  data() {
  	moveFileData: []
  },
  methods: {
  	// 获得初始的树形数据
    moveFilePromise() {
      const _ = this;
      new Promise(resolve => {
        resolve(_.getMoveFileData());
      }).then(res => {
        _.moveFileData = res;
      });
    },
    // 获得初始的树形数据
    async getMoveFileData() {
      const _ = this;
      let currMoveFile = [{ id: 0,fileName: "根目录",children: [] }];
      let params = { ParentId: item.id };
      await _.$api.files_api.getFilelist(params).then(async res => {
        if (res.code==0) {
        	currMoveFile[0]['children'] = await _.axiosFileData(res.data.list);
        }
      }).catch(() => { });
      return currMoveFile;
    },
    // 递归遍历-拼接子节点
    async axiosFileData(reslist) {
      const _ = this;
      if (reslist == null) return null;
      let listFileData = reslist;
      const promises = reslist.map((item, index) => {
        let params = { ParentId: item.id };
        return _.$api.files_api.getFilelist(params).then(async res => {
          if (res.code == 0) {
            listFileData[index]['children'] = await _.axiosFileData(res.data.list);
          }
        }).catch(() => { });
      });
      await Promise.all(promises);
      return listFileData;
    },
  }
}

上述递归获取异步数据,拼接子节点方案,并不适合处理层级海量的数据结构,上述方案更重要的是实现递归获取异步数据拼接成子节点,并同步输出最终结果的思路


使用 el-tree 动态更新子节点
<el-tree
  :data="moveFileData"
  :props="moveFileProps"
  :load="loadNodeTree"
  lazy>
</el-tree>
  
export default {
  data() {
  	moveFileData: [{ id: 0,fileName: "根目录",children: [] }]
  },
  methods: {
  	loadNodeTree (node, resolve) {
      const _ = this;
      if(node.data.length>0 && !node.data.id) {
      	return resolve([{ id: 0,fileName: "根目录",children: [] }])
      }
      setTimeout(() => {
        let params = { ParentId: node.data.id };
        _.$api.files_api.getFilelist(params).then(async res => {
          if (res.code==0 && res.data.list) {
            resolve(res.data.list)
          } else resolve([])
        }).catch(() => { });
      }, 300);
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值