我正在尝试弄清楚 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 后,当程序现在指向该组件时,是否应该重新运行?
是否调用
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
在您的代码中,您可以编写简单的检查来查看组件参数的实际值是否发生变化,并且仅在检测到变化的情况下调用您的处理。
我发现我可以使用 ShouldRender() 生命周期来限制它重新运行。
protected override bool ShouldRender()
{
return false;
}
OnParametersSetAsync()
再次重新运行两次,因为它调用了 OnSaveClicked()
。
我通过首先在
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
}
}