在Blazor中获取子组件列表的最佳方法

4

我们需要在父组件的OnAfterRenderAsync方法中获取子组件列表,但我们不知道如何做到这一点。 我们尝试使用RenderBuilderGetFrames,但这总是为空。 我们有一个Splitter组件,其中包含N个分割区作为子组件,我们需要在OnAfterRenderAsync方法中获取所有区域的父组件。

1个回答

14

如果您有一种类型为X的父组件,并且您想要引用所有与之紧密耦合的类型为Y的子节点(例如TabControl和TabPages),那么您可以执行以下操作。

1:在父组件中添加一个包装器来包含您的@ChildContent,并添加一个指向它本身的级联值。

<CascadingValue Value=@this>
  @ChildContent
</CascadingValue>

2:通过 CascadingParameter,您可以在子组件中使用该值。

@code
{
  [CascadingParameter]
  public YourParentComponent ParentComponent { get; set; }
}

3:您的孩子可以通知他们的父母知道他们的存在

protected override void OnInitialized()
{
    if (ParentComponent == null)
      throw .............("Must be used within MyParentComponent");
    MyParentComponent.AddChild(this);
}
如果您的子组件有条件渲染,请让它们实现IDisposable接口,这样它们就可以通知父组件将它们从列表中移除。
在Blazor University上有一个关于如何创建TabControl的示例 - https://blazor-university.com/templating-components-with-renderfragements/creating-a-tabcontrol/

@Kristijan Mihaljinac,我建议你在选择使用CascadingValue之前先阅读一些相关资料。在GitHub上搜索与CascadingValue使用相关的问题。这是一篇文章的链接,你可以在文章的结尾处阅读作者得出的结论。没有人声称它是一种无用的方法,不是这样的,它是Blazor的一部分,但你必须意识到它的局限性和由其使用引起的问题。https://chrissainty.com/understanding-cascading-values-and-cascading-parameters/ - enet
唯一需要记住的是对于一些额外的速度,使用IsFixed=@true。就这样。 - Peter Morris
如果孩子的数量是动态变化的,该怎么办?例如,ChildContent可能会像这样:@if(checkboxValue) { <Child /> } <Child />。我如何按正确的顺序获取这些孩子? - Liero
如果你想找出它们的顺序,你就得查看生成它们的数据。 - Peter Morris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接