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. GC 分代回收算法

    GC 分代回收算法 1.首先了解JVM堆内存是如何分配的. 年轻代内部  生成区 和 S0 S1 的比例 默认情况下是 8:1 :1 堆内存和永久代存储的内容有区别:  堆内存主要存储的是 : 对象, ...

  2. Eclipse Alt + / 无提示

    步骤 一: Widows - Preference - Java - Editor - Content Assist - Advanced 勾选 Java Proposals 二: 在这个位置 点的后 ...

  3. 如何通过Java读取到Windows系统日志evtx文件

    近日公司有个需求,需要调研如何使用Java来读取Windows日志文件(类型:应用程序,安全,Setup,系统) 一番调研以后,在仅使用java的基础上系统日志文件似乎不太可能(就个人调研结果来看), ...

  4. React: 按钮点击时修改颜色

    背景 当存在多个点击按钮时,需要提示用户点击的哪个按钮,所以要进行颜色的修改 import * as React from 'react'; import './style.css'; export ...

  5. jQuery真伪数组转换

    // 真数组转伪数组 [].push.apply(obj,arr); // 伪数组转真数组 [].slice.call(obj);

  6. 王道oj/problem11(函数调用中实现指针的传递)

    网址:http://oj.lgwenda.com/prblem/11 思路:函数中的j=&i,为i的地址 *j可以从地址访问,从而改变i的值 代码: #define _CRT_SECURE_N ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (72)-- 算法导论7.1 3题

    三.请简要地证明:在规模为 n 的子数组上,PARTITION 的时间复杂度为 Θ(n). 文心一言: 首先,我们需要明确PARTITION函数的具体定义.PARTITION函数通常用于快速排序算法中 ...

  8. AVR汇编(三):寻址方式

    AVR汇编(三):寻址方式 AVR具有多种寻址方式,在介绍具体的汇编指令之前,有必要对它们做一定了解. 前面介绍过,AVR将内存空间分为多个部分:寄存器堆.I/O空间.数据空间.程序空间.这些空间支持 ...

  9. JDK中动态库加载路径问题,一文讲清

    前言 本周协助测试同事对一套测试环境进行扩容,我们扩容很原始,就是新申请一台机器,直接把jdk.resin容器(一款servlet容器).容器中web应用所在的目录,全拷贝到新机器上,servlet容 ...

  10. WorkManager的用法

    一.WorkManager的作用 绝大部分应用程序都有后台执行任务的需求,根据需求的不同,Android为后台任务提供了多种解决方案,如JobShedule,Loader,Service等.如果这些a ...