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. TypeScript又出新关键字了?

    TypeScript 5.2将引入一个新的关键字:using.当它离开作用域时,你可以用Symbol.dispose函数来处置任何东西. { const getResource = () => ...

  2. WPF复习知识点记录

    WPF复习知识点记录 由于近几年主要在做Web项目,客户端的项目主要是以维护为主,感觉对于基础知识的掌握没有那么牢靠,趁着这个周末重新复习下WPF的相关知识. 文章内容主要来自大佬刘铁锰老师的经典著作 ...

  3. 聊一聊Java中的Steam流

    1 引言 在我们的日常编程任务中,对于集合的制造和处理是必不可少的.当我们需要对于集合进行分组或查找的操作时,需要用迭代器对于集合进行操作,而当我们需要处理的数据量很大的时候,为了提高性能,就需要使用 ...

  4. java根据配置文件读取值

    <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependency> ...

  5. Matlab2014a 找不到 vs2015编译器解决方法

    准备工作 前提: 电脑已经安装 1.Matlab版本2014a 2.VS版本2015 目标: 结合Matlab和VS2015,实现Matlab的GUI文件和.m文件转化为.exe文件,然后可以单独运行 ...

  6. Mysql获取时间戳的一些处理

    前情提要: 老板需要一个统计今日新增用户的功能 我的想法是统计24小时内新增用户的功能 直接去问AI 我明确指出了时间戳 但是AI给出的答案却差了口气 这就是老板给我工资而不是给微软工资的地方 DAT ...

  7. Error: Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000: java.net.ConnectException: 拒绝连接 (Connection refused) (state=08S01,code=0)

    一:启动hiveserver2服务 二:启动beeline 三:连接hiveserver2(下面的1000000端口号适当改小写因为其超出最大端口号的范围建议改为10000) 如果启动不成功实现我们先 ...

  8. Unity UGUI的PointerEventData的介绍及使用

    Unity UGUI的PointerEventData的介绍及使用 1. 什么是PointerEventData? PointerEventData是Unity中UGUI系统中的一个重要组件,用于处理 ...

  9. VuePress@next 使用数学公式插件

    VuePress@next 使用数学公式插件 搞了一个VuePress1.0的 现在升级了一下,但是使用数学公式的插件老报错啊!经过不懈努力,终于搞定了.现在记录一下. VuePress 介绍 Vue ...

  10. java无法加载maper.xml问题

    项目依赖其他模块,模块中有 mapper,本项目也有mapper,导致项目无法正常运行. 解决办法: 1.配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.X ...