再学Blazor——组件

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

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

1. 组件类

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

html 复制代码
//HTML 写法
MyComponent.razor

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

2. 组件嵌套

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

html 复制代码
//HTML 写法
MyApp.razor

<MyComponent />

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

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

3. 组件参数

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

  • 需要包含 Parameter 特性
  • 必须是 public 的属性
csharp 复制代码
class MyComponent : ComponentBase
{
    [Parameter] public string? Title { get; set; }
    //子内容呈现片段
    [Parameter] public RenderFragment? ChildContent { get; set; }

    protected override void BuildRenderTree(RenderTreeBuilder builder) { ... }
}

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

html 复制代码
//HTML 写法
MyApp.razor

<div>
    <MyComponent Title="组件1" />
    <MyComponent Title="组件2">
        子内容呈现
    </MyComponent>
</div>
csharp 复制代码
//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 复制代码
//HTML 写法
MyApp.razor

<div>
    <MyComponent @ref="component" Title="组件1" />
</div>

@code {
    private MyComponent? component;
}

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

csharp 复制代码
//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);
        });
    }
}
相关推荐
橙子家8 小时前
浏览器缓存之【身份与会话管理】:Cookies 和 Private state tokens
前端
最新资讯动态9 小时前
HDC 2026 | 对话鲸鸿动能:存量时代,品牌如何夺回营销“主动权”?
前端
最新资讯动态9 小时前
游戏出海,从产品走向体系
前端
最新资讯动态9 小时前
20人团队跑出百万DAU、大厂也来抢量:谁在鸿蒙生态跑出加速度
前端
最新资讯动态9 小时前
千万开发者背后,鸿蒙商业化的B面
前端
爱勇宝11 小时前
AI 时代:智商决定起点,情商决定走多远
前端·ai编程
kyriewen11 小时前
用了半年 Claude Code 后,我尝试关掉它写了一周代码——结果比想象中严重
前端·javascript·ai编程
IT_陈寒12 小时前
Vite的静态资源打包让我熬夜到三点,这坑千万别跳
前端·人工智能·后端
徐小夕13 小时前
万字拆解 JitWord:企业级实时协同文档底层架构 + 大模型 AI 融合完整实践
前端·vue.js·github
一份执念13 小时前
uni-app 小程序分包限制处理与主包体积优化实战
前端·微信小程序