我读到的所有内容都指向使用NavigationManager.LocationChanged事件,但它无法检测到仅查询字符串更改的情况。因此,没有任何事情触发。
我尝试了建议的here,但那不是我要找的。
每当当前路由中的查询参数更改时,我需要重新呈现我的组件。有人能做到这一点吗?
更新:
这是我的代码示例:
这里的问题是,当仅更改查询参数时,
基本上,我有一个页面来显示一系列帐户并查看单个帐户。当查看列表时,我希望路由为
我尝试了建议的here,但那不是我要找的。
每当当前路由中的查询参数更改时,我需要重新呈现我的组件。有人能做到这一点吗?
更新:
这是我的代码示例:
@page "/accounts"
@if (Accounts != null)
{
<table>
<tbody>
@foreach (var account in Accounts)
{
<tr>
<td>
<NavLink href="/accounts/?accountId={account.AccountId}">@Account.Name</NavLink>
</td>
</tr>
}
</tbody>
</table>
}
@if (Account != null)
{
<div>
<h2>@Account.Name</h2>
</div>
}
@implements IDisposable
@inject NavigationManger NavManager
@inject AccountService AccountService
@code {
protected Guid Id { get; set; } = Guid.NewGid();
protected Guid AccountId { get; set; } = Guid.Empty;
protected List<AccountModel> Accounts { get; set; }
protected AccountModel Account { get; set; }
protected override void OnInitialized()
{
NavManager.LocationChanged += LocationChanged;
}
protected async override Task OnParametersSetAsync()
{
if (AccountId != Guid.Empty)
{
Account = await AccountService.GetAsync(AccountId);
}
else
{
Accounts = await AccountService.GetAllAsync();
}
StateHasChanged();
}
void LocationChanged(object sender, LocationChangedEventArgs e)
{
Id = Guid.NewGuid();
StateHasChanged();
}
void IDisposable.Dispose()
{
NavManager.LocationChanged -= LocationChanged;
}
}
这里的问题是,当仅更改查询参数时,
LocationChanged(object,LocationChangedEventArgs)
不会触发。这很有道理,因为路由相同/accounts
。基本上,我有一个页面来显示一系列帐户并查看单个帐户。当查看列表时,我希望路由为
/accounts
,而查看一个帐户时,则应为“/ accounts?accountId = someAccountId”。使用标准的NavLink组件不会触发组件的重新渲染,LocationChanged事件也不会。即使设置了新的ID值也是如此。因为StateHasChanged
仅在值更改时才重新呈现组件。
[SupplyParameterFromQuery]
注释?这是必需的,才能使这些属性更新并调用你的OnParametersSet
方法(或其异步变体)。 - Kirk Woll