在Blazor中,从子组件调用父组件上的渲染,以便父组件包含子组件

在Blazor中,从子组件调用父组件上的渲染,以便父组件包含子组件,blazor,Blazor,在Blazor中有没有任何方法可以获取对其渲染内容的引用?这是我的想法。让组件B(子组件)继承a(父组件),我可以从B获得BuildRenderTree的结果,以便在a上用作子组件内容吗 背景 我有一个可路由的组件Z,如下所示 @page“\foo” 预期结果是,假设两个组件都呈现div。是B内部div和A外部 有些人可能建议手动执行此操作,但想法恰恰相反 在Blazor中有什么方法可以得到关于它是什么的参考吗 渲染 您可以使用@ref属性获取对“正在呈现”组件的引用: <MyCom

在Blazor中有没有任何方法可以获取对其渲染内容的引用?这是我的想法。让组件B(子组件)继承a(父组件),我可以从B获得BuildRenderTree的结果,以便在a上用作子组件内容吗

背景 我有一个可路由的组件Z,如下所示

@page“\foo”
预期结果是,假设两个组件都呈现
div
。是
B
内部
div
A
外部


有些人可能建议手动执行此操作,但想法恰恰相反

在Blazor中有什么方法可以得到关于它是什么的参考吗 渲染

您可以使用@ref属性获取对“正在呈现”组件的引用:

<MyComponent @ref=@MyCompRef />

@code {
    MyComponent MyCompRef;
}

@代码{
MyComponent MyCompRef;
}
拥有组件B(子级)继承组件a(父级)

否,但如果要在布局中放置B,则可以使用布局指令:

@inherits LayoutComponentBase

<div>I am the LayoutA</div>
<div>The child will be rendered where Body appears below</div>

<div>
   @Body
</div>
@继承LayoutComponentBase
我是拉尤塔
将在Body出现在下面的位置渲染子对象
@身体
和使用布局:

@layout LayoutA

<div>I am component B and will appear inside LayoutA</div>
@布局布局布局
我是组件B,将出现在LayoutA中
我可以从B得到BuildRenderTree的结果,这样我就可以作为 孩子们满足于一个孩子吗

您可以使用模板化组件:

组件A:

<div>Component A Header<div>

<div>
    @ChildContent
</div>

@code {
    [Parameter] public RenderFragment ChildContent { get; set; }
}
组件A标题
@儿童内容
@代码{
[参数]公共RenderFragment ChildContent{get;set;}
}
然后在组件Z中,可以将组件B放入A中:

<ComponentA>
    <ComponentB />
</ComponentA>

这并不是你真正想要的答案——但作为你能做什么的一个例子,它仍然很有趣——也许它会让你思考

A部分
@RFA(@)
@代码
{
内部RenderFragment RFA=rfChild=>@A@rfChild;
}
第1行:
@RFA(@)
-如果您在应用程序中使用组件A,它将只呈现它自己的内容(
是一个空片段)

第4行:将RFA声明为接受另一个RenderFragment作为输入的RenderFragment。它将呈现自己的内容和子内容
rfChild
——在本例中,它将呈现为div的子内容(我至少引用了您的部分问题!)

使用组件A的输出

A.
B部分
@继承一个
@RFA(@B)
第1行:继承自A(哦,这是你问题的第二部分)

第2行:将继承的RenderFragment(
RFA
)添加到此组件的输出中,并传入要在A的标记中呈现的组件B特定标记

使用组件B的输出

A.
B

试试看:

这不是答案……而是一条评论(我所有的答案都是以评论的形式给出的)

你看到这个代码了吗

@test(121)

@code {
    
    private RenderFragment<int> test => (value) => (__builder) =>
        {
        __builder.OpenComponent<TemplatedComponent>(0);
        __builder.AddAttribute(1, "Ref", value);
        __builder.AddAttribute(2, "IntChildContent", 
            (RenderFragment<int>)((context) => (__builder2) =>
            {
                __builder2.OpenElement(3, "p");
                __builder2.AddContent(4, context);
                __builder2.CloseElement();
            }
            ));
            __builder.CloseComponent();

        };

}

如果它不是您真正想要的,那么至少这个代码示例可以启发您如何操作树生成器以复杂优雅的方式构建组件。

不是结果,而是中间产物。你说的“继承”是什么意思?这个问题对我来说毫无意义。这个答案可以帮助你:@HenkHolterman继承的意义没有改变。B:A表示POCO,或在Blazor中向组件B添加
@inherit
指令。True
不是结果。我的想法是显示我期望的树,但为了清晰起见,我说这两个组件都呈现一个简单的
div
。最终结果应该是
。内在的存在B外在的存在A.你所问的真的没有意义
BuildRenderTree
返回一个空值,因此从技术上讲,您无法获得结果,因为它没有空值
BuildRenderTree
作为委托传递给
渲染器
队列,并由渲染器在为队列BuildRenderTree提供服务时运行。调用时,
RenderTreeBuilder
RenderTree
进行必要的更改。只有当渲染器从RenderTree构建DOM时,才会将其转换为Html代码。在您的问题中,您谈到了组件A,但在非常简洁的代码示例中,A在哪里?对您来说毫无意义的事实是无关紧要的。微软blazor团队的想法与此相反。此外,@enet在这里提供了最接近/可接受的答案。最重要的是,组件
A
可能是第三方组件,这与此无关,但仔细阅读,您会发现它只是
div
。Ref指令既不符合用途也不符合布局。模板化=手动。
__builder.AddAttribute(<sequence>, "ChildContent", <...>);