Blazor —— 探索razor组件背后的秘密,你绝对想象不到

前言

一般情况下,我们可以使用 .razor 文件来编写组件,但是它背后的秘密你们知道吗?如果不用 .razor 的文件,我们又如何可以编写组件呢?

ComponentBase

这是组件的基类,只要是组件,就必须继承这个类。但是我们在编写 razor 组件的时候,并没有刻意的继承这个类,那是怎么回事呢?我们一起来了解一下其中的奥秘吧。

我编写了一个简单的组件,叫 BigButton

<button class="btn btn-warning btn-lg" @onclick="Click">
    @Text
</button>
@code{

    [Parameter] public string Text { get; set; }

    [Parameter] public EventCallback OnClick { get; set; }

    public async Task Click()
    {
        await OnClick.InvokeAsync(null);
        Text = "按钮被点击了呢";
        StateHasChanged();
    }
}

编译通过后,打开你项目所在的文件夹,找到【obj】文件夹
在这里插入图片描述
进入后,选择【Debug】,这是你项目生成环境的名字,如果是 Release 环境,则进入【Release】。
在这里插入图片描述
这里有2个文件夹,根据你项目使用的运行时框架,选择进入。
在 VS 中双击你的启动项目,进入到 csproj 的编辑模式,
在这里插入图片描述
TargetFramework 节点中就是你的运行时框架版本,我现在用的是 netcoreapp3.1

然后选择【Razor】文件夹
在这里插入图片描述
进去后,你就会发现这里面的文件夹和文件结构,与你项目的结构是一样的。
在这里插入图片描述
然后去找到你的组件名称,一般是以 组件名称.razor.g.cs 命名。
在这里插入图片描述
这个时候你使用 VS 打开看看。
在这里插入图片描述
虽然一看就是机器生成的代码,但是你发现,这些代码其实就是你 razor 页面的代码。但是仔细看清楚,该组件是继承了 ComponentBase 基类。
在这里插入图片描述

RenderTreeBuilder

翻译过来就是渲染树构造器。这是渲染组件的核心类。

ComponentBase 有一个虚方法 protected virtual void BuildRenderTree(RenderTreeBuilder builder); 这个方法就是使用代码的方式渲染 razor 组件的内容。

回到刚才打开的 BigButton.razor.g.cs 类文件中,我们发现在代码中渲染组件正是这个方法:
在这里插入图片描述
等价于:
在这里插入图片描述

自己动手使用代码编写一个按钮:

public class MyButton : ComponentBase
{
    [Parameter] public string ChildContent { get; set; }

    protected override void BuildRenderTree(RenderTreeBuilder builder)
    {
        builder.OpenElement(0, "button");
        builder.AddAttribute(1, "class", "btn btn-primary");
        builder.AddContent(2, ChildContent);
        builder.CloseElement();
    }
}

编译过后,我们就可以使用组件了:
在这里插入图片描述

总结

你现在知道了 razor 文件在编译后的秘密,也开始知道如何使用代码的方式编写组件,但是如果只使用代码的方式去编写一个比较复杂的组件,你可以做到吗?下一篇教会你如何正确地使用 RenderTreeBuilder 渲染组件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我 Teacher 周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值