在我们的Blazor WebAssembly-App中,我们有一个
上面的文件按预期显示以下数据:
当我们移除
也许在
ParentComponent
,它嵌套了多个ChildComponents
。共有3个文件:
- Test.razor是客户端,使用了ParentComponent和ClientComponent。
- ParentComponent.razor嵌套多个ChildComponent。
- ChildComponent.razor是ParentComponent的子组件。
文件:Test.razor
<ParentComponent DataSource="@AccountList">
<ChildComponent TData="Account"><span>@context.FirstName</span></ChildComponent>
<ChildComponent TData="Account"><i>@context.LastName</i></ChildComponent>
<ChildComponent TData="Account"><b>@context.Age</b></ChildComponent>
</ParentComponent>
@code {
// The datasource:
private List<Account> AccountList = new List<Account>() {
new Account() { FirstName = "Sam", LastName = "Soldier", Age = 33},
new Account() { FirstName = "Lisa", LastName = "Johnson", Age = 25},
new Account() { FirstName = "Jonas", LastName = "Peer", Age = 50 }
};
// A Simple Account-Class for the datasource
class Account
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
}
}
上面的文件按预期显示以下数据:
文件:ParentComponent.razor
@typeparam TData
<CascadingValue Value="this" Name="ParentComponent">
@ChildContent
<div class="parent-component">
@foreach (var lData in DataSource)
{
@foreach (var lChild in m_Children)
{
<div class="child-component">
@lChild.ChildContent(lData);
</div>
}
}
</div>
</CascadingValue>
@code {
[Parameter]
public List<TData> DataSource { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
/// Collection of all added child components
private List<ChildComponent<TData>> m_Children = new List<ChildComponent<TData>>();
/// Add a child component (will be done by the child itself)
public void AddChildComponent(ChildComponent<TData> pChildComponent)
{
m_Children.Add(pChildComponent);
StateHasChanged();
}
}
文件名:ChildComponent.razor
@typeparam TData
@code {
/// Reference to the parent component
[CascadingParameter(Name = "ParentComponent")]
ParentComponent<TData> ParentComponent { get; set; }
/// Child content of the component.
[Parameter]
public RenderFragment<TData> ChildContent { get; set; }
// add ChildComponent to ParentComponent
protected override void OnInitialized()
{
Console.WriteLine("ChildComponent.OnInitialized");
ParentComponent.AddChildComponent(this);
}
}
问题:文件 ParentComponent.razor 包含语句 @ChildContent,在这里没有意义,因为我们想通过 @lChild.ChildContent(lData)
渲染子元素的数据。// [...]
<CascadingValue Value="this" Name="ParentComponent">
@ChildContent // <- required, but want to remove, because here is othing to show
<div class="parent-component">
@foreach (var lData in DataSource)
{
@foreach (var lChild in m_Children)
{
<div class="child-component">
@lChild.ChildContent(lData); // We wender the child here
</div>
}
}
// [...]
当我们移除
@ChildContent
时,将不会呈现任何内容。因此,似乎需要调用@ChildContent
来呈现子组件,但似乎是不必要的,因为我们调用了@lChild.ChildContent(lData);
。如何在没有@ChildContent
语句的情况下呈现数据?也许在
@code
块中有可能进行与@ChildContent
相同的调用吗?例如:
ParentComponent.razor:
@code {
protected override void OnAfterRender(bool firstRender)
{
base.OnAfterRender(firstRender);
if (firstRender)
{
ChildContent.Invoke(...); // ???
}
}
}