【问题标题】:C# Blazor onParametersSetAsync is being called eventhough params has not been changedC# Blazor onParametersSetAsync 被调用,尽管 params 没有改变
【发布时间】:2021-01-06 08:14:02
【问题描述】:

我试图弄清楚 Blazor 的行为方式。我正在调试一些东西,但暂时删除注释掉其他代码以免被破坏并确保我观察到的内容。代码如下所示。

<OneComponent @ref="_oneComponent" param1="@varParam1" param2="@varParam2"></OneComponent>
@code {
  private OneComponent _oneComponent; 
  private _objectOne varParam1;   // There are values here.
  private _objectTwo varparams2;  // There are values here as well.

  private async Task SaveClicked()
  {
    if (_oneComponent.OnSaveClicked())
    {
      // nothing here.
    }
  }
}

当我运行程序时,我注意到&lt;OneComponent/&gt;OnParametersSetAsync() 正在重新运行。 我的问题是,为什么 OnParametersSetAsync() 会再次重新运行,即使我没有更改任何 varParam1、varParam2?就是这样吗?在_oneComponent 返回true 或false 后程序现在指向该组件时是否应该重新运行?

【问题讨论】:

    标签: blazor blazor-client-side


    【解决方案1】:

    是调用OnParametersSet()还是OnParametersSetAsync()取决于组件的参数类型。

    对于原始类型以及已知不可变的几个附加类型,Blazor 可以轻松检测参数值是否更改,并决定是否调用 OnParametersSet() 方法。

    因此,如果您的参数是 boolintstringdecimalDateTime 类型,则检测工作开箱即用,并且不会调用 OnParametersSet(),除非值为参数变了。

    对于enum参数或更复杂的参数,每次父组件(或页面)重新渲染时都会调用OnParametersSet()

    这也记录在官方 Blazor 文档中:https://docs.microsoft.com/en-us/aspnet/core/blazor/components/lifecycle?view=aspnetcore-3.1#after-parameters-are-set

    在您的代码中,您可以编写简单的检查来查看组件参数的实际值是否发生变化,并且仅在检测到变化的情况下调用您的处理。

    【讨论】:

    • 感谢您的精彩解释。
    【解决方案2】:

    我发现我可以使用 ShouldRender() 生命周期来限制它重新运行。

    protected override bool ShouldRender()
    {
       return false;
    }
    

    OnParametersSetAsync() 在调用OnSaveClicked() 时再次重新运行两次。

    【讨论】:

      猜你喜欢
      • 2013-11-26
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 2015-09-04
      相关资源
      最近更新 更多