Skip to content

Commit e6afb4f

Browse files
authored
doc(Layout): improve load theme logic (dotnetcore#6598)
* feat: 增加 GetPreferredThemeAsync 扩展方法 * doc: 更新主题加载逻辑防止抖动 * perf: 优化性能 * refactor: 移除 GetPreferredThemeAsync 扩展方法 * refactor: 删除 getPreferredTheme 方法
1 parent 84d660c commit e6afb4f

File tree

6 files changed

+45
-19
lines changed

6 files changed

+45
-19
lines changed

src/BootstrapBlazor.Server/Components/Components/Pre.razor.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { copy, getDescribedElement, addLink, removeLink, addScript, getHeight, getPreferredTheme, registerBootstrapBlazorModule } from "../../_content/BootstrapBlazor/modules/utility.js"
1+
import { copy, getDescribedElement, addLink, removeLink, addScript, getHeight, getTheme, registerBootstrapBlazorModule } from "../../_content/BootstrapBlazor/modules/utility.js"
22
import EventHandler from "../../_content/BootstrapBlazor/modules/event-handler.js"
33

44
export async function init(id, title, assetRoot) {
@@ -9,7 +9,7 @@ export async function init(id, title, assetRoot) {
99

1010
await addScript(`${assetRoot}lib/highlight/highlight.min.js`)
1111
await addScript(`${assetRoot}lib/highlight/cshtml-razor.min.js`)
12-
await switchTheme(getPreferredTheme(), assetRoot);
12+
await switchTheme(getTheme(), assetRoot);
1313

1414
const preElement = el.querySelector('pre')
1515
const code = el.querySelector('pre > code')

src/BootstrapBlazor.Server/Components/Layout/BaseLayout.razor

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
@inherits LayoutComponentBase
22

33
<BootstrapBlazorRoot>
4-
<Header></Header>
5-
<main>
6-
@Body
7-
</main>
4+
@if (_init)
5+
{
6+
<Header></Header>
7+
<main>
8+
@Body
9+
</main>
10+
}
811
</BootstrapBlazorRoot>
912

1013
<div id="blazor-error-ui">

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,21 @@
33
// See the LICENSE file in the project root for more information.
44
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone
55

6+
using BootstrapBlazor.Server.Data;
7+
using Microsoft.Extensions.Options;
8+
using Microsoft.JSInterop;
9+
610
namespace BootstrapBlazor.Server.Components.Layout;
711

812
/// <summary>
913
/// 母版页基类
1014
/// </summary>
1115
public partial class BaseLayout : IDisposable
1216
{
17+
[Inject]
18+
[NotNull]
19+
private IJSRuntime? JSRuntime { get; set; }
20+
1321
[Inject]
1422
[NotNull]
1523
private IStringLocalizer<BaseLayout>? Localizer { get; set; }
@@ -26,6 +34,10 @@ public partial class BaseLayout : IDisposable
2634
[NotNull]
2735
private IDispatchService<bool>? RebootDispatchService { get; set; }
2836

37+
[Inject]
38+
[NotNull]
39+
private IOptions<WebsiteOptions>? WebsiteOption { get; set; }
40+
2941
[NotNull]
3042
private string? FlowText { get; set; }
3143

@@ -38,6 +50,8 @@ public partial class BaseLayout : IDisposable
3850
[NotNull]
3951
private string? CancelText { get; set; }
4052

53+
private bool _init = false;
54+
4155
/// <summary>
4256
/// <inheritdoc/>
4357
/// </summary>
@@ -54,6 +68,19 @@ protected override void OnInitialized()
5468
RebootDispatchService.Subscribe(NotifyReboot);
5569
}
5670

71+
/// <summary>
72+
/// <inheritdoc/>
73+
/// </summary>
74+
/// <returns></returns>
75+
protected override async Task OnInitializedAsync()
76+
{
77+
await base.OnInitializedAsync();
78+
79+
var module = await JSRuntime.LoadModule($"{WebsiteOption.Value.JSModuleRootPath}Layout/BaseLayout.razor.js");
80+
await module.InvokeVoidAsync("initTheme");
81+
_init = true;
82+
}
83+
5784
private async Task NotifyCommit(DispatchEntry<GiteePostBody> payload)
5885
{
5986
if (payload.CanDispatch())
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { getTheme, setTheme } from "../../_content/BootstrapBlazor/modules/utility.js"
2+
3+
export function initTheme() {
4+
const currentTheme = getTheme();
5+
setTheme(currentTheme, false);
6+
}

src/BootstrapBlazor/Components/ThemeProvider/ThemeProvider.razor.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { getPreferredTheme, setTheme, switchTheme, calcCenterPosition } from "../../modules/utility.js"
1+
import { getTheme, setTheme, switchTheme, calcCenterPosition } from "../../modules/utility.js"
22
import EventHandler from "../../modules/event-handler.js"
33
import Data from "../../modules/data.js"
44

@@ -17,7 +17,7 @@ export function init(id, invoke, themeValue, callback) {
1717

1818
let currentTheme = themeValue;
1919
if (currentTheme === 'useLocalStorage') {
20-
currentTheme = getPreferredTheme();
20+
currentTheme = getTheme();
2121
}
2222
setTheme(currentTheme, true);
2323
theme.currentTheme = currentTheme;

src/BootstrapBlazor/wwwroot/modules/utility.js

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -716,18 +716,8 @@ export function getHtml(options) {
716716
return html;
717717
}
718718

719-
720-
export function getPreferredTheme() {
721-
const storedTheme = getTheme()
722-
if (storedTheme) {
723-
return storedTheme
724-
}
725-
726-
return getAutoThemeValue();
727-
}
728-
729719
export function getTheme() {
730-
return localStorage.getItem('theme') || document.documentElement.getAttribute('data-bs-theme') || 'light';
720+
return localStorage.getItem('theme') || document.documentElement.getAttribute('data-bs-theme') || getAutoThemeValue();
731721
}
732722

733723
export function saveTheme(theme) {

0 commit comments

Comments
 (0)