- 前端
- UI组件
- 设计系统
【免费下载链接】ant-design-blazor
基于 Ant Design 与 Blazor 的前端组件库。让开发者解放生产力,实现更大价值。
当页面局部正在等待异步数据或处于渲染过程中时,一个合适的加载动效能够有效缓解用户等待的焦虑。Ant Design Blazor 的Spin(加载中)组件正是为此而生——它既是独立展示的加载指示器,也可以作为包裹容器将现有内容整体置为加载状态。阅读本文后,你将掌握 Spin 组件的基本用法、尺寸与嵌套模式、延迟防抖机制,以及如何通过Indicator参数接入自定义加载指示符。
基本用法:一个简单的 loading 状态
Spin组件最基本的使用方式极为简洁——仅需一个空标签即可输出默认的旋转加载动画。这在 Ant Design Blazor 官方文档的 basic.md(基本用法)中被定义为"一个简单的 loading 状态"。
<Spin />对应官方文档站点的演示代码(见 Basic.razor)只有一行,没有任何附加参数。此时Spin会以"简单模式"(Simple)渲染:组件自身不包含子内容(ChildContent为空),仅输出加载指示符本身。
从源码层面看(Spin.razor),默认指示符是一组四个圆点(ant-spin-dot):
<span class="ant-spin-dot ant-spin-dot-spin"> <i class="ant-spin-dot-item"></i> <i class="ant-spin-dot-item"></i> <i class="ant-spin-dot-item"></i> <i class="ant-spin-dot-item"></i> </span>四个ant-spin-dot-item圆点分布在四方,通过 CSS 动画antSpinMove(透明度变化)与antRotate(旋转)组合形成经典旋转加载效果,动画节奏依次延迟 0.4s/0.8s/1.2s,具体见 components/spin/style/index.less。
渲染逻辑与参数驱动
Spin组件的渲染由两个模板分支决定(Spin.razor):
- Simple 模式:
ChildContent为null时,直接渲染指示符; - 嵌套模式:存在
ChildContent时,外层包裹ant-spin-container容器,指示符与内容并存。
是否加载由内部状态_isLoading控制,其初始值直接取自Spinning参数(默认为true,见 Spin.razor.cs)。加载状态下:
- 指示符元素获得
ant-spin-spinning类,变为可见(opacity: 1); - 内容容器获得
ant-spin-blur类,内容呈半透明模糊态并禁用交互(pointer-events: none)。
API 参数详解
Spin 组件的全部公开参数定义在 Spin.razor.cs,官方文档(index.zh-CN.md)整理如下:
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
Delay | 延迟显示加载效果的时间(防止闪烁) | int(毫秒) | 0 |
Indicator | 加载指示符,自定义显示内容 | RenderFragment | -(使用默认圆点) |
Size | 组件大小,可选Small/Default/Large | SpinSize | SpinSize.Default |
Spinning | 是否为加载中状态 | bool | true |
Tip | 当作为包裹元素时,可自定义描述文案 | string | null |
WrapperClassName | 包装器的类属性 | string | - |
与 React 版本不同,Blazor 版本的Size使用强类型枚举SpinSize(定义于 SpinSize.cs,包含Small、Default、Large三个值),在 Razor 中直接写作Size="SpinSize.Small"即可,编译期即可发现拼写错误。
尺寸映射与样式实现
不同尺寸对应不同 CSS 类与圆点大小:
Size值 | CSS 类 | 圆点尺寸 |
|---|---|---|
SpinSize.Small | ant-spin-sm | 14px(点 6px) |
SpinSize.Default | (无额外类) | 20px(点 9px) |
SpinSize.Large | ant-spin-lg | 32px(点 14px) |
类映射逻辑在 Spin.razor.cs 的SetClass()中通过ClassMapper动态组装;圆点尺寸变量@spin-dot-size-sm/ - /-lg定义于 components/style/themes/default.less,可通过主题变量定制。
各种大小:按场景选尺寸
官方文档(size.md)给出了明确的选型建议:
Small:用于文本加载场景;Default:用于卡片容器级加载;Large:用于页面级加载。
<div> <Spin Size="SpinSize.Small" /> <Spin /> <Spin Size="SpinSize.Large" /> </div>对应演示代码见 Size.razor。示例中还给 Spin 添加了ant-spin-spinning样式使三个加载器横向排布展示,实际业务中 Spin 默认以内联块(inline-block)方式显示。
嵌套模式:将现有内容整体置为加载状态
Spin最实用的能力是"直接内嵌内容",把现有容器整体变为加载状态(官方文档 nested.md:"可以直接把内容内嵌到 Spin 中,将现有容器变为加载状态")。
<div> <Spin Spinning="loading"> <Alert Message="Alert message title" Description="Further details about the context of this alert." Type="AlertType.Info" /> </Spin> <div style="margin-top: 16px"> Loading state: <Switch Checked="loading" OnChange="toggle" /> </div> </div> @code { bool loading = false; void toggle(bool value) => loading = value; }演示源码见 Nested.razor。要点:
- 子内容以
ChildContent传入,Spinning参数控制加载态; - 加载中时,内容容器自动获得
ant-spin-blur类(Spin.razor.cs),实现半透明模糊遮罩,pointer-events: none阻止用户与内容交互; - 结合
Switch组件动态切换loading,即可模拟异步数据加载的完整交互。
容器用法与 WrapperClassName
若只是想把 Spin 放进某个已有容器(如居中的卡片),可直接将 Spin 作为容器子元素,官方文档 inside.md 展示了这一场景:
<div class="example"> <Spin /> </div>完整演示见 Inside.razor。当 Spin 包裹内容(嵌套模式)时,外层div会带上ant-spin-nested-loading包装类;此时可通过WrapperClassName参数附加自定义类,该参数在SetClass()中通过WrapperClassMapper.If(...)条件追加(Spin.razor.cs)。
自定义描述文案(Tip)
当 Spin 作为包裹元素使用时,Tip参数可在指示符下方显示一行描述文字:
<Spin Tip="Loading..."> <Alert Message="Alert message title" Description="Further details about the context of this alert." Type="AlertType.Info" /> </Spin>演示见 Tip.razor。渲染时,Tip 文本输出到ant-spin-text元素(Spin.razor),同时组件会追加ant-spin-show-text类使文案显示(Spin.razor.cs)。样式中show-text的布局位置(圆点与文字的间距调整)见 index.less。
延迟加载(Delay):防止闪烁
当异步操作极快时,loading 一闪而过会造成视觉闪烁。Delay参数用于延迟加载效果的出现:若Spinning状态在 delay 时间内结束,则不显示 loading 状态(官方文档 delayAndDebounce.md)。
<Spin Spinning="loading" Delay="500"> <Alert Message="Alert message title" Description="Further details about the context of this alert." Type="AlertType.Info" /> </Spin> @code { bool loading = false; void toggle(bool value) => loading = value; }演示见 DelayAndDebounce.razor。其底层实现(Spin.razor.cs)值得展开:
OnInitialized()中,当Delay > 0时创建一个System.Timers.Timer;OnParametersSet()中检测_isLoading != Spinning时,重启计时器,保证每次状态翻转都重新计满 delay 时长;- 计时器
Elapsed触发DelayElapsed,此时才将_isLoading更新为Spinning并调用StateHasChanged()刷新 UI; Dispose(bool)中调用_delayTimer?.Dispose()释放计时器资源。
这意味着"延迟"同时具备防闪烁与防抖双重语义:短促的状态翻转在 delay 结束前被合并,loading 根本不会渲染。默认Delay = 0(不启用),设置为如500(毫秒)即可获得平滑体验。
自定义指示符(Indicator)
Indicator参数接受RenderFragment,可完全替换默认的圆点动画。官方示例使用图标组件Icon配合Spin属性实现旋转图标指示器(CustomIndicator.razor):
<Spin Indicator="antIcon" /> @code{ RenderFragment antIcon = @<Icon Type="@IconType.Outline.Loading" Style="font-size: 24px" Spin />; }要点:
Type="@IconType.Outline.Loading"使用 outline 主题的loading图标(定义于 IconType.cs);Icon组件的Spin属性(Icon.razor.cs)让图标自身执行旋转动画;- 指示符在 Spin.razor 中优先渲染
Indicator,为空时才回退到默认圆点模板。
这套机制让 Spin 的视觉风格可以完全贴合业务品牌:例如接入骨架屏、自定义 SVG、或加载进度百分比文本等任意RenderFragment内容。
源码视角的完整状态机
综合 Spin.razor.cs 的完整实现,Spin 的加载状态可归纳为以下流程:
- 初始化:
OnInitialized()调用SetClass()组装ant-spin、ant-spin-spinning、尺寸类与ant-spin-show-text等类名;_isLoading置为Spinning初值;若Delay > 0创建计时器; - 参数更新:
OnParametersSet()对比_isLoading与Spinning,有差异时若存在计时器则重启,否则直接同步状态并触发重渲染; - 延迟生效:计时器到达后
DelayElapsed同步状态并StateHasChanged(); - 销毁:
Dispose()释放计时器,避免内存泄漏。
Spinning、Delay与Indicator、Size、Tip、WrapperClassName共同构成了 Spin 完整的功能矩阵:前者控制"何时展示",后者控制"长什么样"。
总结
Ant Design Blazor 的 Spin 组件覆盖了从单行指示符到全页面加载的完整场景:
| 使用场景 | 推荐写法 |
|---|---|
| 文本/按钮内局部加载 | <Spin Size="SpinSize.Small" /> |
| 卡片容器级加载 | <Spin />(默认尺寸) |
| 页面级加载 | <Spin Size="SpinSize.Large" /> |
| 内容整体遮罩加载 | <Spin Spinning="loading">…内容…</Spin> |
| 带描述文案 | 增加Tip="Loading..." |
| 防止快速操作闪烁 | 增加Delay="500" |
| 替换默认指示符 | 传入Indicator(如旋转 Icon) |
在 Blazor 应用中,最常见的实践是:将Spinning绑定到数据加载状态字段,配合Delay避免闪烁,用Tip提示用户当前进度。所有参数均定义于 Spin.razor.cs,样式定义于 components/spin/style/index.less,完整的七个官方演示(基本、尺寸、嵌套、容器、描述、延迟、自定义指示符)均可在 site/AntDesign.Docs/Demos/Components/Spin/demo 目录下查阅,可作为你项目中的直接参考样板。
- 前端
- UI组件
- 设计系统
【免费下载链接】ant-design-blazor
基于 Ant Design 与 Blazor 的前端组件库。让开发者解放生产力,实现更大价值。
相关推荐
如何用一条命令激活 Windows 11:开源脚本 MAS 实用指南
如何用一条命令激活 Windows 11:开源脚本 MAS 实用指南 刚装完系统,右下角的"未激活"水印让人坐不住。MAS(Microsoft Activati
UI组件前端Ant Design Spin 自定义加载指示符(Custom Indicator)完整实战指南
Ant Design Spin 自定义加载指示符(Custom Indicator)完整实战指南 Spin 是 Ant Design 反馈(Feedback)组
前端UI组件设计系统ant-design-blazor 中 Spin 加载组件的自定义描述文案(Tip)实战指南
ant design blazor 中 Spin 加载组件的自定义描述文案(Tip)实战指南 导读 在 Blazor 应用中,页面或区块等待异步数据、执行渲染过
UI组件前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考