首页 >后端开发 >C++ >如何在 Blazor 中调用 API 后从子组件刷新 Razor 主页面?

如何在 Blazor 中调用 API 后从子组件刷新 Razor 主页面?

DDD
DDD原创
2025-01-09 19:56:41920浏览

How to Refresh a Main Razor Page from Sub-Components After an API Call in Blazor?

在 API 调用后从 Blazor 中的子组件刷新 Razor 主页面需要状态管理方法。 Blazor 内置的更改检测机制不会自动更新父组件,除非其数据属性发生更改。 以下是如何使用状态/通知模式实现强大的解决方案:

为了实现这一目标,我们将使用一项服务来管理应用程序状态,将其注入到主页及其子组件中。 子组件在 API 调用后会触发该服务中的通知,提示 UI 更新。

1。创建状态管理服务:

该服务将保存数据和通知订阅者更改的机制。 为此,我们将使用 EventCallback

<code class="language-csharp">using Microsoft.AspNetCore.Components;

public class StateService
{
    public event Action StateChanged;

    // Your application state data
    public string DataFromAPI { get; set; } = "";

    public void NotifyStateChanged()
    {
        StateChanged?.Invoke();
    }
}</code>

2。将服务注入组件:

StateService 注入 Razor 主页面和进行 API 调用的子组件。

<code class="language-csharp">@inject StateService StateService // In both the main page and sub-components</code>

3。子组件中的 API 调用和状态更新:

在您的子组件中,成功调用 API 后,更新 StateService 的数据并通知更改。

<code class="language-csharp">@code {
    protected override async Task OnInitializedAsync()
    {
        string apiData = await FetchDataFromAPI(); // Your API call
        StateService.DataFromAPI = apiData;
        StateService.NotifyStateChanged();
    }

    // ... your API call method ...
    private async Task<string> FetchDataFromAPI()
    {
        // Your API call logic here
        return await Task.FromResult("Data from API");
    }
}</code>

4。更新剃刀主页:

在 Razor 主页面中,显示来自 StateService 的数据。 当 StateService.DataFromAPI 更改时,Blazor 将自动重新渲染此部分,因为它是组件的属性。

<code class="language-csharp">@page "/"
@inject StateService StateService

<h1>Main Page</h1>
<p>@StateService.DataFromAPI</p>

<MySubComponent /></code>

重要注意事项:

  • 错误处理:在子组件内的 API 调用中包含正确的错误处理。
  • 复杂状态:对于更复杂的应用程序,请考虑使用更复杂的状态管理库,例如 Fluxor 或 Redux。
  • 异步操作:确保使用 asyncawait 异步处理 API 调用,以防止阻塞 UI 线程。

此模式确保任何子组件中的更改都会通过更新共享状态并通知系统更改来触发主页中的更新。 主页会自动重新呈现,因为它绑定到服务的数据。 这可以避免在父组件中手动调用 StateHasChanged,这种类型的更新通常不鼓励这样做。

以上是如何在 Blazor 中调用 API 后从子组件刷新 Razor 主页面?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn