即使参数尚未更改,C# Blazor onParametersSetAsync 也会被调用

问题描述 投票:0回答:3

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

<OneComponent @ref="_oneComponent" param1="@varParam1" param2="@varParam2"></OneComponent>
@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.
    }
  }
}

当我运行程序时,我注意到

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

blazor blazor-webassembly
3个回答
19
投票

是否调用

OnParametersSet()
OnParametersSetAsync()
取决于组件参数的类型。

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

OnParametersSet()
方法。

因此,如果您的参数是

bool
int
string
decimal
DateTime
类型,则检测开箱即用,并且不会调用
OnParametersSet()
,除非参数的值已经改变了。

对于

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

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

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


4
投票

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

protected override bool ShouldRender()
{
   return false;
}

OnParametersSetAsync()
再次重新运行两次,因为它调用了
OnSaveClicked()


3
投票

我通过首先在

OnInitializedAsync
中设置值,然后保留本地副本来跟踪参数值是否实际更改来修复它。我检查
OnParametersSetAsync
中的变化,如果值确实发生变化,则再次执行操作。

protected override async Task OnInitializedAsync()
{
    //initalize internal code and do stuff
    _internalCode = ParamCode;

    //do stuff
}

protected override async Task OnParametersSetAsync()
{
    //only do stuff again if the incoming parameter actually changed
    if (_internalCode != ParamCode)
    {
        _internalCode = ParamCode;

        //do stuff
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.