Blazor 继承 ChildContent RenderFragments?

2024-03-30

假设我们有一个基本组件ParentComponent.razor:

<div id="ParentComponent">@ChildContent</div>

@code {
    [Parameter] public RenderFragment ChildContent {get;set;}
}

可以这样使用:

<ParentComponent>
    <div>content</div>
</ParentComponent>

这会呈现:

<div id="ParentComponent"><div>content</div></div>

但是假设我们想要一个ChildComponent.razor继承自ParentComponent.razor:

@inherits ParentComponent

<div id="ChildComponent">@ChildContent</div>

@code {
    [Parameter] public RenderFragment ChildContent {get;set;}
}

有没有办法填充父组件的@ChildContent来自 ChildComponent 的 RenderFragment?

<ChildComponent>
    child content
</ChildComponent>

为了产生这个:

<div id="ParentComponent">
    <div id="ChildComponent">child content</div>
</div>

不知道我是否遗漏了一些明显的东西,但已经搞砸了一段时间并且无法在互联网上找到任何答案。

编辑 - 替代解决方案

我找到了另一种方法,它不依赖于直接重写 BuildRenderTree 方法,并允许您使用 html/razor 标记,尽管这确实意味着在房子周围走动。也不确定这是否安全或高性能,但为了完整起见将其放在这里。

ParentElement.razor

@using Microsoft.AspNetCore.Components.Rendering;

@if (!HasRendered()) {
    SetRenderedStatus();
    <div id="ParentComponent">
        RenderChild(__builder);
    </div>
}

@code {
    protected bool _hasBaseRendered = false;

    protected bool HasRendered() {
        return _hasBaseRendered;
    }

    protected void SetRenderedStatus() {
         _hasBaseRendered = true;
    }

    protected virtual void RenderChild(RenderTreeBuilder __builder) { }
}

ChildElement.razor

@using Microsoft.AspNetCore.Components.Rendering
@inherits ParentElement

@if (HasRendered()) {
    <div id="ChildComponent">
         @ChildContent
    </div>
}
@{
    base.BuildRenderTree(__builder);
}

@code {
    [Parameter] public RenderFragment ChildContent { get; set; }

    protected override void RenderChild(RenderTreeBuilder __builder) {
        this.BuildRenderTree(__builder);
    }
}

如此快速的解释,IDE/编译器中的功能清楚地将代码的 razor/html 标记部分编译为BuildRenderTree幕后的方法,这就是为什么你不能在一个.razor成分。

上面的代码编译为:

ChildElement.razor

protected override void BuildRenderTree(RenderTreeBuilder __builder)
{
    if (HasRendered())
    {
        __builder.AddContent(0, "    ");
        __builder.OpenElement(1, "div");
        __builder.AddAttribute(2, "id", "ChildComponent");
        __builder.AddMarkupContent(3, "\r\n        ");
        __builder.AddContent(4, ChildContent);
        __builder.AddMarkupContent(5, "\r\n    ");
        __builder.CloseElement();
        __builder.AddMarkupContent(6, "\r\n");          
    }
    base.BuildRenderTree(__builder);
}

所以 ChildContent 被忽略HasRendered为 false,并指示调用base.BuildRenderTree在父类上。

ParentElement.razor

protected override void BuildRenderTree(RenderTreeBuilder __builder)
{
    if (!HasRendered())
    {
        SetRenderedStatus();
        __builder.AddContent(0, "        ");
        __builder.OpenElement(1, "div");
        __builder.AddAttribute(2, "id", "ParentComponent");
        __builder.AddMarkupContent(3, "\r\n");
        RenderChild(__builder);
        __builder.AddContent(4, "        ");
        __builder.CloseElement();
        __builder.AddMarkupContent(5, "\r\n");
    }
}

它呈现父母标记,中途被定向到RenderChild它在子进程上被覆盖,这将流程返回到子进程的一个级别,其中它BuildRenderTree然后被称为HasRenderedcheck 将确保避免无限循环,然后在返回到父级完成之前渲染标记的子级部分。

这可能会被重构,只是我当前的工作副本实验。


复制并测试...

父组件.cs

public partial class ParentComponent : ComponentBase
{
    [Parameter] public RenderFragment ChildContent { get; set; }

    protected override void BuildRenderTree(RenderTreeBuilder builder)
    {
        builder.OpenElement(0, "div");
        builder.AddAttribute(1, "id", "ParentComponent");
        builder.AddContent(2, ChildContent);
        builder.CloseElement();
        
        base.BuildRenderTree(builder);
    }
}

子组件.cs

public partial class ChildComponent : ParentComponent
{
    protected override void BuildRenderTree(RenderTreeBuilder builder)
    {
        builder.OpenComponent<ParentComponent>(0);
        builder.AddAttribute(1, "ChildContent", (RenderFragment)((builder2) => 
       {
            builder2.OpenElement(1, "div");
            builder2.AddAttribute(2, "id", "ChildComponent");
            builder2.AddContent(3, ChildContent);
            builder2.CloseElement();
        } ));

        builder.CloseComponent();
    
    }
}

索引剃刀

@page "/"

<ChildComponent>child content</ChildComponent>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Blazor 继承 ChildContent RenderFragments? 的相关文章

