[英]I need to update a Blazor page to update whenever the query string changes
我有一个名为 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);
}
使用此事件
[Parameter]
[SupplyParameterFromQuery]
public string? Page { get; set; } = "0";
protected override void OnParametersSet()
{
//Fire your Code her
}
我找到了解决方案。 它仍然有点黑客,但它似乎工作。 如果有人有更好的解决方案,请告诉我。 我只是更改了事件处理程序以获取新的 URL 并更新页面,而不是强制重新加载。
private async void NavManager_LocationChanged(object sender, LocationChangedEventArgs e)
{
orders = await orderService.GetOrdersForTagAsync(tag);
var index = NavManager.Uri.LastIndexOf("/");
tag = NavManager.Uri.Substring(index + 1);
if (tag != "open_orders")
{
StateHasChanged();
}
}
当您 go 来自: yourUrl/tag/tagname1
并单击以链接yourUrl/tag/tagname2
时,它不会触发OnInitializedAsync
,因为未创建新页面。 这是有意的和正确的行为。 但有点混乱。
您可以利用 .net6 引入的SupplyFromQueryParameter
属性的新功能,该属性将根据查询字符串更改其值。
[Parameter, SupplyParameterFromQuery(Name = "tag")] public string Tag { get; set; } = "";
现在您可以在Tag
属性的 Seeter 中发挥作用。 或者,如果您需要在 setter 中调用异步方法(这不是一个好习惯),您可以使用OnParametersSet
方法。 它在参数更改后立即调用。 因此,您还需要一种机制来检查标记参数是否已更改(因为每次 *some* 参数已更改时都会调用它)
bool tagUpdated = true;
string _tag ="";
[Parameter,SupplyParameterFromQuery] public string Tag { get => _tag; set { if (value != _tag) { _tag = value; tagUpdated = true; } } }
protected override async Task OnParametersSetAsync()
{
if (tagUpdated)
{
tagUpdated = false;
await YourAsyncCallAndOtherMagic();
}
}
请注意, SupplyFromQueryParameter
仅适用于页面(带有@page
指令的.razor
组件)
(仍然不是我猜的最漂亮的解决方案。欢迎提出建议......)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.