Blazor如何实现组件嵌套传递值
更新时间:2023-10-02介绍
Blazor 是一个使用 C# 编写 Web 应用程序的开放源代码框架。它允许开发人员使用 C# 编写代码,而无需使用 JavaScript。Blazor 应用程序是在 WebAssembly 中运行的,这使得应用程序运行速度更快,同时还可以使用 C# 的所有功能。组件是 Blazor 应用程序的核心组成部分,它们是一个可重用的代码块,可以以自包含的方式使用。组件可以包含多个其他组件,父组件可以将数据转发给子组件,以实现组件间的通信与共享数据
单向数据传递
在 Blazor 应用程序中,父组件可以使用属性将数据传递给子组件
//Parent.razor//ChildComponent.razor @typeparam Name Hello @Name
@code { [Parameter] public string Name {get;set;} }
在上面的代码中,我们向 ChildComponent 组件传递了一个 Name 属性。ChildComponent 将使用这个属性创建一个 p 标记并将其输出到页面上。在这种方式下,Name 属性是只读的,创建它的父组件为它提供了初始值
双向绑定数据传递
有时候,父子组件可能需要进行双向数据绑定,我们可以使用两种方法实现。首先是使用 EventCallback 实现
//ParentComponent.razor@code { private string myName = "John"; } //ChildComponent.razor @typeparam Name @code { [Parameter] public string Name {get;set;} [Parameter] public EventCallback NameChanged {get;set;} private async Task OnNameChanged(){ await NameChanged.InvokeAsync(Name); } }
在上面的代码中,我们创建了一个双向绑定的 Name 属性,使用了 ChildComponent 组件的 oninput 事件。在子组件中,我们使用了一个 EventCallback 委托来传递相应更新。在内部,我们使用了 InvokeAsync 方法来触发 NameChanged 事件,这将导致父组件的属性更改。通过这种方式,我们实现了从父组件到子组件和从子组件到父组件的双向数据绑定。
第二种方法是使用 Reflection 进行数据传递,我们可以使用组件的 MethodInfo 和 PropertyInfo 类型来获取父组建中对应的属性,并通过 set 方法进行赋值
//ParentComponent.razor@code { private Model myModel = new Model() {Name = "John", Age = 20}; } //ChildComponent.razor @typeparam Model @code { [Parameter] public Model Model {get;set;} private Model localModel; private PropertyInfo propertyInfo; protected override void OnParametersSet(){ localModel = (Model)Activator.CreateInstance(typeof(Model)); var properties = typeof(Model).GetProperties().Where(p => p.CanWrite).ToList(); foreach(var property in properties){ property.SetValue(localModel, property.GetValue(Model)); } propertyInfo = properties.FirstOrDefault(p => p.Name == nameof(Model.Name)); } private async Task OnNameChanged(){ propertyInfo.SetValue(Model, localModel.Name); await Task.CompletedTask; } } public class Model{ public string Name {get;set;} public int Age {get;set;} }
在上面的代码中,我们为 ChildComponent 组件创建了一个 Model 属性,它是从父组件中传递的。在本地,我们创建了一个 LocalModel 实例,在 OnParametersSet() 方法中,使用 Activator.CreateInstance 和反射动态地为 LocalModel 的属性赋值。然后,我们获取了 PropertyInfo 实例,这样我们就可以在对应的 set 方法中赋值。在 OnNameChanged() 方法中,我们使用了 PropertyInfo.SetValue 方法更新属性值。这个方法可以更新父组件中对应的属性。通过这种方式,我们实现了对可以进行双向绑定的 Model 属性的实时更新。
总结
Blazor 框架为我们提供了多种方法来实现组件间的数据传递,包括单向绑定、双向绑定和组件间事件的传递。单向绑定使用属性进行数据传递,双向绑定使用 EventCallback 和 Reflection 进行数据传递。数据传递可以让我们的组件在相互配合时真正发挥其优势,实现我们想要的功能性。Blazor 的组件化思想让我们开发 Web 应用程序变得更加简单和有趣,同时赋予我们更多的选择。