随机推荐

  • rand() 在 C 语言中有多独特?

    我在用rand 对于需要唯一值的 6 位字段 我做对了吗 几率有多大 rand 可以在连续或频繁的通话中给我类似的值吗 当我使用 rand 时 它是独一无二的 但是 当我打电话时返回相同的号码srand time NULL or srand
  • Powershell脚本:无法读取执行程序的返回值

    我正在使用 PowerShell 运行一个执行的脚本wget获取网页 一个简单的数据库导入脚本 并分析其输出 错误消息或 确定 我正在使用答案中的代码上一个问题 https stackoverflow com questions 20345
  • 最新的浏览器中有内置的 javascript 字符串哈希函数吗?

    每当新版本的浏览器出现时 我都会听到添加新的东西 比如 webGL 和其他没有人真正知道它们是否能赶上的技术 但我想知道是否有人考虑过 JS 中的哈希函数 MD5 SHA1 等 等基本内容 我所说的最新浏览器也指当今的开发版本 例如 Ope
  • 如何使用 EF 6.0 中的代码优先方法从 sql 表中删除列?

    我错误地在数据库中添加了一列 名为doj现在 如果我想使用代码优先方法从表中删除该列 我应该做什么 我已经尝试过这些事情 1 从模型中删除列定义 2 删除了迁移历史记录 3 添加迁移4 更新数据库 但它仍然没有反映在数据库中 我哪里犯了错误
  • 在 Spark 中,广播是如何工作的?

    这是一个非常简单的问题 在 Spark 中 broadcast可用于有效地将变量发送给执行器 这是如何运作的 更确切地说 何时发送值 我一打电话就发送broadcast 或者何时使用这些值 数据到底发送到哪里 发送给所有执行者 还是只发送给
  • 将数字列表转换为范围

    我有一堆数字 请说以下内容 1 2 3 4 6 7 8 20 24 28 32 那里提供的信息可以用 Python 表示为范围 range 1 5 range 6 9 range 20 33 4 在我的输出中我会写1 4 6 8 20 32
  • Swing 应用程序 -> 拖放到桌面/文件夹

    当 Mac 的 Finder Windows 的 Explorer 将 Swing 应用程序中的特定项目拖放到桌面和文件夹时 如何获取我放弃的前路径 我很高兴教给我必要的课程和方法 这是一个小程序 但它适用于任何框架或窗口 public c
  • 根据内容拆分 .txt 文件

    我有一个巨大的 txt文件如下 small file content 1 br small file content 2 br small file content n br 我如何将其分割成n个文件 最好通过bash Use csplit
  • 将 models.py 拆分为多个文件

    我正在尝试拆分models py我的应用程序分成几个文件 我的第一个猜测是这样做 myproject settings py manage py urls py init py app1 views py init py models in
  • 如何声明两个列表具有相同的长度?

    我需要知道如何比较 Prolog 中两个列表的长度 这是我到目前为止所拥有的 sum N1 N2 checklength N1 N2 checklength N1 N2 L1 is length N1 What L2 is length N
  • 如何使用 selenium ide 专注于新窗口?

    我正在尝试使用 selenium ide 来复制操作 该操作是单击打开新窗口的链接 如何让 selenium ide 聚焦在新窗口而不是另一个窗口上 它对我不起作用 选择窗口 为此 您需要使用selectWindow windowName命
  • 创建 JSON 并编辑复杂查询 (oracle 11g)

    我有 4 个不同的表 table price product 包含与产品相关的信息和 他们的价格 table price list 包含与价目表相关的信息 prices per client 包含与价格相关的信息 不同的客户给出特定的产品
  • 角度范围绑定 &(&) 是一次性绑定吗?

    角度范围绑定 是一次性绑定吗 我看到它被称为单向绑定 但它也是一次性的吗 假设我有
  • 在 Java 中嵌入树状图

    我正在寻找一个能够绘图的图书馆树状图 http en wikipedia org wiki DendrogramJava中的数据 不计算它们 我可以自己做 你有任何线索吗 已经尝试通过谷歌搜索它 但没有找到任何不独立的东西 虽然我需要将生成
  • 使用 Java Graphics2D API 在 TextLayout 中将文本右对齐

    因此 我正在使用 Java 教程中的代码来绘制一段文本 但我不知道如何将文本与右边距对齐 我刚刚包括attstring addAttribute TextAttribute RUN DIRECTION TextAttribute RUN D
  • 如何使用 Hibernate 测试表是否为空

    使用 Hibernate 确定表是否为空或非空的最有效方法是什么 换句话说 该表是否有 0 行或多于 0 行 我可以执行 HQL 查询select count from tablename然后检查结果是否为 0 或非 0 但这不是最佳选择
  • Mysql errno 150 尝试使用外键引用创建表

    我正在尝试在 mysql 中创建一个带有外键引用的表 如下所示 在数据库A中 CREATE TABLE replication id varchar 255 NOT NULL PRIMARY KEY uid varchar 255 NOT
  • RESTful servlet URL - web.xml 中的 servlet 映射

    我觉得这是一个常见问题 但我研究过的都还没有起作用 在我的 web xml 中 我有所有 REST 调用的映射
  • pip3 安装 pyautogui 失败,错误代码 1 Mac OS

    我尝试安装 autogui python 扩展 pip3 install pyautogui 此安装尝试会导致以下错误消息 Collecting pyautogui Using cached PyAutoGUI 0 9 33 zip Com
  • Blazor 继承 ChildContent RenderFragments?

    假设我们有一个基本组件ParentComponent razor div ChildContent div code Parameter public RenderFragment ChildContent get set 可以这样使用