扩展@sw1337 答案,如果派生组件没有降价,您可以将其创建为常规 cs 文件而不是 razor 文件,并且无需调用基本 BuildRenderTree 方法即可按预期工作。有关详细信息,请参阅此github。
简单示例
基础组件 (MyAbstractComponent.razor)
<h1>@header</h1>
@code {
protected string header;
}
派生组件
public class MyDerivedComponent : MyAbstractComponent
{
protected override void OnInitialized()
{
header = "set header from derived component";
}
}
参数示例
基础组件 (MyAbstractComponent.razor)
<h1>@Header</h1>
@code {
[Parameter] public string Header { get; set; }
}
派生组件
public class MyDerivedComponent : MyAbstractComponent
{
protected override void OnParametersSet()
{
// coalesce
Header ??= "Default Header from derived Component"
}
}
用法 1 - 派生组件的默认标头
一些 Razor 文件
<MyDerivedComponent></MyDerivedComponent>
结果
<h1>Default Header from derived Component</h1>
用法 2 - 来自派生消费者的指定标头
一些 Razor 文件
<MyDerivedComponent Header="MyHeader"></MyDerivedComponent>
结果
<h1>MyHeader</h1>
RenderFragment 参数示例
Blazor Fiddle
MyBaseComponent.razor
<h3>@Header</h3>
@if (ChildContent is not null)
{
@ChildContent
}
@code {
[Parameter] public string Header { get; set; }
[Parameter] public RenderFragment ChildContent { get; set; }
}
MyDerivedComponent.cs
public class MyDerivedComponent : MyBaseComponent
{
protected override void OnParametersSet()
{
// coalesce
Header ??= "Derived Component Header";
ChildContent ??= CreateDefaultChildContent();
}
private static RenderFragment CreateDefaultChildContent()
{
return builder =>
{
builder.OpenElement(0, "h4");
builder.AddContent(1, "Derived Component default child content value");
builder.CloseElement();
};
}
}
使用 MyRazorPage.razor
示例一
消费者不传递任何参数。使用派生组件中Header 和ChildContent 的默认值。
代码
<MyDerivedComponent/>
输出
<h3>Derived Component Header</h3>
<h4>Derived Component default child content value</h4>
示例二
消费者传递Header参数,默认使用派生组件的ChildContent。
代码
<MyDerivedComponent Header="Consumer Header"/>
输出
<h3>Consumer Header</h3>
<h4>Derived Component default child content value</h4>
示例三
消费者同时传递Header 和ChildContent 参数。
代码
<MyDerivedComponent Header="Consumer Header">
<h4>Child Content - from consumer</h4>
</MyDerivedComponent>
输出
<h3>Consumer Header</h3>
<h4>Child Content - from consumer</h4>