欢迎光临散文网 会员登陆 & 注册

TDesign TreeSelect一次性加载所有数据并展开所有节点

2023-03-18 19:48 作者:飞天蜗牛狼  | 我要投稿

后台(ASP.NET Core,目标框架.net 7,除FreeSql外,用到包WinReal.Base)

前端(TDesign Starter 0.7.2 + vue 3.2.45)

控件(TDesign TreeSelect控件)


对应数据结构

public class Dept

{

    [Column(IsIdentity = true, IsPrimary = true)]

    public int DeptId { get; set; }


    public string DeptName { get; set; } = "";


    public int ParentId { get; set; } //父级DeptId


    public int OrderId { get; set; } //当前节点完整子树起始,本身节点次序值


    public int MaxOrderId { get; set; } //当前节点完整子树最后一个节点的次序值


    public int Depth { get; set; } //当前节点所在深度,TDesign中用不到

}


1.后端传递数据的模型

public class TreeNode

    {

        public string Value { get; set; } = "";

        public string Label { get; set; } = "";

        public List<TreeNode>? Children { get; set; }

    }

2.后端递归取整表数据

public Result<List<TreeNode>> GetDeptTreeNodes()

        {

            Result<List<TreeNode>> result = new();

            List<TreeNode>? kids = DeptGetKids(0);

            if (kids == null)

            {

                result.Err("没有部门数据");

            }

            else

            {

                result.Data = kids;

            }

            return result;

        }

        private List<TreeNode>? DeptGetKids(int parentId)

        {

            TestLog("parentId = " + parentId.ToString());

            List<TreeNode> nodes = new List<TreeNode>();

            var depts = _fsql.Select<Dept>().Where(a => a.ParentId == parentId).OrderBy(a => a.OrderId).ToList();

            TestLog(JsonSerializer.Serialize(depts));

            foreach (Dept dept in depts)

            {

                TestLog(dept.DeptName);

                if (dept.OrderId == dept.MaxOrderId)

                {

                    nodes.Add(new TreeNode { Value = dept.DeptId.ToString(), Label = dept.DeptName });

                }

                else

                {

                    nodes.Add(new TreeNode { Value = dept.DeptId.ToString(), Label = dept.DeptName, Children = DeptGetKids(dept.DeptId) });

                }

            }

            return nodes;

        }



3.前端一次性加载所有数据

①api接口:src\api\model\basicinfoModel.ts

export interface TreeNodeModel {

  value: string;

  label: string;

  children?: Array<TreeNodeModel>;

}


②api接口:src\api\basicinfo.ts

const Api = {

  DeptTreeNodes: '/BasicInfo/GetDeptTreeNodes',

};

export function getDeptTreeNodes() {

  return request.get({

    url: Api.DeptTreeNodes,

  });

}


③vue文件template

<t-tree ref="tree" :data="items" checkable hover expand-all :lazy="false" />


④vue文件setup script

import { onMounted, ref } from 'vue';

import { MessagePlugin } from 'tdesign-vue-next';

import { getDeptTreeNodes } from '@/api/basicinfo';

import { TreeNodeModel } from '@/api/model/basicinfoModel';


const depts = ref<Array<TreeNodeModel>>([]);

onMounted(async () => {

  depts.value = await getDept();

});

// 从api取所有部门的数据

const getDept = async () => {

  try {

    const result = await getDeptTreeNodes();

    return result;

  } catch (error) {

    MessagePlugin.error(error.message || '获取部门数据失败,请稍后再试');

    return [];

  }

};


TDesign TreeSelect一次性加载所有数据并展开所有节点的评论 (共 条)

分享到微博请遵守国家法律