首页 > 其他分享 >对于 Blazor 组件虚拟化支持flex-wrap: wrap与网格布局的研究 [三]

对于 Blazor 组件虚拟化支持flex-wrap: wrap与网格布局的研究 [三]

时间:2025-01-17 19:01:20浏览次数:1  
标签:elementWidth flex int itemsPerRow wrap new Blazor order

接上篇文章 对于 Blazor 组件虚拟化支持flex-wrap: wrap与网格布局的研究 [二]

监控元素的宽度变化动态计算

为了监控 id="div-test" 元素的宽度变化,你可以使用 ResizeObserver API。以下是如何实现的步骤:

  1. 在 App.razor 或 _Host.cshtml 或 wwwroot/index.html 文件中添加一个 JavaScript 函数来监控元素的宽度变化:
<script>
    window.observeElementWidth = (elementId, dotNetHelper) => {
        const element = document.getElementById(elementId);
        if (element) {
            const resizeObserver = new ResizeObserver(entries => {
                for (let entry of entries) {
                    dotNetHelper.invokeMethodAsync('OnElementWidthChanged', entry.contentRect.width);
                }
            });
            resizeObserver.observe(element);
        }
    };
</script>
  1. 在 Virtualized.razor 文件中,使用 JSRuntime 调用这个 JavaScript 函数,并在 OnElementWidthChanged 方法中处理宽度变化事件。
  2. 在 OnElementWidthChanged 方法中,更新 itemsPerRow 并重新分组订单,渲染页面

完整代码如下

<div id="div-test" style="height: 370px; overflow-y: scroll;  width: 70vw; ">
    @if (GroupedOrders != null)
    {
        <Virtualize Items="GroupedOrders" Context="orderGroup">
            <div style="display: flex; flex-direction: row; flex-wrap: wrap; ">
                @foreach (var order in orderGroup)
                {
                    <div style="width: 100px; height: 100px; background-color: cadetblue; padding: 10px; margin: 10px;">
                        <div>$ @order.Value</div>
                    </div>
                }
            </div>
        </Virtualize>
    }
</div>

<p>元素宽度: @elementWidth px 每行分配 @itemsPerRow 个元素</p>

@code {
    private int elementWidth;

    int itemsPerRow = 3;
    int itemsHeight = 100;

    public record Order(Guid Id, int Value);

    public IList<Order> Orders { get; set; } = new List<Order>();
    public IList<IEnumerable<Order>>? GroupedOrders { get; set; }

    [Inject]
    [System.Diagnostics.CodeAnalysis.NotNull]
    private IJSRuntime? JSRuntime { get; set; }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        if (firstRender)
        {
            await JSRuntime.InvokeVoidAsync("observeElementWidth", "div-test", DotNetObjectReference.Create(this));

            //elementWidth = await JSRuntime.InvokeAsync<int>("getElementWidth", "div-test");
            //itemsPerRow = elementWidth / (itemsHeight+20);
            //GroupOrders();
            //StateHasChanged();
        }
    }

    protected override void OnInitialized()
    {
        var random = new Random();
        for (int i = 0; i < 100; i++)
        {
            Orders.Add(new Order(Guid.NewGuid(), random.Next(20, 9999)));
        }

    }
    private void GroupOrders()
    {
        GroupedOrders = Orders
            .Select((order, index) => new { order, index })
            .GroupBy(x => x.index / itemsPerRow)
            .Select(g => g.Select(x => x.order))
            .ToList();

    }

    [JSInvokable]
    public void OnElementWidthChanged(int newWidth)
    {
        elementWidth = newWidth;
        itemsPerRow = elementWidth / (itemsHeight + 20);
        GroupOrders();
        StateHasChanged();
    }
}

标签:elementWidth,flex,int,itemsPerRow,wrap,new,Blazor,order
From: https://www.cnblogs.com/densen2014/p/18677530

