在Blazor中构建文件夹树

目录

介绍

从后端开始

获取所有文件夹/组信息的递归方法

使用组件在前端工作

GroupTree 组件

GroupItem组件


介绍

由于Blazor是一项相对较新的技术,因此可能很难找到可以在其他框架中找到的新的通用功能。这就是递归文件夹树的情况,我只能在将我的包添加到您的项目解决方案中找到它。本文的想法是分享解决方案的前端和后端,以及构建文件夹树所需的全部代码。

从后端开始

首先,我使用了一个名为Group的类,它将是Folder(如果你愿意,你可以称它为Folder)。这是一个简单而常见的类。唯一明显的区别是它有一个ParentGroupId整数属性来引用自己(是的,组中的组!),这对于创建我们需要的文件夹中的文件夹效果很重要。

public class Group
{
    public string Name { get; set; }
    public string? Description { get; set; }
    public int? ParentGroupId { get; set; }

    public Group ParentGroup { get; set; }
    public virtual List<Group> SubGroups { get; set; }
}

您可以将其存储在SQL ServerMySQL等中。我不会介绍如何使用SQL Server或创建表。我假设您已经可以将该类保存在表中并检索信息。

获取所有文件夹/组信息的递归方法

在您的存储库/控制器/无论您使用什么,您都需要创建一个方法来递归地获取所有组/文件夹。就我而言,我使用了我公司的一个名为Sparc的框架,它可以实现所有这些功能。最后,我将发布一个链接,您可以在其中获取更多信息。这种方法可以让您在组内无限地拥有组(无论您有多少组)。您可以在下面找到代码。

public async Task<List<Group> GetGroups()
{
    // Get all groups from DB to save all the extra database calls
    var allGroups = await GroupRepository
        .Query
        .ToListAsync();

    // Start recursive function with the top of the tree
    LoadSubgroups(allGroups, null);

    allGroups = allGroups.Where(x => x.ParentGroupId == null).ToList();
    
    return allGroups;
}

private List<Group> LoadSubgroups(List<Group> allGroups, Group? parentGroup)
{
    var groups = allGroups.Where(x => x.ParentGroupId == parentGroup?.Id).ToList();

    foreach (var group in groups)
        group.SubGroups = LoadSubgroups(allGroups, group);

    return groups;
}

您会注意到GetGroups()方法调用LoadSubgroups()方法,并且LoadSubgroups()调用本身!这个想法是该LoadSubgroups()方法递归地调用自身,直到有要加载的组。

使用组件在前端工作

我们将面临与后端相同的挑战:递归!在这种情况下,我们需要使用Blazor组件来创建递归效果,以便为将要显示的每个新组/文件夹创建新的HTML元素。我假设您已经可以从API获取组/文件夹信息。

GroupTree 组件

首先要做的事情:我们需要创建GroupTree/FolderTree组件:

<div class="folder-tree-wrapper">
    <ul class="folder-tree">
        @foreach (var group in Groups)
        {
            <GroupItem Group="group" />
        }
    </ul>
</div>

@code {
    [Parameter] public List<GetGroupsResponse> Groups { get; set; }
}

您会注意到有一个未定义的HTML元素:<GroupItem />元素!这将是另一个实际拥有组的组件(子组件)。

GroupItem组件

<li>
    <div class="item-container">
        @if (Group.SubGroups.Any())
            {
                @if (Group.IsExpanded)
                {
                    <i class="material-icons expand-more" 
                     style="transform: rotate(180deg)" 
                     @onclick="ToggleGroup">expand_less</i>
                }
                else
                {
                    <i class="material-icons expand-more" 
                     style="transform: rotate(90deg)" 
                     @onclick="ToggleGroup">expand_less</i>
                }
            }
        <i class="material-icons" style="cursor: pointer; 
                 @(Group.SubGroups.Any() ? "" : "padding-left: 18px")">
                 @(allEntriesSelected ? "check_box" : "check_box_outline_blank")</i>
        <div style="display: inline-block" @onclick="ToggleGroup">
            <i class="material-icons">folder</i>
            <div style="display: inline-block">@Group.Name</div>
        </div>
    </div>

    @if (Group.SubGroups.Any() && Group.IsExpanded)
    {
        <ul>
        @foreach (var subGroup in Group.SubGroups)
        {
            <GroupItem Group="subGroup"/>
        }
        </ul>
    }
</li>

@code {
    [Parameter] public GetGroupsResponse Group { get; set; }
    public bool allEntriesSelected { get; set; }

    async Task ToggleGroup()
    {
        Group.IsExpanded = !Group.IsExpanded;
    }
}

就是这样!这就是使用Blazor创建文件夹/树解决方案所需的全部内容。你现在唯一需要做的就是在页面上调用你想要使用的GroupTree组件,像这样:

<GroupTree Groups="groups" />

https://www.codeproject.com/Tips/5324755/Building-a-Folder-Tree-in-Blazor

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值