Vue ElementUI 树表格

树表格做懒加载-点击小箭头走接口

children为[]则使用hasChildren的true/false来判断是否有子节点,另,如果要做点击小箭头走接口必须加lazy及load
<el-table
      v-if="refreshTable"
      v-loading="loading"
      :data="deptList"
      lazy
      :load="load"
      row-key="deptId"
      :default-expand-all="isExpandAll"
      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
    >
load(tree, treeNode, resolve) {
      this.queryParams.deptId = tree.deptId;
      this.loading = true;
      // 假设你有一个 API 方法来获取子节点数据
      queryDeptByParentId(this.queryParams) // 这里的 deptId 是当前节点的标识符
        .then((response) => {
          resolve(response.data);
          this.loading = false;
        })
        .catch((error) => {
          console.error("加载子节点失败:", error);
          this.loading = false;
          resolve([]); // 如果加载失败,返回空数组
        });
    },
/** 查询部门列表 */
    getList() {
      this.loading = true;
      this.queryParams.deptId = null;
      this.deptList = null;
      listDept(this.queryParams).then((response) => {
        this.deptList = this.handleTree(response.data, "deptId");
        this.deptList.forEach((item) => {
          this.initializeChildren(item);
        });
        this.loading = false;
      });
    },
    // 递归函数,用来确保每个节点的 children 字段是一个数组
    initializeChildren(item) {
      // 如果有子节点但没有 children 字段,则初始化为一个空数组
      if (item.hasChildren && !Array.isArray(item.children)) {
        item.children = [];
      }
      // 如果当前节点有 children,并且 children 是数组,则递归处理每个子节点
      if (Array.isArray(item.children)) {
        item.children.forEach((child) => {
          this.initializeChildren(child); // 递归处理子节点
        });
      }
    },
	
	/**
 * 构造树型结构数据
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 */
export function handleTree(data, id, parentId, children) {
  let config = {
    id: id || 'id',
    parentId: parentId || 'parentId',
    childrenList: children || 'children'
  };

  var childrenListMap = {};
  var nodeIds = {};
  var tree = [];

  for (let d of data) {
    let parentId = d[config.parentId];
    if (childrenListMap[parentId] == null) {
      childrenListMap[parentId] = [];
    }
    nodeIds[d[config.id]] = d;
    childrenListMap[parentId].push(d);
  }

  for (let d of data) {
    let parentId = d[config.parentId];
    if (nodeIds[parentId] == null) {
      tree.push(d);
    }
  }

  for (let t of tree) {
    adaptToChildrenList(t);
  }

  function adaptToChildrenList(o) {
    if (childrenListMap[o[config.id]] !== null) {
      o[config.childrenList] = childrenListMap[o[config.id]];
    }
    if (o[config.childrenList]) {
      for (let c of o[config.childrenList]) {
        adaptToChildrenList(c);
      }
    }
  }
  return tree;
}

来源链接:https://www.cnblogs.com/hhs-5120/p/18657990

请登录后发表评论

    没有回复内容