Blazor University (18)使用 RenderFragments 模板化组件 —— 创建 TabControl

原文链接:https://blazor-university.com/templating-components-with-renderfragements/creating-a-tabcontrol/

创建一个 TabControl 组件

源代码[1]

接下来我们将创建一个 TabControl 组件。这将教您如何实现以下目标:

  1. 将数据传递到 RenderFragment 以为其提供上下文。

  2. 使用 CascadingParameter 将父 TabControl 组件传递到其子 TabPage 组件。

6b89ecb40245099f2baa52c9de7bdabf.gif

使 TabPage 知道其父级

第一步是创建两个组件。一个命名为 TabControl,另一个命名为 TabPageTabPage 组件将需要对其父 TabControl 的引用,这将通过 TabControl 将自身设置为 CascadingValue 中的值来实现,并且 TabPage 将通过 CascadingParameter 获取该值。

<div>This is a TabControl</div>
<CascadingValue Value="this">
  @ChildContent
</CascadingValue>

@code {
  // Next line is needed so we are able to add <TabPage> components inside
  [Parameter]
  public RenderFragment ChildContent { get; set; }
}
<div>This is a TabPage</div>
@ChildContent

@code {
  [CascadingParameter]
  private TabControl Parent { get; set; }

  [Parameter]
  public RenderFragment ChildContent { get; set; }

  protected override void OnInitialized()
  {
    if (Parent == null)
      throw new ArgumentNullException(nameof(Parent), "TabPage must exist within a TabControl");
    base.OnInitialized();
  }
}

使 TabControl 知道其所属页面

更改 TabPage 组件,以便通过在其 OnInitialized 方法的末尾添加以下行来通知其父级它的存在。

Parent.AddPage(this);

更改 TabControl 组件以添加 AddPage 方法并存储引用。另外,让我们添加一个 ActivePage 属性。

public TabPage ActivePage { get; set; }
List<TabPage> Pages = new List<TabPage>();

internal void AddPage(TabPage tabPage)
{
  Pages.Add(tabPage);
  if (Pages.Count == 1)
    ActivePage = tabPage;
  StateHasChanged();
}

为每个 TabPage 呈现一个选项卡

TabPage 组件添加一个 Text 参数,以便其父 TabControl 知道要在激活每个页面的按钮内显示什么文本。

[Parameter]
public string Text { get; set; }

然后将以下标记添加到 TabControl(就在呈现 ChildContent 的位置上方),这将呈现选项卡,并在单击选项卡时更改选择哪个 TabPage

<div class="btn-group" role="group">
  @foreach (TabPage tabPage in Pages)
  {
    <button type="button"
      class="btn @GetButtonClass(tabPage)"
      @onclick=@( () => ActivatePage(tabPage) )>
      @tabPage.Text
    </button>
  }
</div>

标记将创建一个标准的 Bootstrap 按钮组,然后为每个 TabPage 创建一个具有以下显著特征的按钮:

  1. CSS 类设置为“btn”,由 GetButtonClass 方法返回附加内容。如果选项卡是 ActivePage,这将是“btn-primary”,如果不是,则为“btn-secondary”。

  2. 单击按钮时,它将激活为其创建按钮的页面。

注意: @onclick 需要一个无参数的方法,所以在 @() 中使用了一个 lambda 表达式来使用正确的 TabPage 执行 ActivatePage

  1. 按钮的文本设置为 TabPageText 属性的值。

并将以下内容添加到 TabControl 的代码部分。

string GetButtonClass(TabPage page)
{
  return page == ActivePage ? "btn-primary" : "btn-secondary";
}

void ActivatePage(TabPage page)
{
  ActivePage = page;
}

使用选项卡控件

将以下标记添加到页面并运行应用程序。

<TabControl>
  <TabPage Text="Tab 1">
    <h1>The first tab</h1>
  </TabPage>
  <TabPage Text="Tab 2">
    <h1>The second tab</h1>
  </TabPage>
  <TabPage Text="Tab 3">
    <h1>The third tab</h1>
  </TabPage>
</TabControl>

仅显示活动页面

此时 TabControl 将显示所有 TabPages。要解决此问题,只需更改 TabPage 中的标记,使其仅在它是其父 TabControlActivePage 时才呈现其 ChildContent

@if (Parent.ActivePage == this)
{
  @ChildContent
}

参考资料

[1]

源代码: https://blazor-university.com/templating-components-with-renderfragements/creating-a-tabcontrol/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值