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

news/2025/1/17 17:52:40/文章来源:https://www.cnblogs.com/densen2014/p/18677406

接上篇文章 Blazor 通过组件虚拟化提高性能

问题

我想使用虚拟化来呈现项目。我使用的是弹性布局,flex-wrap: wrap当宽度完全用完时,我会将这些项目包裹起来( )。第一个项目将按预期呈现(只要您没有触摸滚动条)。开始滚动时,所有项目都会闪烁,并且控件不再可用。

<PageTitle>Virtualized Orders</PageTitle><h1>Virtualized Orders</h1><div style="height: 600px; overflow-y: scroll; display: flex; width: 600px; flex-direction: row; flex-wrap: wrap; "><Virtualize Items="Orders" Context="order" OverscanCount="15"><div style="width: 100px;height:100px; background-color:cadetblue;padding:10px;    margin: 10px;"><div>$ @order.Value</div></div></Virtualize>
</div>@code {public record Order(Guid Id, int Value);public IList<Order> Orders { get; set; } = new List<Order>();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)));}}
}

原因是这种方案不受支持。要了解支持哪些内容,您可以阅读 Blazor 虚拟化文档。

Virtualize组件是根据容器的高度和渲染项目的大小计算要渲染的项目数量。当用户滚动时重新计算并重新呈现项目。 所以当元素布局乱了,他就不能好好计算高度.

Virtualize在下列条件下工作:

  • 所有呈现的内容项(包括占位符内容)的高度都相同。这样就可以计算出哪些内容对应于给定的滚动位置,而无需先获取每个数据项并将数据呈现到 DOM 元素中。

  • 间隔行和内容行均呈现在单个垂直堆栈中,每个项目都填充整个水平宽度。在典型用例中,Virtualize与元素配合使用div。如果您使用 CSS 创建更高级的布局,请记住以下要求:

    • 滚动容器样式需要display具有以下任意值:
      • block( a 的默认值div)。
      • table-row-group( a 的默认值tbody)。
      • flexflex-direction设置为。column确保Virtualize组件的直接子组件不会在 flex 规则下收缩。例如,添加.mycontainer > div { flex-shrink: 0 }。
    • 内容行样式需要display具有以下任一值:
      • block( a 的默认值div)。
      • table-row( a 的默认值tr)。
    • 不要使用 CSS 来干扰间隔元素的布局。间隔元素display的值为block,除非父元素是表格行组,在这种情况下它们的默认值为table-row。不要试图影响间隔元素的宽度或高度,包括让它们具有边框或content伪元素。

任何阻止间隔物和内容元素呈现为单个垂直堆栈的方法,或导致内容项高度变化的方法,都会阻止Virtualize组件正常运行。

深入

既然已经了解原理,那我们可不可以转换一下思路, 把元素分组渲染,每行渲染一批,这样高度不就是固定了吗?

分组代码

<PageTitle>Virtualized Orders</PageTitle><h1>Virtualized Orders</h1><div style="height: 370px; overflow-y: scroll;  width: 380px; "><Virtualize Items="GroupedOrders" Context="orderGroup" ItemSize="16.667f"><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>@code {int itemsPerRow = 3;public record Order(Guid Id, int Value);public IList<Order> Orders { get; set; } = new List<Order>();public IList<IEnumerable<Order>>? GroupedOrders { get; set; }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)));}GroupedOrders = Orders.Select((order, index) => new { order, index }).GroupBy(x => x.index / itemsPerRow).Select(g => g.Select(x => x.order)).ToList();}
}

后续

可以试封装成组件, 公开 itemsPerRow 和 itemsHeight 等参数, 配合查询父元素/屏幕宽度,就能自适应调节了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870883.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vulnhub-Tr0ll靶机笔记

Tr0ll靶机笔记 概述 靶机地址:https://www.vulnhub.com/entry/tr0ll-1,100/ 这台靶机比较简单,让我们开始 Hack it! 一、nmap扫描 1、端口扫描 sudo nmap -sT --min-rate 10000 -p- 192.168.52.6 -o ports Nmap scan report for 192.168.52.6 Host is up (0.0026s latency).…

1.17 刷题

