覆盖BuildRenderTree时是否可以获得RenderFragments列表?

时间:2019-06-05 01:21:09

标签: c# blazor asp.net-core-3.0

我想知道是否有可能在组件的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();
    }

2 个答案:

答案 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开始。

希望这对您有帮助...