英文:
How load data before any component initialized in Blazor Web Assembly
问题
我需要在任何组件初始化之前从 API 中加载一些数据。我尝试在 MainLayout
的 OnInitializedAsync()
方法中加载它们,但不幸的是,在加载这些数据之前,组件已经被初始化了。
英文:
I need to load some data from api before any component is initialized. I tried to load them in OnInitializedAsync() method in MainLayout unfortunaly before they load components are already initialized without those data.
答案1
得分: 1
用 @if(dataLoaded){ }
包裹你的与数据相关的组件/信息。这样,直到 dataLoaded
为 true
,什么都不会被渲染。
dataLoaded
显然可以被替换为,例如,检查一个值是否为 null
或列表是否为空。
英文:
Wrap your components/information related to your data with @if(dataLoaded){ }
. This way nothing will be rendered until dataLoaded
is at true
.
dataLoaded
can obviously be replaced by, for example, checking if a value is null
or a list is empty.
答案2
得分: 1
两个进一步的选项,确保数据在任何渲染事件发生之前已加载。
## 在启动时加载数据
WASM项目的`Program`:
```csharp
builder.Services.AddSingleton<MyService>();
var app = builder.Build();
// 获取服务实例
var myService = app.Services.GetService<MyService>();
// 确保在加载应用程序的其余部分之前获取数据
if (myService is not null)
await myService.GetData();
/....
我使用这种方法将测试数据加载到内存数据库中。
覆盖SetParametersAsync
按照内联注释明确执行。
@page "/"
@inject MyService Service
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
欢迎使用你的新应用程序。
<SurveyPrompt Title="Blazor对你来说如何工作?" />
@code {
public override async Task SetParametersAsync(ParameterView parameters)
{
// 设置组件参数
// 绝对必须首先执行
parameters.SetParameterProperties(this);
// 等待数据加载
await Service.GetData();
// 现在执行正常的生命周期组件工作
// 传递一个空的ParameterView,因为我们已经设置了它们
await base.SetParametersAsync(ParameterView.Empty);
}
}
英文:
Two further options that ensure the data is loaded before any rendering event occurs.
Load the data at Startup
Program
for the WASM project:
builder.Services.AddSingleton<MyService>();
var app = builder.Build();
// Get the service instance
var myService = app.Services.GetService<MyService>();
// make sure we get the data before loading the rest of the app
if (myService is not null)
await myService.GetData();
/....
I use this approach to load test data into an InMemory database.
Override SetParametersAsync
Follow the inline comments explicitly.
@page "/"
@inject MyService Service
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" />
@code {
public override async Task SetParametersAsync(ParameterView parameters)
{
// Set the component parameters
// Absolute must to do first
parameters.SetParameterProperties(this);
// Await on the data load
await Service.GetData();
// Now do the normal Lifecycle componenty stuff
// Pass an empty ParameterView as we've already set them
await base.SetParametersAsync(ParameterView.Empty);
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论