1 思路 P1331 海战 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)本题难点主要是如何分辨哪些穿是相撞而产生无效,哪些是有效 很容易想到的是,不论是bfs还是dfs都可以轻松全部搜掉,只需要简单的遍历所有点,然后套板子即可 但是这是无法排除无效情况的,也就是相撞的情况 推…

阿里云 Serverless 助力盟主直播:高并发下的稳定性和成本优化

在直播场景中,阿里云 Serverless 应用引擎 SAE 提供的无缝弹性伸缩与极速部署能力,确保直播间高并发时的流畅体验,降低了我们的运营成本,简化了运维流程。结合阿里云云原生数据库 PolarDB 的 Serverless 能力,实现了数据库资源按需自动扩展,在优化成本的同时极大增强了业…

轻松在线将您的照片转化为波普艺术(Pop Art),感受色彩与创意

如果你曾想过将你的照片变成一幅充满活力的波普艺术作品,那么 img4you 提供的这一在线工具,正是帮助你实现创意梦想的最佳选择。波普艺术以其大胆的色彩、夸张的视觉效果,赢得了艺术爱好者和创意工作者的喜爱。现在,你只需上传一张普通照片,选择自己钟爱的波普艺术风格,就…

Qwen2.5 的云端新体验,5 分钟完成极速部署

Qwen2.5 是通义千问团队开发的大规模语言和多模态系列模型,以其长文本处理能力、专业知识集成、大规模数据集预训练以及多语言处理等优势,为用户提供了快速、准确的响应,成为企业智能化转型的有效工具。Qwen2.5 是通义千问团队开发的大规模语言和多模态系列模型,以其长文本…

Chrome浏览器访问网址报错:Whitelabel Error Page!

谷歌浏览器访问网址时,报错: Whitelabel Error Page 原因分析:由于该网址暂时没有找到页面,导致指向错误。 本例说明:原网址对应解析的二级域名为 566.example.com,现在改为aibf.example.com;因为新该的二级域名,暂时解析未生效,导致报错。 处理方法:1.确认二级域名解…

java基础Day3 java语法

java语法 新建一个空项目,在项目中新建一个java模块 文件菜单中打开项目结构,SDK有报红,要手动选,语言级别也要和SDK对应注释 //单行注释/*多行 注释*//**文档注释* @Description HelloWorld* @Author tse121*/标识符 关键字Demo01所有的标识符都应该以大小写字母、美元符$…

LossVal:一种集成于损失函数的高效数据价值评估方法

在机器学习领域,训练数据的价值并非均等:部分训练数据点对模型训练的影响显著高于其他数据点。评估单个数据点的影响程度通常需要反复重训练模型,计算效率低下。LossVal提出了一种创新方法,通过将数据价值评估过程直接集成到神经网络的损失函数中,实现了高效的数据价值评估…

企业项目管理工具选择:多维度评估,精准决策

企业在选择项目管理工具时,应综合考虑需求、服务商与产品、试用体验、培训与实施以及市场推荐与排行榜等多个因素。通过全面评估这些因素,企业可以选择出最适合自己的项目管理工具,从而提升项目管理效率和团队协作能力。企业在选择适合自己的项目管理工具时,需要考虑多个因…

工作也有利息

一、工作也有利息 银行存款有利息,存得越久,利息越多。 工作也是一样,也有利息。如果今年的工作可以节省明年或未来的工作时间,就是一份有利息的工作。工作有利息,意味着你未来的工作时间会变少,多出来的时间,就可以去做别的事情,创造更多的价值。 这提示我们: (1)不…

docker swarm ingress网络

DOCKER INGRESS 介绍 # docker ingress官网介绍:https://docs.docker.com/engine/swarm/ingress/如docker官网所述,swarm 模式下使用ingress routing mesh 路由,可以实现服务在一个节点发布后,访问swarm任意节点地址都可以访问到该服务,即使该node节点没有该服务副本在运行…

windows11 远程桌面 自动断开连接原因

前短时间始终找不到远程桌面断开连接的原因就,今天终于找到原因了原因是前段时间自己更改端口得时候,只修改了一个,导致部分数据会报错。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp和HKEY_LOCAL_MACHINE\SYSTEM\CurrentContr…