【求助】antd tree组件数据回显

41 阅读2分钟

AreaModel.vue

当时组件由其他人封装,现在代码中的dataManIndex,dataMan等关键点不知其具体作用,各位大神帮忙分析分析,到底是个什么思路?

tree组件封装后如下,组件实现了数据异步加载、半选全选回显。

组件在回显半选时无法直接渲染传入的halfChecked,但是需要在未加载下层数据时展示半选状态。

Template

<template>
  <div>
    <a-spin :spinning="confirmLoading" class="spin-box">
      <!-- <tree-area
        ref="treeArea"
        :checked-keys="checkedKeys"
        :tree-data="areaList"
      /> -->
      <a-tree ref="treeRef" multiple checkable :checkedKeys="checkedKeys" treeNodeFilterProp="title"
        :dropdownStyle="{ maxHeight: '400px', overflow: 'auto' }" :treeData="areaList" placeholder="请选择一个区域"
        @check="onCheck" @expand="onExpand" :load-data="onLoadData" v-model="checkedKeys" :replaceFields="replaceFields">
      </a-tree>
    </a-spin>
    <div class="drawer-form-footer">
      <a-button type="primary" :loading="btnLoading" @click="save">保 存</a-button>
      <a-button type="default" @click="close">取 消</a-button>
    </div>
  </div>
</template>

<script>
import {
  getCheckedAreaIds,
  savaAll,
} from "@/api/basicYunService/tenant/tenantArea";
import {
  lazyArea,
  selectAllAreaList,
  selectAreaForTenent,
} from "@/api/sysManage/sysAreas";

import { saveBasisGrid } from "@/api/gridService/baseGridManage";

import { getArrayToTree } from "@/utils/util";

import TreeArea from "@/components/Tree/TreeArea";

