深入浅出Blazor webassembly之理解RenderFragment

Razor 的DOM可以使用html直接写, 也可以使用 RenderFragment C#委托方法写.

RenderFragment C#代理方法会由 Blazor Renderer 引擎自动调用, 我们不应该主动调用,  可将它们认为作为  html snippet用于razor 的 html中.

对于SPA的整个页面, Blazor Renderer会维护一个 RenderTree, 可以将整个DOM tree想象成一个 RenderTree, Renderer引擎会采用 diff 算法来检查DOM是否需要更新, 如果检查到某个节点需要更新, Renderer 引擎调用我们的 RenderFragment 委托, 并将 RenderTreeBuilder 作为委托入参, 完成重绘工作.

 

========================================

Html 写法与等效的RenderFragment 写法

========================================

@page "/hello"
<div>
    hello world
</div>

 

复制代码
@page "/hello2"
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.Components.Rendering 

@HelloContent2 

@code{
    protected RenderFragment HelloContent2=(RenderTreeBuilder builder)=>{
        builder.OpenElement(0,"div");
        builder.AddContent(1, "hello world");
        builder.CloseElement();
    };
}
复制代码

 

========================================

Inline RenderFragment 写法

========================================

普通的RenderFragment 写法繁琐, Blazor 其实还支持 inline 写法, 即在 C# 代码块中直接写html.

Inline 写法的要求是委托形参名必需是 __builder , 前面两个下划线,  否则编译会报错.

复制代码
@page "/hello3"
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.Components.Rendering 

@HelloContent3 

@code{
    protected RenderFragment HelloContent3=(RenderTreeBuilder __builder)=>{
       <div>
            hello world
        </div>
    };
}
复制代码

 

========================================

支持泛型的 RenderFragment 写法

=======================================

复制代码
@page "/hello4"
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.Components.Rendering 

@HelloContent4("world")

@code{
    protected RenderFragment<string> HelloContent4 =(message)=> (RenderTreeBuilder builder)=>{
        builder.OpenElement(0,"div");
        builder.AddContent(1, "hello "+message);
        builder.CloseElement();
    };
}
复制代码

 

========================================

参考

========================================

https://shauncurtis.github.io/articles/Blazor-Components.html

posted @   harrychinese  阅读(1971)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示