c# - 在 Blazor 中的两个子组件之间共享数据的最佳方式
问题描述
我有这个代码。
<ParentComponent>
<ChildComponet>
@renderFragment
</ChildComponent>
<ChildComponetn>
<GridComponent Data="@dataList"/>
</ChildComponent>
</ParentComponent>
其中@renderFragment 是动态渲染组件,而网格组件是一些数据的列表,其中包含“添加新”、“编辑记录”、“删除”等操作。
如果我们点击“添加新”,添加新记录的表单会在@renderFragment 中动态打开,我们想在提交表单后刷新网格数据,但我们不知道如何在两个子组件之间共享一些数据。编辑表单也是如此,当编辑某些记录时,我们需要刷新网格组件以显示编辑的数据。如果需要更多关于它的代码和数据,请发表评论。
解决方案
您可以定义一个实现状态模式和通知器模式的类服务来处理对象的状态,将状态传递给对象,并通知订阅者对象的更改。
这是此类服务的简化示例,它使父组件能够与其子组件进行通信。
通知服务.cs
public class NotifierService
{
private readonly List<string> values = new List<string>();
public IReadOnlyList<string> ValuesList => values;
public NotifierService()
{
}
public async Task AddTolist(string value)
{
values.Add(value);
await Notify?.Invoke();
}
public event Func<Task> Notify;
}
Child1.razor
@inject NotifierService Notifier
@implements IDisposable
<div>User puts in something</div>
<input type="text" @bind="@value" />
<button @onclick="@AddValue">Add value</button>
@foreach (var value in Notifier.ValuesList)
{
<p>@value</p>
}
@code {
private string value { get; set; }
public async Task AddValue()
{
await Notifier.AddTolist(value);
}
public async Task OnNotify()
{
await InvokeAsync(() =>
{
StateHasChanged();
});
}
protected override void OnInitialized()
{
Notifier.Notify += OnNotify;
}
public void Dispose()
{
Notifier.Notify -= OnNotify;
}
}
Child2.razor
@inject NotifierService Notifier
<div>Displays Value from service and lets user put in new value</div>
<input type="text" @bind="@value" />
<button @onclick="@AddValue">Set Value</button>
@code {
private string value { get; set; }
public async Task AddValue()
{
await Notifier.AddTolist(value);
}
}
用法
@page "/"
<p>
<Child1></Child1>
</p>
<p></p>
<p>
<Child2></Child2>
</p>
启动.ConfigureServices
services.AddScoped<NotifierService>();
希望这可以帮助...
推荐阅读
- smtp - Spf 记录防止“太多 MX 资源记录”和太多操作员/删除重复操作
- docker - 气流 kubernetesExecutor :创建后 Worker pod 终止
- asp.net-core - Xamarin:从 ASP.NET Core 后端加载图像会导致证书错误 - Android Amulator
- c++ - 如何从字符串中提取标记?
- java - 将 xml 文件发送到 url 并获得响应
- asp.net-mvc - 级联下拉列表未显示在 ASP.Net MVC 的视图中
- php - Laravel 将自定义值从控制器传送到中间件
- javascript - 是否有正确的方法来使用 fetch 调用数据而不会中断
- python - 删除方法整个文件变得清晰后,无法删除 CSV 文件中的单行
- keras - 谁能帮我理解为什么我的 keras 到 pytorch 的转换不起作用?