export default {
  name: "AreaModel",
  components: {
    TreeArea,
  },
  props: {
    areaRecord: {
      type: Object,
      default: () => ({}),
    },
    refreshTable: {
      type: Function,
    },
  },
  data() {
    return {
      confirmLoading: true,
      autoExpandParent: true,
      areaList: [],
      checkedKeys: [],
      btnLoading: true,
      replaceFields: {
        value: "areaId",
        key: "areaId",
        title: "areaName",
        children: "children",
      },
      dataManIndex: 3,
      dataMan: [
        {
          areaCode: null,
          areaId: -1,
          areaLevel: "1",
          areaName: "黑龙江省"
        },
        {
          areaCode: null,
          areaId: -2,
          areaLevel: "1",
          areaName: "黑龙江省"
        },
      ]
      // areaNode:[]
    };
  },
  created() {
    this.loadTreeData();
  },
  methods: {
    loadTreeData() {
      Promise.all([
        selectAreaForTenent({
          tenantId: this.areaRecord.tenantId,
          parentAreaId: 0,
        }), // 获取全部节点数据
        getCheckedAreaIds({ tenantId: this.areaRecord.tenantId }), // 获取已选中
      ])
        .then(([resAreaList, resCheckedKeys]) => {
          let checkedBak = []
          this.checkedKeys = resCheckedKeys.data.result.map((item) => {
            //树回显需要number
            return parseInt(item);
          });
          if (resAreaList.data.result[0].checked) {
            resAreaList.data.result[0].children = JSON.parse(JSON.stringify(this.dataMan));
            checkedBak = [-1, -2]
          } else if (resAreaList.data.result[0].halfChecked) {
            resAreaList.data.result[0].children = JSON.parse(JSON.stringify(this.dataMan));;
            checkedBak = [-1]

          }

          this.areaList = getArrayToTree(resAreaList.data.result, {
            id: "areaId",
            pid: "parentAreaId",
          });

          this.checkedKeys = this.checkedKeys.concat(checkedBak)
        })
        .finally(() => {
          this.confirmLoading = false;
          this.btnLoading = false;
        });
    },
    save() {
      if (this.checkedKeys.length < 1) {
        this.$message.warn("请勾选区域后分配");
        return;
      }

      this.confirmLoading = true;
      this.btnLoading = true;
      let NewcheckedKeys = this.checkedKeys.map((item) => {
        // debugger
        return (item = String(item));
      });
      console.log("NewcheckedKeys", NewcheckedKeys);
      const saveForm = {
        areaRecord: JSON.stringify(this.areaRecord),
        checkedNodes: JSON.stringify(NewcheckedKeys),
      };
      console.log(saveForm);
      // return
      savaAll(saveForm)
        .then((res) => {
          if (res.data.head.status === "200") {
            this.$message.success("保存成功");
            this.refreshTable();
          } else {
            this.$message.warn("抱歉,发生错误...");
          }
        })
        .finally(() => {
          this.confirmLoading = false;
          this.btnLoading = false;
        });
    },
    close() {
      // this.refreshTable()
      this.$emit("close");
    },
    /**   listToTree (list, tree, parentId) {
      list.forEach((item) => {
        // 判断是否为父级菜单
        if (item.parentAreaId === parentId) {
          const child = {
            ...item,
            key: item.areaId,
            name: item.areaName,
            title: item.areaName,
            pid: item.parentAreaId,
            children: []
          }
          // 迭代 list, 找到当前菜单相符合的所有子菜单
          this.listToTree(list, child.children, item.areaId)
          // 删掉不存在 children 值的属性
          if (child.children.length <= 0) {
            delete child.children
          }
          // 加入到树中
          tree.push(child)
        }
      })
    },*/
    onExpand() {},
    
    onLoadData(treeNode) {
      // debugger
      this.confirmLoading = true;
      // console.log("treeNode.dataRef", treeNode.dataRef);
      return new Promise((resolve) => {
        Promise.all([
          selectAreaForTenent({
            tenantId: this.areaRecord.tenantId,
            parentAreaId: treeNode.dataRef.areaId,
          }),
          selectAllAreaList({ parentAreaId: treeNode.dataRef.areaId })]).then(
            ([res,hasChildRes]) => {
              const children = res.data.result.map((r) => {
                  //遍历获取hasChild并赋值给isLeaf
                  const hasChild = hasChildRes.data.result.find((h) => h.areaId === r.areaId);
                  const isLeaf = !hasChild.hasChild
                  return {
                    areaCode: r.areaCode,
                    areaId: r.areaId,
                    areaLevel: r.areaLevel,
                    areaName: r.areaName,
                    parentAreaId: r.parentAreaId,
                    seqNum: r.seqNum,
                    status: r.status,
                    virtualCode: r.virtualCode,
                    children: [],
                    isLeaf: isLeaf,
                    checked: r.checked,
                    halfChecked: r.halfChecked,
                  }
                }) || [];
              let checkedBak = []
              if (treeNode.halfChecked || treeNode.checked) {
                // debugger
                // if (this.checkedKeys.indexOf(treeNode.dataRef.areaId) > -1||treeNode.halfChecked == true){
                  children.forEach(element => {
                    let man = JSON.parse(JSON.stringify(this.dataMan));
                    this.dataManIndex = this.dataManIndex + 1
                    man[0].areaId = -this.dataManIndex
                    this.dataManIndex = this.dataManIndex + 1
                    man[1].areaId = -this.dataManIndex
                    if (element.checked) {
                      element.children = man
                      checkedBak = [man[0].areaId, man[1].areaId]
                    } else if (element.halfChecked) {
                    
                      element.children = man
                      checkedBak = [man[0].areaId]
                    }

                  });
                
              }

              treeNode.dataRef.children = children;
              this.checkedKeys = this.checkedKeys.concat(checkedBak)
              this.areaList = [...this.areaList];
              console.log('checkBak', checkedBak);
              console.log('this.checkedKeys', this.checkedKeys);
              resolve();
            }
          ).finally(() => {
            this.confirmLoading = false;
          })
      });
    },
    onCheck(checkedKeys, info) {
      console.log("checkedKeys", checkedKeys);
      console.log("info", info);
      // this.areaNode = info.checkedNodes.map(item=>({
      //   areaCode: item.data.props.dataRef.areaCode,
      //         areaId: item.data.props.dataRef.areaId,
      //         areaLevel: item.data.props.dataRef.areaLevel,
      //         areaName: item.data.props.dataRef.areaName,
      //         parentAreaId: item.data.props.dataRef.parentAreaId,
      //         seqNum: item.data.props.dataRef.seqNum,
      //         status: item.data.props.dataRef.status,
      //         virtualCode: item.data.props.dataRef.virtualCode,
      // }))
      // console.log(this.areaNode)
    },
  },
};
</script>
<style lang="less" scoped>
.spin-box {
  height: 100%;

  ::v-deep .ant-spin-container {
    height: 100%;
  }
}
</style>