Skip to content

Commit cbfc040

Browse files
committed
feat: 实现 TabHeader 再其他地方渲染逻辑
1 parent 23d5b3e commit cbfc040

File tree

5 files changed

+82
-7
lines changed

5 files changed

+82
-7
lines changed

src/BootstrapBlazor/Components/Layout/Layout.razor

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,7 @@
8282
@if (ShowTabInHeader)
8383
{
8484
<div class="tabs tabs-chrome">
85-
@if(_tab != null)
86-
{
87-
@_tab.RenderTabHeader
88-
}
85+
@RenderTabHeader()
8986
</div>
9087
}
9188
@Header

src/BootstrapBlazor/Components/Layout/Layout.razor.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,8 @@ public partial class Layout : IHandlerException
457457
private IStringLocalizer<Layout>? Localizer { get; set; }
458458

459459
private bool _init;
460-
private Tab _tab = null!;
460+
private Tab? _tab = null;
461+
private LayoutTabHeader? _tabHeader = null;
461462

462463
/// <summary>
463464
/// <inheritdoc/>
@@ -633,6 +634,18 @@ public virtual Task HandlerException(Exception ex, RenderFragment<Exception> err
633634

634635
private string? GetTargetString() => IsFixedTabHeader ? ".tabs-body" : null;
635636

637+
private RenderFragment RenderTabHeader() => builder =>
638+
{
639+
builder.OpenComponent<LayoutTabHeader>(0);
640+
builder.AddComponentReferenceCapture(1, instance => _tabHeader = (LayoutTabHeader)instance);
641+
builder.CloseComponent();
642+
};
643+
644+
internal void RegisterTab(Tab tab)
645+
{
646+
tab.layoutTabHeader = _tabHeader;
647+
}
648+
636649
/// <summary>
637650
/// <inheritdoc/>
638651
/// </summary>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the Apache 2.0 License
3+
// See the LICENSE file in the project root for more information.
4+
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone
5+
6+
using Microsoft.AspNetCore.Components.Rendering;
7+
8+
namespace BootstrapBlazor.Components;
9+
10+
internal class LayoutTabHeader : IComponent
11+
{
12+
private RenderHandle _renderHandle;
13+
14+
void IComponent.Attach(RenderHandle renderHandle)
15+
{
16+
_renderHandle = renderHandle;
17+
}
18+
19+
/// <summary>
20+
/// <inheritdoc/>
21+
/// </summary>
22+
/// <param name="parameters"></param>
23+
/// <returns></returns>
24+
Task IComponent.SetParametersAsync(ParameterView parameters)
25+
{
26+
return Task.CompletedTask;
27+
}
28+
29+
private RenderFragment? _renderFragment;
30+
31+
/// <summary>
32+
/// render tab header method.
33+
/// </summary>
34+
public void RenderHeader(RenderFragment renderFragment)
35+
{
36+
_renderFragment = renderFragment;
37+
_renderHandle.Render(BuildRenderTree);
38+
}
39+
40+
/// <summary>
41+
/// <inheritdoc/>
42+
/// </summary>
43+
/// <param name="builder"></param>
44+
private void BuildRenderTree(RenderTreeBuilder builder)
45+
{
46+
if (_renderFragment != null)
47+
{
48+
builder.AddContent(0, _renderFragment);
49+
}
50+
}
51+
}

src/BootstrapBlazor/Components/Tab/Tab.razor

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,14 @@ else
4040
@code {
4141
RenderFragment RenderTab =>
4242
@<div @attributes="@AdditionalAttributes" id="@Id" class="@ClassString" style="@StyleString">
43-
@RenderTabHeader
43+
@if (layoutTabHeader != null)
44+
{
45+
layoutTabHeader.RenderHeader(RenderTabHeader);
46+
}
47+
else
48+
{
49+
@RenderTabHeader
50+
}
4451
<div class="tabs-body">
4552
<CascadingValue Value="this" IsFixed="true">
4653
@if (IsOnlyRenderActiveTab)
@@ -62,7 +69,7 @@ else
6269
</div>
6370
</div>;
6471

65-
internal RenderFragment RenderTabHeader =>
72+
RenderFragment RenderTabHeader =>
6673
@<div class="tabs-header">
6774
<div class="@WrapClassString">
6875
@if (BeforeNavigatorTemplate != null)

src/BootstrapBlazor/Components/Tab/Tab.razor.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,8 @@ public partial class Tab : IHandlerException
465465

466466
private bool IsPreventDefault => _contextMenuZone != null;
467467

468+
internal LayoutTabHeader? layoutTabHeader = null;
469+
468470
/// <summary>
469471
/// <inheritdoc/>
470472
/// </summary>
@@ -473,6 +475,11 @@ protected override void OnInitialized()
473475
base.OnInitialized();
474476

475477
ErrorLogger?.Register(this);
478+
479+
if (Layout is { ShowTabInHeader: true })
480+
{
481+
Layout.RegisterTab(this);
482+
}
476483
}
477484

478485
/// <summary>

0 commit comments

Comments
 (0)