相关文章

  • 对于 Blazor 组件虚拟化支持flex-wrap: wrap与网格布局的研究 [二]
    接上篇文章对于Blazor组件虚拟化支持flex-wrap:wrap与网格布局的研究[一]自适应可以试封装成组件,公开itemsPerRow和itemsHeight等参数,配合查询父元素/屏幕宽度,就能自适应调节了.在Blazor组件中使用JavaScript互操作来查询id="div-test"元素的渲染宽度。以......
  • 对于 Blazor 组件虚拟化支持flex-wrap: wrap与网格布局的研究
    接上篇文章Blazor通过组件虚拟化提高性能问题我想使用虚拟化来呈现项目。我使用的是弹性布局,flex-wrap:wrap当宽度完全用完时,我会将这些项目包裹起来()。第一个项目将按预期呈现(只要您没有触摸滚动条)。开始滚动时,所有项目都会闪烁,并且控件不再可用。<PageTitle>Virtualized......
  • Blazor 通过组件虚拟化提高性能
    了解组件虚拟化如何优化Blazor应用程序的渲染性能.介绍在使用数据驱动的应用程序时,我们迟早要在列表中呈现数量多得令人难以忍受的项目。作为开发人员,我们总是希望用户界面尽可能清晰,并且只包含执行特定操作所需的数据。但是,如果产品所有者要求呈现10000或100000个项目怎......
  • 为你的Blazor程序加入本地化多语言功能
    本地化本地化是为给定语言和地区定制应用程序的过程.BootstrapBlazor组件允许您将其UI元素转换为所需的语言。这包括按钮、过滤器操作符属性等文本。组件内部默认使用当前请求UI文化语言,本文将向您展示如何在应用程序中使用此功能:BootstrapBlazor组件库简介BootstrapBl......
  • css 布局及动画应用(flex+transform+transition+animation)
    文章目录css布局及动画应用animationtransform,transition,animation综合应用实例代码实例解释css布局及动画应用Display用法作用:用于控制元素的显示类型,如块级元素、内联元素、无显示等。常见属性值及示例:block:使元素显示为块级元素,会独占一行,并且可以设......
  • Blazor用户身份验证状态详解
        在Blazor应用程序中,AuthenticationState是一个核心概念,用于表示用户的身份验证状态。它提供有关当前用户的信息,例如是否已登录、用户的身份信息(如用户名、角色等)。AuthenticationState通常由AuthenticationStateProvider提供,Blazor使用它来管理和传播用户......
  • tcp_wrappers模块实现服务访问控制
    介绍:1、对有状态连接的特定服务进行安全检测并实现访问控制,所以只能用于tcp服务2、判断进程是否接收tcp_wrappers的控制,取决于程序在编译时是否添加了libwrap库3、类似防火墙的功能,但需要程序支持;对于一些访问控制可简单配置即可实现 查询程序是否tcpwrap模块存放位置:/lib......
  • ABP Blazor 的 Bundling 和 Minification
    Bundling(打包)指将多个JavaScript文件、CSS文件合并成一个或几个文件的过程。Bundling的主要目的:减少HTTP请求:通过合并文件,可以减少浏览器需要发起的HTTP请求数量,从而加快首页加载速度。依赖管理:自动处理模块之间的依赖关系,确保代码正确执行。代码分割:支持将代码分割成多个块(c......
  • 一篇文章讲清楚flex布局!
    ‌Flex布局(FlexibleBoxLayout),简称“弹性布局”,是一种灵活且强大的CSS布局方式,旨在提供一种更有效的方式来对一个容器中的子元素进行排列、对齐和分配空白空间‌。‌Flex布局的基本概念Flex布局由Flex容器(flexcontainer)和Flex项目(flexitem)组成。采用Flex布局的元素称为Fle......
  • CSS伸缩盒模型Flex
    <style>.outer{width:1000px;height:600px;background-color:#888;display:flex;//outer为伸缩容器。}.inner{width:200px;height:200px;background-color:skyblue;border:1pxsolidblack;box-sizin......