覆盖 BuildRenderTree 时是否可以获取 RenderFragments 列表?
Is it possible to get a list of RenderFragments when overriding BuildRenderTree?
我想知道是否可以在组件的 ChildContent
参数中引用子元素。我可以显式地或通过使用级联参数将值从父组件传递给子组件,但是父组件没有很好的方法来 "know" ChildContent
RenderFragment
中的元素。一个可能的用例是 UIList
组件,它获取在渲染过程中添加到 UIList
组件的 UIListItems
的数量。
我试图覆盖组件上的 BuildRenderTree
方法以手动操作 ChildContent
RenderFragment
但我唯一的选择是渲染或忽略片段(我不能查看 RenderFragment
委托的内容)。
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
int seq = 0;
base.BuildRenderTree(builder);
builder.OpenElement(seq++, "div");
builder.AddContent(seq++, this.ChildContent);
builder.CloseElement();
}
我想知道下面的内容是否可行。请注意,以下语法无效,仅作为一个示例来说明问题。
protected int NumberOfItems{get;set;}
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
int seq = 0;
base.BuildRenderTree(builder);
builder.OpenElement(seq++, "div");
foreach(var childFragment in this.ChildContent.GetFragments())
{
if(childFragment is UIListItem)
NumberOfItems++;
builder.AddContent(seq++,childFragment);
}
builder.CloseElement();
}
这当然不可能,至少在可预见的未来不可能。 RenderFragment 表示要呈现的一大块内容,据我所知,暂时无法以编程方式访问其中的内容,您想要的方式...
在 Blazor 中,在生活中也是如此,数据流是从父组件流向子组件。我想这就是为什么必须根据这个 "inherent" 限制来设计他的软件的原因。原则上,我相信任何事情都是可以实现的,这取决于 Dan Roth 所说的可用资源。
模板化组件是什么?使用模板化组件,您的 UIList 组件知道并确定要呈现的 UIListItems 的数量...
顺便说一下,我想这是我可以在这个答案中提供的唯一附加值:您没有正确使用序列。 Steve Anderson 写了一篇关于这个的文章;搜索它)。您不应该使用递增变量来发出序列。您应该改用数字,从 0 开始。
希望这对您有所帮助...
正如 Issac 所说,您尝试解决问题的方式无法通过 Blazor 实现。但是,子元素可以使用 CascadingParameter 向父元素注册自己。这似乎会实现你想要的,它只是从另一个方向来的。让我举个例子...
鉴于此设置
<ParentComponent>
<ChildComponent></ChildComponent>
<ChildComponent></ChildComponent>
<ChildComponent></ChildComponent>
</ParentComponent>
我想你正在寻找这样的输出
<div>
<p>Total Items: 3</p>
<div>Child Component</div>
<div>Child Component</div>
<div>Child Component</div>
</div>
父组件
<div>
<p>Total Items: @ItemCount</p>
<CascadingValue Value="this">
@ChildContent
</CascadingValue>
</div>
@code {
private int ItemCount;
public void AddItem()
{
ItemCount++;
StateHasChanged();
}
}
<div>Child Component</div>
@code {
[CascadingParameter] private ParentComponent Parent { get; set; }
protected override void OnInitialized()
=> Parent.AddItem();
}
如果我正确理解了您的需求,这应该会达到您想要的结果。
我要说的一件事是,尽量避免覆盖 BuildRenderTree
,我已经写了一篇 blog post 关于如何正确执行它的文章,但也指出了为什么你可能不应该.
我想知道是否可以在组件的 ChildContent
参数中引用子元素。我可以显式地或通过使用级联参数将值从父组件传递给子组件,但是父组件没有很好的方法来 "know" ChildContent
RenderFragment
中的元素。一个可能的用例是 UIList
组件,它获取在渲染过程中添加到 UIList
组件的 UIListItems
的数量。
我试图覆盖组件上的 BuildRenderTree
方法以手动操作 ChildContent
RenderFragment
但我唯一的选择是渲染或忽略片段(我不能查看 RenderFragment
委托的内容)。
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
int seq = 0;
base.BuildRenderTree(builder);
builder.OpenElement(seq++, "div");
builder.AddContent(seq++, this.ChildContent);
builder.CloseElement();
}
我想知道下面的内容是否可行。请注意,以下语法无效,仅作为一个示例来说明问题。
protected int NumberOfItems{get;set;}
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
int seq = 0;
base.BuildRenderTree(builder);
builder.OpenElement(seq++, "div");
foreach(var childFragment in this.ChildContent.GetFragments())
{
if(childFragment is UIListItem)
NumberOfItems++;
builder.AddContent(seq++,childFragment);
}
builder.CloseElement();
}
这当然不可能,至少在可预见的未来不可能。 RenderFragment 表示要呈现的一大块内容,据我所知,暂时无法以编程方式访问其中的内容,您想要的方式...
在 Blazor 中,在生活中也是如此,数据流是从父组件流向子组件。我想这就是为什么必须根据这个 "inherent" 限制来设计他的软件的原因。原则上,我相信任何事情都是可以实现的,这取决于 Dan Roth 所说的可用资源。
模板化组件是什么?使用模板化组件,您的 UIList 组件知道并确定要呈现的 UIListItems 的数量...
顺便说一下,我想这是我可以在这个答案中提供的唯一附加值:您没有正确使用序列。 Steve Anderson 写了一篇关于这个的文章;搜索它)。您不应该使用递增变量来发出序列。您应该改用数字,从 0 开始。
希望这对您有所帮助...
正如 Issac 所说,您尝试解决问题的方式无法通过 Blazor 实现。但是,子元素可以使用 CascadingParameter 向父元素注册自己。这似乎会实现你想要的,它只是从另一个方向来的。让我举个例子...
鉴于此设置
<ParentComponent>
<ChildComponent></ChildComponent>
<ChildComponent></ChildComponent>
<ChildComponent></ChildComponent>
</ParentComponent>
我想你正在寻找这样的输出
<div>
<p>Total Items: 3</p>
<div>Child Component</div>
<div>Child Component</div>
<div>Child Component</div>
</div>
父组件
<div>
<p>Total Items: @ItemCount</p>
<CascadingValue Value="this">
@ChildContent
</CascadingValue>
</div>
@code {
private int ItemCount;
public void AddItem()
{
ItemCount++;
StateHasChanged();
}
}
<div>Child Component</div>
@code {
[CascadingParameter] private ParentComponent Parent { get; set; }
protected override void OnInitialized()
=> Parent.AddItem();
}
如果我正确理解了您的需求,这应该会达到您想要的结果。
我要说的一件事是,尽量避免覆盖 BuildRenderTree
,我已经写了一篇 blog post 关于如何正确执行它的文章,但也指出了为什么你可能不应该.