深入浅出Blazor webassembly之Loading优化
Blazor wsam 应用有两个环节需要加上 Loading indicator, 一个是app 下载期的loading, 一个是页面初始化的loading, 默认项目模版对于这块都有处理, 但都非常简陋, 对于一个正式项目, 需要做进一步美化.
这里使用了 BlazorPro.Spinkit 组件, 主页 https://github.com/EdCharbeneau/BlazorPro.Spinkit
另一个好的方案是:
应用级 https://www.meziantou.net/customizing-the-blazor-webassembly-loading-screen.htm
页面级 https://www.meziantou.net/showing-a-loading-screen-while-initializing-a-blazor-application.htm
====================================
app loading 优化
====================================
默认项目模版生成 index.html , 处理 app loading 非常简单,
<body> <div id="app">Loading...</div> <div id="blazor-error-ui"> An unhandled error has occurred. <a href="" class="reload">Reload</a> <a class="dismiss">🗙</a> </div> <script src="_framework/blazor.webassembly.js"></script> </body>
优化步骤:
1. 安装 BlazorPro.Spinkit 组件 dotnet add package BlazorPro.Spinkit
2. index.html 引入 spinkit.css
<link href="_content/BlazorPro.Spinkit/spinkit.min.css" rel="stylesheet" />
3. index.html 重写 app div
<!--<div id="app">Loading...</div>--> <div id="app"> <div class="modal-overlay"> <div class="sk-wave"> <div class="sk-wave-rect"></div> <div class="sk-wave-rect"></div> <div class="sk-wave-rect"></div> <div class="sk-wave-rect"></div> <div class="sk-wave-rect"></div> </div> </div> </div>
4. 在 app.css 中增加 modal-overlay 样式
.modal-overlay { position: fixed; top: 0; bottom: 0; left: 0; right: 0; background-color: rgba(0,0,0,0.5); z-index: 2000; display: flex; align-items: center; justify-content: center; flex-direction: column; --sk-color: white; }
效果图:
====================================
page loading 优化--简化版, 直接使用 spinner 组件
====================================
步骤:
1 _Import.razor 引入 @using BlazorPro.Spinkit
2. index.html 引入 spinkit.css
<link href="_content/BlazorPro.Spinkit/spinkit.min.css" rel="stylesheet" />
3. 在 page loading 条件下, 使用下面之一 spinner
@page "/" if (IsLoading) { <Pulse /> <Chase /> <Circle /> <CircleFade /> <Flow /> <Grid /> <Plane /> <Pulse /> <Swing /> <Wander /> <Wave /> <Bounce /> <Fold /> }
4. 以 FetchData.razor 为例, 做简单改造:
@if (forecasts == null) { <Pulse/> } else { @*其他代码省略*@ } @code{ protected override async Task OnInitializedAsync() { forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("sample-data/weather.json"); await Task.Delay(500); //模拟更大的延时 } // 其他代码省略 }
效果图:
====================================
page loading 优化--完整版, 使用 SpinLoader 组件
====================================
步骤:
1 _Import.razor 引入 @using BlazorPro.Spinkit
2. index.html 引入 spinkit.css
<link href="_content/BlazorPro.Spinkit/spinkit.min.css" rel="stylesheet" />
3. 在 page 页面中, 使用 SpinLoader 组件封装那些较为耗时的html片段,
SpinnerLoader 组件包含三个子模版部分
<SpinLoader IsLoading="isLoading" IsFaulted="isFaulted"> <LoadingTemplate> <!-- 加载期显示的内容 ---> </LoadingTemplate> <ContentTemplate> <!-- 正常显示的内容 ---> </ContentTemplate> <FaultedContentTemplate> <!-- 可选部分, 异常发生后显示的内容 ---> </FaultedContentTemplate> </SpinLoader>
以 FetchData.razor 为例, 做简单改造:
<SpinLoader IsLoading="@(forecasts == null)" IsFaulted="@false"> <LoadingTemplate> <Circle Color="#e67e22" Size="60px" Center="true" /> </LoadingTemplate> <ContentTemplate> @*省略展现table的内容*@ </ContentTemplate> <FaultedTemplate> </FaultedTemplate> </SpinLoader>
效果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律