我正试图弄清楚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.
}
}
}
当我运行程序时,我注意到<OneComponent/>
的OnParametersSetAsync()
正在重新运行。我的问题是,如果我没有更改varParam1和varParam2中的任何一个,为什么OnParametersSetAsync()
会再次重新运行?就是这样吗?当程序在_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#参数设置后
在您的代码中,您可以编写简单的检查来查看组件参数的实际值是否发生了更改,并且只在检测到更改的情况下调用您的处理。
我发现我可以使用ShouldRender((生命周期来限制它的重新运行。
protected override bool ShouldRender()
{
return false;
}
OnParametersSetAsync()
在调用OnSaveClicked()
时再次被重新运行两次。
我通过首先在OnInitializedAsync
中设置值,然后保留一个本地副本来跟踪Parameter值是否实际更改来修复它。我检查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
}
}