《进击吧!Blazor!》第一章 5.组件开发

《进击吧!Blazor!》是本人与张善友老师合作的Blazor零基础入门系列视频,此系列能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力。
视频地址:https://space.bilibili.com/483888821/channel/detail?cid=151273
本系列文章是基于《进击吧!Blazor!》直播内容编写,升级.Net5,改进问题,讲解更全面。因为篇幅有限,文章中省略了部分代码,完整示例代码:https://github.com/TimChen44/Blazor-ToDo

作者:陈超超
Ant Design Blazor 项目贡献者,拥有十多年从业经验,长期基于.Net技术栈进行架构与开发产品的工作,现就职于正泰集团。
邮箱:timchen@live.com
欢迎各位读者有任何问题联系我,我们共同进步。

这次分享我么要聊聊Blazor的精髓,也是我个人认为Blazor框架体系中最优秀的特性——组件。

组件

组件(Component)是对数据和方法的简单封装。几乎所有UI相关的框架都有组件(控件)的概念。

在这里插入图片描述


早期的Delphi组件叫做VCL(Visual Component Library),它采用自身嵌套的方式组合成所需的用户界面,并提供属性,方法,事件与组件外部进行交互,自身有着独立的生命周期,在必要的时候进行销毁。

之后.Net的WinForms和WPF组件相对于Delphi虽然设计实现上完全不同,但是对组件的定义和用途上几乎一致。

现在Web前端框架Angular中也采用了组件的概念,整体理念依旧相似。

有些框架根据是否可见将组件分为,组件(Component)不可见,控件(Control)可见,比如Delphi,WinForms

纵观这些框架的组件设计,可以提炼出组件包含以下特性。

在这里插入图片描述


Blazor应用也是使用组件构建的。组件是自包含的用户界面 (UI) 块,例如页、对话框或窗体。 组件包含插入数据或响应 UI 事件所需的 HTML 标记和处理逻辑。 组件非常灵活且轻量。 可在项目之间嵌套、重复使用和共享。

1.参数(属性)

提供组件外部向组件内部传递数据的方式。

在Blazor中我们称组件的属性(Property)叫参数(Parameter),参数本身就是一个属性,但是为了让Blazor框架能区分两者,所以我们在属性上增加 [Parameter]特性来声明属性为组件的参数。

[Parameter] public string Text { get; set; } 组件参数

组件参数可以接收来在razor页面中给与的值,支持简单类型,也可以支持复杂类型。

<!--组件代码--> <h1>Blazor is @Text!</h1> @code { [Parameter] public string Text { get; set; } } <!--组件使用--> <Component Title="Superior">

上例就是将Superior通过参数传入组件,组件中就会输出Blazor is Superior!

路由参数

组件可以接收来自 @page 指令所提供的路由模板的路由参数。 路由器使用路由参数来填充相应的组件参数。参数类型受限于路由规则,只支持几个基本类型。

<!--页面代码--> @page "/RouteParameter/{text}" <h1>Blazor is @Text!</h1> @code { [Parameter] public string Text { get; set; } }

当使用/RouteParameter/Superior地址进行路由时,跳转到上例中的页面,并且页面输出Blazor is Superior!

级联参数

在某些情况下,使用组件参数将数据从祖先组件流向子代组件不太方便,尤其是在有多个组件层时。 级联值和参数提供了一种方便的方法,使祖先组件为其所有子代组件提供值,从而解决了此问题。

祖先组件中使用CascadingValue设定需要向下传递的级联值,子代组件中使用 [CascadingParameter] 特性来声明级联参数用于接收级联值。

本文后续会有详细的Demo来讲解此特性,此处暂不展开了。

2.事件

事件是一种由组件内部发起,由组件外部处理的一种机制。

对于原始的Html元素与Razor组件在事件的使用上有一些细微差别,下面分开介绍。

Html 元素

对HTML 元素的事件采用@on{EVENT}格式(例如 @onclick)处理事件,Razor 组件将此属性的值视为事件处理程序。

<h1>Blazor is @Text!</h1> <button @onclick="OnClick">Button</button> @code { private string Text { get; set; } void OnClick(MouseEventArgs e) { Text = "Superior"; } }

点击Button按钮后就触发@onclick事件,然后设置Text的值,最后组件输出Blazor is Superior!
每一个事件都会返回一个参数,@onclick事件返回MouseEventArgs参数,更多详见

Razor 组件

跨组件公开事件,可以使用 EventCallback。父组件可向子组件的 EventCallback 分配回调方法,由子组件完成调用。

<!--子组件--> <button @onclick="OnBtnClick">Button</button> @code { [Parameter] public EventCallback<string> OnClick { get; set; } void OnBtnClick(MouseEventArgs e) { if (OnClick.HasDelegate) OnClick.InvokeAsync("Superior"); } } <!--父组件--> <h1>Blazor is @Text!</h1> <Component></Component> @code { private string Text { get; set; } void OnClick(string e) { Text = e; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpsgjf.html