我想知道是否有可能在组件的ChildContent
参数中引用子元素。我可以将值从父级组件显式传递给子级,也可以使用级联参数传递给子级,但是父级组件无法“了解” ChildContent
RenderFragment
中的元素。可能的用例是一个UIList
组件,该组件获取在渲染过程中已添加到UIListItems
组件中的UIList
的数量。
我尝试覆盖组件上的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();
}
答案 0 :(得分:1)
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>
@functions {
private int ItemCount;
public void AddItem()
{
ItemCount++;
StateHasChanged();
}
}
<div>Child Component</div>
@functions {
[CascadingParameter] private ParentComponet Parent { get; set; }
protected override void OnInit()
{
Parent.AddItem();
}
}
如果我正确理解了您的需求,这应该可以满足您的需求。
我要说的一件事是,尝试避免覆盖BuildRenderTree
,我写了blog post关于如何正确地做它,但也指出了为什么您不应该这样做。
答案 1 :(得分:-1)
这肯定是不可能的,至少在可预见的将来是不可能的。 RenderFragment代表一大堆要渲染的内容,据我所知,暂时无法以编程方式访问您想要的内容。
在Blazor中以及生活中,数据流都是从父组件到子组件。我猜这就是为什么必须根据这种“固有”限制来设计他的软件的原因。原则上,我相信任何事情都是可以实现的,这取决于丹·罗斯所说的可用资源。
关于模板化组件是什么?使用模板化组件,您的UIList组件知道并确定要呈现的UIListItem的数量...
顺便说一句,我想这是我可以在此答案中提供的唯一附加值:您没有正确使用序列。史蒂夫·安德森(Steve Anderson)为此写了一篇文章;搜索)。您不应使用递增变量来发布序列。您应该改用数字,从0开始。
希望这对您有帮助...