【发布时间】:2022-01-24 15:24:47
【问题描述】:
我有一个名为 NavBar.razor 的 Blazor 组件,它显示带有标签列表的 Radzen 导航菜单。当用户单击标签 (RadzenPanelMenuItem) 时,组件 OrderBrowser.razor 会加载到菜单旁边的页面中。查询字符串让 OrderBrowser.razor 知道选择了哪个标签。 (请参阅下面的 OnInitializedAsync 方法。)该组件将关联的订单加载到网格中。
这在用户第一次单击标签时工作正常,但是当他们单击不同的标签时,即使 uri 发生更改,OnInitializedAsync 方法也不会执行。所以我添加了一个事件处理程序来在 uri 更改时强制重新加载。这可行,但由于某种原因,它似乎重新加载了两次,导致第二次重新加载时出现不希望的闪烁。
有人知道更好的方法吗?谢谢。
来自 NavBar.razor 的代码:
@foreach (var item in TagsAndCounts)
{
<Radzen.Blazor.RadzenPanelMenuItem
Text="@(item.Tag + " (" + item.Count + ")")"
Path="@("orders/browse?tag=" + item.Tag)" />
}
来自 OrderBrowser.razor 的订单网格:
<OrderGrid Data="@orders" AllowPaging="false" />
来自 OrderBrowser.razor 的代码:
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
NavManager.LocationChanged += NavManager_LocationChanged;
var uri = NavManager.ToAbsoluteUri(NavManager.Uri);
if (QueryHelpers.ParseQuery(uri.Query).TryGetValue("tag", out var tag))
{
orders = await orderService.GetOrdersForTagAsync(tag);
}
}
private void NavManager_LocationChanged(object sender, LocationChangedEventArgs e)
{
NavManager.NavigateTo(NavManager.Uri, forceLoad: true);
}
【问题讨论】:
-
您是否需要对“标签”使用查询字符串?如果没有,那么您可以使用
orders/browse/{tag}的 URL 路径,然后将调用 OnInitializeAsync()。 -
起初我以为这会起作用,但看起来只有在 URL 的订单/浏览部分发生更改时才会调用 OnInitializeAsync()。它忽略对 {tag} 的更改,就像忽略对查询字符串的更改一样。
-
您是否正确创建了 Route 参数?这是一个资源:docs.microsoft.com/en-us/aspnet/core/blazor/fundamentals/…
-
我相信是的。这是我的路线:@page "/orders/browse/{tag}"
-
酷。你在
OrderBrowser.razor的顶部有那个@page,这很好。您是否定义了tagC# 属性来接受标记值?如果是,那么您还需要更改您从 NavBar.razor 组件指向的 URLPath = "@("orders/browse/{item.Tag}"。