我理解它们之间的区别。
当组件初始化时,OnInitializedSync会激发一次,其中每次设置/更改组件参数时,作为OnParametersSetAsync都会激发。
这是否意味着在.rarzor页面中,我们可以省略OnInitializedAsync函数,并在这个OnParametersSetAsync((函数中进行所有编码?
这是否意味着OnInitializedAsync((是多余的?
假设您有一个组件调用API来检索一些数据。它还接受一个名为SortDirection
的参数,并且您希望根据其值对数据进行升序或降序排序。API调用应该只发生一次,一旦内存中有了数据,就不需要再调用后端了。另一方面,假设用户有一个切换按钮,可以更改排序方向,因此SortDirection
参数可以在组件生命周期中多次更改。您希望检索OnInitializedAsync()
中的数据,但应该在OnParametersSetAsync()
中应用排序。示例:
@if (_sortedData != null)
{
foreach (var item in _sortedData)
{
<p>@item</p>
}
}
@code {
private List<string>? _data;
private List<string>? _sortedData;
private string? _sortDirection;
[Parameter]
public string? SortDirection { get; set; }
protected override async Task OnInitializedAsync()
{
_data = await MyService.LoadData();
}
protected override void OnParametersSet()
{
if (_sortDirection != SortDirection)
{
_sortDirection = SortDirection;
if (_sortDirection == "asc")
{
_sortedData = _data?.OrderBy(x => x).ToList();
}
else if (_sortDirection == "desc")
{
_sortedData = _data?.OrderByDescending(x => x).ToList();
}
else
{
_sortedData = _data;
}
}
}
}
ComponentBase
只是一个工具。它是IComponent
的一个实现。全世界99.9%的人都使用它,但它不是强制性的。
您正在使用一个一刀切的瑞士军刀组件实现来满足您的所有不同组件需求。会有冗余,通常会有很多!ComponentBase
是你的工具箱,而不是盒子里的工具。
对于许多实现来说,ONinitialized{Async}
/OnParametersSet{Async}
可能有点过头了,但ComponentBase
中的许多代码也是如此。
这段代码在每次渲染时都会运行,但99!
Task IHandleAfterRender.OnAfterRenderAsync()
{
var firstRender = !_hasCalledOnAfterRender;
_hasCalledOnAfterRender |= true;
OnAfterRender(firstRender);
return OnAfterRenderAsync(firstRender);
}
你可以在这里看到完整的实施-https://github.com/dotnet/aspnetcore/blob/main/src/Components/Components/src/ComponentBase.cs
另请参阅我对这个问题的一个答案,该答案演示了一个不同的、更简约的基本组件——在Blazor中,有没有任何方法可以在没有子组件的情况下获得任何组件的渲染时间?