Blazor 应用基于组件,组件可以复用和嵌套。本文内容如下:

  • 组件类
  • 组件嵌套
  • 组件参数
  • 组件对象

1. 组件类

所有组件都是继承 ComponentBase 组件基类,razor 文件默认继承 ComponentBase 类。 ComponentBase 实现组件的最低抽象,IComponent 接口。 ComponentBase 定义基本功能的组件属性和方法,例如,处理一组内置组件生命周期事件。

//HTML 写法
MyComponent.razor <div>Hello Known!</div>
//C# 写法
class MyComponent : ComponentBase
{
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
builder.Div("Hello Known!");
}
}

2. 组件嵌套

组件可以包含其他组件。用 HTML 语法,组件的标记类似于 HTML 标记,其中标记的名称是组件类型。

//HTML 写法
MyApp.razor <MyComponent />

C# 高级写法是通过扩展方法来实现的。

//C# 写法
class MyApp : ComponentBase
{
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
builder.Component<MyComponent>().Build();
}
}

3. 组件参数

Blazor 应用是由若干组件拼搭而成,有些组件结构相同,数据不同,这样的组件就需要添加组件参数属性将数据传递给组件。组件参数需满足如下条件:

  • 需要包含 [Parameter] 特性
  • 必须是 public 的属性
class MyComponent : ComponentBase
{
[Parameter] public string? Title { get; set; }
//子内容呈现片段
[Parameter] public RenderFragment? ChildContent { get; set; } protected override void BuildRenderTree(RenderTreeBuilder builder) { ... }
}

下面是组件参数的使用示例

//HTML 写法
MyApp.razor <div>
<MyComponent Title="组件1" />
<MyComponent Title="组件2">
子内容呈现
</MyComponent>
</div>
//C# 写法
class MyApp : ComponentBase
{
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
builder.Div(attr =>
{
builder.Component<MyComponent>().Set(c => c.Title, "组件1").Build();
builder.Component<MyComponent>()
.Set(c => c.Title, "组件2")
.Set(c => c.ChildContent, b => b.Text("子内容呈现"))
.Build();
});
}
}

4. 组件对象

组件是继承 ComponentBase 的一个类,如果要访问组件的方法,必须获取组件的对象实例。若要捕获组件对象实例,请执行以下操作:

  • 向子组件添加 @ref 特性
  • 定义与子组件类型相同的字段
//HTML 写法
MyApp.razor <div>
<MyComponent @ref="component" Title="组件1" />
</div> @code {
private MyComponent? component;
}

C# 高级写法是在组件建造者 ComponentBuilder 类的 Build 方法中通过 AddComponentReferenceCapture 方法来捕获组件对象实例,该类不是 Blazor 框架类,后续将介绍该类的具体实现。

//C# 写法
class MyApp : ComponentBase
{
private MyComponent? component; protected override void BuildRenderTree(RenderTreeBuilder builder)
{
builder.Div(attr =>
{
builder.Component<MyComponent>()
.Set(c => c.Title, "组件1")
.Build(value => component = value);
});
}
}

