注意:在这个问题中,我使用了一个特定的组件,但我想我的问题与我对blazor页面的一般方法有关,而不是与这个特定的组件有关
我有一个Blazor WebAssembly应用程序,页面如下:
第页。剃刀
@page "/mypage"
<h3>Title</h3>
<BlazorSlickCarousel @ref="carVp" Configurations="carVpConf">
<BlazorSlickCarouselContent>
</BlazorSlickCarouselContent>
<BlazorSlickCarouselLoading>
</BlazorSlickCarouselLoading>
</BlazorSlickCarousel>
page.rarzor.cs
using WMBlazorSlickCarousel.WMBSC;
private BlazorSlickCarousel carVp;
private WMBSCInitialSettings carVpConf;
private bool cond = true;
protected override void OnInitialized()
{
carVpConf = new WMBSCInitialSettings(){ /* some options */ };
}
protected override async Task OnParametersSetAsync()
{
if (cond)
{
/* do nothing */
}
else
{
/* await time consuming task */
}
await PopulateCarousel();
}
public async Task PopulateCarousel()
{
var div = $@"<div class='vs-container'>Some stuff</div>";
for(int i = 1; i <= 3; i++)
{
await carVp.Add(div);
}
}
如果cond == true
、PopulateCarousel()
的行为是不可预测的:有时会抛出ArgumentNullException,有时不会将所有div都添加到转盘中。
如果cond == false
,则一切正常。
我想当cond == true
时,carVp组件还没有(完全(创建/初始化。事实上,如果我给第一个If
分支添加一点延迟(使用await Task.Run(() => Task.Delay(1000));
,一切都很好
问题是:我应该把对PopulateCarousel()
的调用放在哪里,以确保组件已完全创建和初始化?是否有一种(通用(方法来检查组件状态?
我尝试了OnInitializedAsync
、OnAfterRenderAsync
和OnAfterRender
,但都不起作用。
谢谢!
组件生命周期事件按以下顺序触发
OnInitialized----->OnParametersSet----->OnAfterRender
正如你所说的";以确保组件已完全创建和初始化&";。当组件UI完全渲染并且可用于访问和更新时,将触发OnAfterRender事件。