我浏览到abc.razor OnInitializedAsync((方法被调用。
现在在OnvalidSubmit方法中,我有以下代码
NavManager.NavigateTo("/abc?rid=1", false, true);
这意味着它应该再次导航到abc.razor页面。它确实导航,但不调用OnInitializedAsync((方法?
为什么会这样?
如果导航到self,即导航到同一页面,Router组件会将同一路由组件传递到App
中的RouteView
中。
渲染器看不到任何组件更改,因此将事件视为重新渲染。OnInitialized{Async}
未运行。
则运行OnParametersSet{Async}
,并且将更新Rid
参数。因此,使用OnParametersSet{Async}
作为逻辑。
这是我的演示页面:
@page "/Reload"
<h3>Reload</h3>
@inject NavigationManager NavManager
<div class="alert alert-info">
@this.Rid
</div>
<div class="alert alert-primary">
@this.value
</div>
<BasicComponent RID=@this.Rid />
<div class="m-2">
<button class="btn btn-primary" @onclick=this.ReloadComponent>Reload</button>
</div>
@code {
private string value = string.Empty;
[Parameter]
[SupplyParameterFromQuery]
public string? Rid { get; set; }
private void ReloadComponent()
{
NavManager.NavigateTo($"/Reload?Rid={DateTime.Now.ToLongTimeString()}");
}
protected override void OnParametersSet()
{
value = $"Reloaded at {DateTime.Now.ToLongTimeString()}";
}
}
和BasicComponent.razor:
<h3>BasicComponent</h3>
<div class="alert alert-dark">
@RID
</div>
<div class="alert alert-secondary">
@this.value
</div>
@code {
private string value = string.Empty;
[Parameter] public string RID { get; set; } = string.Empty;
protected override void OnParametersSet()
{
value = $"Reloaded at {DateTime.Now.ToLongTimeString()}";
}
}
供参考
ComponentBase
中的相关代码如下所示。_initialized
已经为真。
public virtual Task SetParametersAsync(ParameterView parameters)
{
parameters.SetParameterProperties(this);
if (!_initialized)
{
_initialized = true;
return RunInitAndSetParametersAsync();
}
else
{
return CallOnParametersSetAsync();
}
}