我想知道是否可以引用子元素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();
}
正如 Issac 所说,您尝试解决问题的方式对于 Blazor 来说是不可能的。但是,子元素可以使用级联参数。这看起来似乎可以实现你想要的,但它只是从另一个方向实现的。让我尝试举个例子...
鉴于此设置
<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
,我写了一个博客文章 https://chrissainty.com/building-components-via-rendertreebuilder/关于如何正确地做到这一点,同时也指出为什么你可能不应该这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)