即使 params 尚未更改,也会调用 C# Blazor onParametersSetAsync

use*_*437 13 blazor blazor-webassembly

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

<OneComponent @ref="_oneComponent" param1="@varParam1" param2="@varParam2"></OneComponent>
Run Code Online (Sandbox Code Playgroud)
@code {
  private OneComponent _oneComponent; 
  private _objectOne varParam1;   // There are values here.
  private _objectTwo varParam2;   // There are values here as well.

  private async Task SaveClicked()
  {
    if (_oneComponent.OnSaveClicked())
    {
      // nothing here.
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

rk7*_*k72 18

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

对于原始类型以及一些已知不可变的其他类型,Blazor 可以轻松检测参数值是否更改,并决定调用或不调用该OnParametersSet()方法。

因此,如果您的参数是boolintstring和类型,decimalDateTime检测开箱即用,并且OnParametersSet()不会被调用,除非参数的值已更改。

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

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

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


use*_*437 3

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

protected override bool ShouldRender()
{
   return false;
}
Run Code Online (Sandbox Code Playgroud)

当它OnParametersSetAsync()调用 时,将再次重新运行两次OnSaveClicked()