未调用 OnInitializedAsync 方法

Ven*_*kat 1 blazor

我浏览到 abc.razor OnInitializedAsync() 方法被调用。

现在在 OnvalidSubmit 方法中我有以下代码

  NavManager.NavigateTo("/abc?rid=1", false, true);
Run Code Online (Sandbox Code Playgroud)

这意味着它应该再次导航到 abc.razor 页面。它确实导航但不调用 OnInitializedAsync() 方法?

为什么这样?

MrC*_*tis 6

如果您导航到 self,即导航到同一页面,则 Router 组件会将相同的路由组件传递到RouteViewin中App

渲染器没有看到任何组件更改,因此将该事件视为重新渲染。 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()}";
    }
}
Run Code Online (Sandbox Code Playgroud)

和 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()}";
    }
}
Run Code Online (Sandbox Code Playgroud)

以供参考

中的相关代码ComponentBase如下所示。 _initialized已经是真的了。

    public virtual Task SetParametersAsync(ParameterView parameters)
    {
        parameters.SetParameterProperties(this);
        if (!_initialized)
        {
            _initialized = true;

            return RunInitAndSetParametersAsync();
        }
        else
        {
            return CallOnParametersSetAsync();
        }
    }
Run Code Online (Sandbox Code Playgroud)