如何在 Blazor Web Assembly 中在任何组件初始化之前加载数据

huangapple go评论47阅读模式
英文:

How load data before any component initialized in Blazor Web Assembly

问题

我需要在任何组件初始化之前从 API 中加载一些数据。我尝试在 MainLayoutOnInitializedAsync() 方法中加载它们,但不幸的是,在加载这些数据之前,组件已经被初始化了。

英文:

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){ } 包裹你的与数据相关的组件/信息。这样,直到 dataLoadedtrue,什么都不会被渲染。

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&lt;MyService&gt;();

var app = builder.Build();

// Get the service instance
var myService = app.Services.GetService&lt;MyService&gt;();

// 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 &quot;/&quot;
@inject MyService Service
&lt;PageTitle&gt;Index&lt;/PageTitle&gt;

&lt;h1&gt;Hello, world!&lt;/h1&gt;

Welcome to your new app.

&lt;SurveyPrompt Title=&quot;How is Blazor working for you?&quot; /&gt;

@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&#39;ve already set them
        await base.SetParametersAsync(ParameterView.Empty);
    }
}

huangapple
  • 本文由 发表于 2023年2月14日 00:40:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/75438777.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定