再学Blazor——组件的更多相关文章

  1. Blazor组件的new使用方式与动态弹窗

    1. 前言 在Blazor中的无状态组件文中,我提到了无状态组件中,有人提到这个没有diff,在渲染复杂model时,性能可能会更差.确实,这一点确实是会存在的.以上文的方式来实现无状态组件,确实只要 ...

  2. 再聊 Blazor,它是否值得你花时间学习

    之前写了一篇文章<快速了解 ASP.NET Core Blazor>,大家关心最多的问题是,我该不该花时间去学习 Blazor.今天聊聊这个话题,并表达一下我个人的看法. 在此之前,我还是 ...

  3. Ant Design Blazor 组件库的路由复用多标签页介绍

    最近,在 Ant Design Blazor 组件库中实现多标签页组件的呼声日益高涨.于是,我利用周末时间,结合 Blazor 内置路由组件实现了基于 Tabs 组件的 ReuseTabs 组件. 前 ...

  4. Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (3)

    接上篇 Blazor组件自做九: 用20行代码实现文件上传,浏览目录功能 (2) 7. 使用配置文件指定监听地址 打开 appsettings.json 文件,加入一行 "UseUrls&q ...

  5. Blazor组件自做一 : 使用JS隔离封装viewerjs库

    Viewer.js库是一个实用的js库,用于图片浏览,放大缩小翻转幻灯片播放等实用操作 本文相关参考链接 JavaScript 模块中的 JavaScript 隔离 Viewer.js工程 Blazo ...

  6. Blazor组件自做二 : 使用JS隔离制作手写签名组件

    Blazor组件自做二 : 使用JS隔离制作手写签名组件 本文相关参考链接 JavaScript 模块中的 JavaScript 隔离 Viewer.js工程 Blazor组件自做一 : 使用JS隔离 ...

  7. Blazor组件自做三 : 使用JS隔离封装ZXing扫码

    Blazor组件自做三 : 使用JS隔离封装ZXing扫码 本文基础步骤参考前两篇文章 Blazor组件自做一 : 使用JS隔离封装viewerjs库 Blazor组件自做二 : 使用JS隔离制作手写 ...

  8. 【C】 01 - 再学C语言

    “C语言还用再学吗?嵌入式工程师可是每天都在用它,大家早就烂熟于心,脱离语言这个层面了”.这样说不无道理,这门古老的语言以其简单的语法.自由的形式的而著称.使用C完成工作并不会造成太大困扰,所以很少有 ...

  9. [Python]再学 socket 之非阻塞 Server

    再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...

  10. 再学Java 之 interface的成员变量

    前言:最近在学多线程,写“哲学家就餐问题(Dining Philosophers)”的时候,需要定义一个全局的变量,即哲学家的人数.常用的做法是在其中一个类中定义一个static final的变量,然 ...

随机推荐

  1. 除了参数,ref关键字还可以用在什么地方?

    <老生常谈:值类型 V.S. 引用类型>中花了很大的篇幅介绍ref参数针对值类型和引用类型变量的传递.在C#中,除了方法的ref参数,我们还有很多使用ref关键字传递引用/地址的场景,本篇 ...

  2. 多光源渲染方案 - Light Culling

    目录 Tile-based Light Culling Culling 流程 Injection Pass Compact Pass 2.5D Culling Cluster-based Light ...

  3. Java生成图片(简版)

    1.图片模板示例 2.Java代码(简版) public static void main(String[] args) throws FileNotFoundException, IOExcepti ...

  4. windows CMD命令的一些使用方法及注意事项

    windows CMD命令的一些使用方法及注意事项 转载请著名出处:https://www.cnblogs.com/funnyzpc/p/17572397.html 一.执行路径或参数带中文.空格.特 ...

  5. fread()模板

    char buf[1<<20],*p1,*p2;#define GC (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin ...

  6. shell 代码风格

    以终为始 initramfs_cgz=/srv/initrd/osimage/$os/$os_arch/${os_version%-iso}/$(date +"%Y%m%d").0 ...

  7. 代码随想录算法训练营第四天| LeetCode 24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 142.环形链表II

    24. 两两交换链表中的节点         卡哥建议:用虚拟头结点,这样会方便很多. 本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点. 题目链接/ ...

  8. 可不要忽视了TypeScript中函数和类的重要性

    上一篇文章总结了 TypeScript的类型注解,这一篇来聊聊同样重要的函数和类 函数 以下声明了一个函数类型,通过type来定义类型别名,void 表示没有返回值 type fnType = () ...

  9. iptables基础

    简介 Linux防火墙主要工作在网络层,针对TCP/IP数据包实施过滤和限制.iptables是linux防火墙的管理程序,为包过滤机制的实现制定规则,并告诉内核空间的netfilter如何处理这些网 ...

  10. 论文解读(BSFDA)《Black-box Source-free Domain Adaptation via Two-stage Knowledge Distillation》

    Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:Black-box Source-free Domain Adaptation via Two-stage ...