我使用默认的Blazor服务器应用程序来构建登录页面。我正在创建我自己的UI";框架";的组件,我想看看是否可以让Parent组件检测是否有某个子组件。如果提供了子组件,则更改父组件的html结构。
使用组件的登录页面:
<Card Color="bg-info">
<CardHeader>Card Header</CardHeader>
<CardBody>
<CardTitle>Card title</CardTitle>
<CardTitle SubTitle>Card Subtitle</CardTitle>
<CardText>Card text goes here...</CardText>
</CardBody>
<CardFooter>
<Spacer />
<Button Color="bg-danger">Cancel</Button>
<Button class="ms-2" Color="bg-primary" @onclick="Test">Ok</Button>
</CardFooter>
</Card>
卡(父(组件:
<div @attributes="AdditionalAttributes" class="@BaseCss" style="@BaseStyles">
@ChildContent
</div>
所以我要找的是,如果<Card>
组件的消费者选择在<Card>
内部使用<CardHeader>
子组件,那么有问题地更改Card组件的html模板
类似这样的东西,但我不确定如何实现:
<div @attributes="AdditionalAttributes" class="@BaseCss" style="@BaseStyles">
@if (HEADER_COMPONENT_EXISTS) <----- How do i get this?
{
@HEADER_COMPONENT_HERE <------ How can i add this RenderFragment
<div class="card-body">
@ChildContent
</div>
}
else
{
<div class="card-body">
@ChildContent
</div>
}
</div>
CardHeader
、CardBody
和CardFooter
组件是否在其他地方使用?如果没有,您可以直接在Card
组件中使用这些参数,如下所示:
<div @attributes="AdditionalAttributes" class="@BaseCss" style="@BaseStyles">
@CardHeader
<div class="card-body">
@CardBody
</div>
@CardFooter
</div>
@code {
[Parameter]
public RenderFragment CardHeader { get; set; }
[Parameter]
public RenderFragment CardBody { get; set; }
[Parameter]
public RenderFragment CardFooter { get; set; }
}
如果在<Card> </Card>
内部没有添加<CardHeader> </CardHeader>
,则不会为@CardHeader
呈现任何内容。
您可以通过对照null
:来验证Parameter
的存在
<div @attributes="AdditionalAttributes" class="@BaseCss" style="@BaseStyles">
@if (CardHeader != null)
{
@CardHeader
<!-- Other header-relevant content -->
}
@CardBody
</div>
注意:如果您也想保留ChildContent
作为Card
的参数,则需要将子内容封装在<ChildContent> </ChildContent>
:中
<Card Color="bg-info">
<CardHeader><!--Header content--></CardHeader>
<CardBody><!--Body content--></CardBody>
<CardFooter><!--Footer content--></CardFooter>
<ChildContent><!--Other content--></ChildContent>
<!--Any content that goes here will get an error message-->
</Card>
如果任何组件采用多个RenderFragment
类型的参数,则情况就是这样。