ASP.NET Core Blazor 模板化组件ASP.NET Core Blazor templated components

本文内容

作者:Luke LathamDaniel Roth

模板化组件是接受一个或多个 UI 模板作为参数的组件,然后可将其用作组件呈现逻辑的一部分。通过模板化组件,可以创作适用面更广、比常规组件更便于重复使用的组件。下面是一些示例:

  • 表组件,用户可通过它指定表的标题、行和页脚的模板。
  • 列表组件,用户可通过它指定用于呈现列表中项的模板。

模板参数Template parameters

通过指定一个或多个 RenderFragmentRenderFragment<T> 类型的组件参数来定义模板化组件。呈现片段,表示要呈现的 UI 段。RenderFragment<T> 采用可在调用呈现片段时指定的类型参数。

TableTemplate 组件:

  1. @typeparam TItem
  2. <table class="table">
  3. <thead>
  4. <tr>@TableHeader</tr>
  5. </thead>
  6. <tbody>
  7. @foreach (var item in Items)
  8. {
  9. <tr>@RowTemplate(item)</tr>
  10. }
  11. </tbody>
  12. <tfoot>
  13. <tr>@TableFooter</tr>
  14. </tfoot>
  15. </table>
  16. @code {
  17. [Parameter]
  18. public RenderFragment TableHeader { get; set; }
  19. [Parameter]
  20. public RenderFragment<TItem> RowTemplate { get; set; }
  21. [Parameter]
  22. public RenderFragment TableFooter { get; set; }
  23. [Parameter]
  24. public IReadOnlyList<TItem> Items { get; set; }
  25. }

使用模板化组件时,可以使用与参数名称匹配的子元素(在以下示例中为 TableHeaderRowTemplate)指定模板参数:

  1. <TableTemplate Items="pets">
  2. <TableHeader>
  3. <th>ID</th>
  4. <th>Name</th>
  5. </TableHeader>
  6. <RowTemplate>
  7. <td>@context.PetId</td>
  8. <td>@context.Name</td>
  9. </RowTemplate>
  10. </TableTemplate>

模板上下文参数Template context parameters

作为元素传递的 RenderFragment<T> 类型的组件实参具有一个名为 context 的隐式形参(例如前面的代码示例 @context.PetId),但可以使用子元素上的 Context 属性来更改形参名称。在下面的示例中,RowTemplate 元素的 Context 属性指定了 pet 参数:

  1. <TableTemplate Items="pets">
  2. <TableHeader>
  3. <th>ID</th>
  4. <th>Name</th>
  5. </TableHeader>
  6. <RowTemplate Context="pet">
  7. <td>@pet.PetId</td>
  8. <td>@pet.Name</td>
  9. </RowTemplate>
  10. </TableTemplate>

或者,可以在组件元素上指定 Context 属性。指定的 Context 属性适用于所有指定的模板参数。如果你想为隐式子内容指定内容参数名称(不包含任何包装子元素),这可能很有用。在下面的示例中,Context 属性显示在 TableTemplate 元素上,并应用于所有模板参数:

  1. <TableTemplate Items="pets" Context="pet">
  2. <TableHeader>
  3. <th>ID</th>
  4. <th>Name</th>
  5. </TableHeader>
  6. <RowTemplate>
  7. <td>@pet.PetId</td>
  8. <td>@pet.Name</td>
  9. </RowTemplate>
  10. </TableTemplate>

泛型类型化组件Generic-typed components

模板化组件通常是泛型类型。例如,泛型 ListViewTemplate 组件可用于呈现 IEnumerable<T> 值。若要定义泛型组件,请使用 @typeparam 指令指定类型参数:

  1. @typeparam TItem
  2. <ul>
  3. @foreach (var item in Items)
  4. {
  5. @ItemTemplate(item)
  6. }
  7. </ul>
  8. @code {
  9. [Parameter]
  10. public RenderFragment<TItem> ItemTemplate { get; set; }
  11. [Parameter]
  12. public IReadOnlyList<TItem> Items { get; set; }
  13. }

使用泛型类型化组件时,将在可能的情况下推断类型参数:

  1. <ListViewTemplate Items="pets">
  2. <ItemTemplate Context="pet">
  3. <li>@pet.Name</li>
  4. </ItemTemplate>
  5. </ListViewTemplate>

否则,必须使用与类型参数的名称匹配的属性显式指定类型参数。在下面的示例中,TItem="Pet" 指定类型:

  1. <ListViewTemplate Items="pets" TItem="Pet">
  2. <ItemTemplate Context="pet">
  3. <li>@pet.Name</li>
  4. </ItemTemplate>
  5. </ListViewTemplate>