Blazor(服务器端)在同级组件之间进行通信

Posted

技术标签:

【中文标题】Blazor(服务器端)在同级组件之间进行通信【英文标题】:Blazor (Server-side) communicate between sibling components 【发布时间】:2020-01-18 11:44:12 【问题描述】:

我有三个组件。 组件一包含组件二和三。 组件二是一个列表。 组件三用于向数据库添加项目。

当我将一个项目保存到数据库时,我想更新组件二中的列表。 我该怎么做?

【问题讨论】:

【参考方案1】:

场景

假设:

<CRUD>
    <GRID/>
    <FORM/>
</CRUD>

选项 1:委托

使用委托,您可以捕获GRID 组件的引用,并通过委托从FORM 调用GRID 方法。试试delegate sample at blazorfiddle。

简化:

开启CRUD:

<GRID @ref="mygrid" />
<FORM mydelegate="@( (s) => mygrid.setData(s) )" />

@code

    protected GRID mygrid;

GRID:

<h1>@data</h1>

@code

    string data;

    public void setData(string value)
    
        data = value;
        StateHasChanged();
    

开启FORM

<input @bind-value=@somedata />
<button @onclick="@( () => mydelegate(somedata ?? "hi") )">press</button>

@code

    [Parameter] public Action<string> mydelegate set; get;
    string somedata;

选项 2:分享列表

只需在组件之间共享您的列表。您还可以订阅GRIDadd 事件列表。更多信息How to handle add to list event?。当然,您也可以使用ObservableCollection。也许您可以避免事件,只需添加到列表并致电StateHasChanged 就足够了。

请记住,您可以通过参数或cascade parameter 共享列表。

<CRUD>
    <GRID data=@mylist />
    <FORM data=@mylist />
</CRUD>

其他选项。

您是否还有更多选择,例如通过依赖注入、事件回调等使用单例。我建议你通过@Chris Sainty阅读3 Ways to Communicate Between Components in Blazor

【讨论】:

我最终使用了最适合我的应用程序的委托选项。 @fred,很高兴听到。【参考方案2】:

您应该针对您的问题发布一个最小的 repo,以便我们可以清楚地看到您面临的问题。

但是,一般来说,有几种方法可以做到这一点。在我在 Blazor 部分的答案之一中,我描述了如何启用这种场景的三种方法。

在这个答案中,我建议您使用 App State Pattern,您可以从中管理组件的状态、执行与组件中的数据相关的 CRUD 操作、刷新组件等。

史蒂夫·安德森(Steve Anderson)创建的一个使用应用状态模式的优秀示例是FlightFinder。此示例(客户端项目)定义了一个名为 AppState 的服务,该服务被注入到许多组件中,并为它们提供各种功能。请检查这个类和所涉及的组件,以及它们如何相互通信,并应用你将在你的应用程序中学到的东西。不要犹豫,问任何问题。

注意:如果您不熟悉此示例,请彻底了解它,因为这是学习 Blazor 的绝佳方式。

查看我的回答 here 和 here。

希望对你有帮助……

【讨论】:

谢谢。这可能也值得设置为正确答案,但我最终使用了 Dani Herrera 建议的委托方法。我实际上已经找到了 FlightFinder。可能来自您的 *** 帖子。我想我当时强调要经历并理解它,但我现在肯定会这样做。 @Fred,阅读 cmets tothis question,它阐明了使用委托(例如 EventCallback)和 App State 模式之间的区别:***.com/questions/58024328/…

以上是关于Blazor(服务器端)在同级组件之间进行通信的主要内容,如果未能解决你的问题,请参考以下文章

.NET 8新预览版本使用 Blazor 组件进行服务器端呈现

客户端 Blazor 代码能否“听到”服务器端引发的事件?

如何在使用消息传递(例如 RabbitMQ)与使用 Web 服务进行后端组件交互/通信之间做出决定?

Blazor 服务器端 SPA:重新加载组件后的组件状态

如何在服务器端 Blazor 组件中访问实体框架 DbContext 实体

如何从 Blazor 服务器端应用程序中的 Razor 页面导航到 Blazor 组件?