[Blazor] .NET 7 Blazor 组件通信(参数、事件回调和状态/服务)练习
在 Blazor 中,可以使用三种方法在组件之间共享数据:
CascadingParameter
.Parameter
.传输服务是在 Blazor 中的组件之间共享数据的有用方法,尤其是当所有组件都需要使用相同的数据(也称为“单一事实来源”)时。此方法允许您集中数据管理并保持组件状态一致,从而使应用程序更易于维护且更易于测试。
Transfer 服务充当模型,包含每个属性的属性和事件。
要创建Transfer 服务:
public class ExampleTransferService
{
private string _data = "科控物联";
public string Data
{
get => _data;
set
{
_data = value;
DataChanged?.Invoke(this, value);
}
}
public event EventHandler<string> DataChanged = (sender, value) => { };
}
在代码示例中,我们有 和 作为属性和集合的示例。对于集合,您可以使用或创建自己的类:DataExampleInstancesObservableCollection<T> Collection<T>
public class ExampleTransferService
{
public ObservableCollection<ExampleClass> ExampleInstances { get; set; } = new();
}
请务必注意,List<T>不支持hooking 事件。
builder.Services.AddScoped<ExampleTransferService>();
通过在Program.cs中注册传输服务类,可以将其注入到任何需要它的组件中。这允许组件共享相同的数据并与应用程序的状态保持同步。
传输服务可以在组件或类中使用。若要在类中使用传输服务,需要将服务注入到类的构造函数中,并以与传输服务类相同的方式注册它。在本教程中,我们将重点介绍如何在组件中使用传输服务。
下面介绍如何在组件中使用传输服务:
IDisposable
@inject ExampleTransferService ExampleTransferService
@implements IDisposable
DataChangedEventHandler<string>void MyMethod(object? sender, string value)
或者使用集合更改:
ExampleTransferService.ExampleInstances.CollectionChanged += OnCollectionChanged;
ExampleTransferService.DataChanged += OnDataClassChanged;
@code {
protected override void OnInitialized()
{
ExampleTransferService.ExampleInstances.CollectionChanged += OnCollectionChanged;
ExampleTransferService.DataChanged += OnDataClassChanged;
}
public void AddInstance()
{
ExampleTransferService.ExampleInstances.Add(new()
{
Data = "需要数据采集,随时联系我!"
});
}
public void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs args)
{
InvokeAsync(StateHasChanged);
}
public void OnDataClassChanged(object? sender, string value)
{
InvokeAsync(StateHasChanged);
}
public void Dispose()
{
ExampleTransferService.ExampleInstances.CollectionChanged -= OnCollectionChanged;
ExampleTransferService.DataChanged -= OnDataClassChanged;
}
}
源代码地址
https://github.com/jingshui127/BlazorStudy
P.S.
builder.Services.AddSingleton<ExampleTransferService>();//注册服务
如果注册服务时,选择AddScoped
其实就是生命周期的问题。