【发布时间】:2021-01-24 20:04:48
【问题描述】:
我正在使用 DotNet 5rc1 和 Blazor 进行一些测试,并注意到一些让我觉得我做的不对的事情。
我有一个演示页面(下面的代码),它为用户提供了一组按钮,他们可以单击一个按钮来进行掷骰。然后,在客户端 C# 中,我滚动骰子并将滚动字符串添加到列表中。在模板中,然后我执行一次 foreach 并呈现用户过去的滚动。
问题是我一直在关注 Websocket 消息,每次添加新元素时,传递的消息都会变得越来越大。这是因为每次点击都会重新呈现整个列表。
有没有更好的方法来做到这一点,以便 Blazor 只在 DOM 中插入新项目并发送一条微不足道的消息,而不是重新呈现页面的整个部分?对于这个例子,这无关紧要,但如果我正在构建一个包含大量交互的更大应用程序,我可能会发现这会成为一个瓶颈。
这是我的页面的代码 - 这只是全新 Blazor 项目中的一个新页面。 (我的代码不止一个 1d20 按钮,但为了简洁起见,我从这里删除了它。)
@page "/dieroller"
<h1>Die Roller Utility</h1>
...
<button class="btn btn-primary" @onclick="@(e => RollDie(20))">
<i class="fas fa-dice-d20"></i>
</button>
<h2 class='mt-5'>Your Roll History</h2>
@foreach (string roll in rolls) {
<p>@roll</p>
}
@code {
@using System.Threading;
private List<string> rolls = new List<string>();
private void RollDie(int upper)
{
Random rand = new Random();
rolls.Insert(0, string.Format("1d{0} = {1}", upper, rand.Next(1, upper)));
}
}
【问题讨论】:
-
这是服务器端的 blazor 吗?
-
你可以试试
元素上的@key,但我认为它需要一个引用而不是一个字符串。
-
旁注:您的骰子将产生 1-19 范围内的结果,而不是 1-20 。
-
@HenkHolterman 是的,我注意到了。 :)。在我下面的答案中修复。
-
@BrianParker - 现场。我不知道 Key 存在,不,你不能在字符串上正确地做到这一点。我正在根据密钥添加解决方案的答案。