- 前端
- UI组件
- 设计系统
【免费下载链接】ant-design-blazor
基于 Ant Design 与 Blazor 的前端组件库。让开发者解放生产力,实现更大价值。
导读
Spin(加载中)是 ant-design-blazor 中用于表达"页面或区块正在加载"的反馈型组件。除了独立使用的简单加载圈,它更强大的能力是嵌套模式(Embedded mode / 卡片加载中):把任意现有内容直接内嵌进Spin,即可将该容器整体置为加载状态,内容区域自动加模糊遮罩与半透明效果。本文以官方 demo nested.md 为骨架,结合组件源码与样式实现,完整讲解嵌套模式的用法、全部参数、底层渲染逻辑与实战注意事项。
什么是"卡片加载中"(嵌套模式)
官方文档对嵌套模式的定义非常简洁:
可以直接把内容内嵌到
Spin中,将现有容器变为加载状态。 Embedding content intoSpinwill set it into loading state.
也就是说,Spin组件存在两种形态:
- 独立形态(Simple):只渲染一个加载指示器,如
<Spin />或[基本用法](https://link.gitcode.com/i/57e69f84c079e6a05c94c0404be1f28f)中的场景; - 嵌套形态(nested / embedded):
Spin内部包含ChildContent(子内容),此时加载指示器覆盖在内容之上,内容区域被加模糊与遮罩处理,形成"卡片加载中"的效果。
从源码 Spin.razor.cs 可以看到判定逻辑:
private bool Simple => ChildContent == null;即:只要传入了子内容,Spin就自动进入嵌套模式。这也是本篇文章的核心主题。
快速上手:完整可运行的嵌套 Demo
官方配套的示例代码位于 Nested.razor,完整代码如下:
<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; }这段代码展示了嵌套模式最核心的三个要点:
Spin直接包裹业务内容:这里把Alert(提示框)放进Spin标签内部,Alert就成了被加载状态覆盖的"卡片";- 用
Spinning参数控制加载状态:Spinning="loading",当loading为true时容器进入加载态,为false时恢复正常显示; - 通过外部控件动态切换:用一个
Switch开关(绑定Checked="loading"与OnChange="toggle")实时驱动加载状态的切换,便于直观感受两种状态的视觉差异。
初始时loading = false,页面正常显示 Alert 卡片;拨动 Switch 后loading变为true,卡片上随即浮现旋转的加载指示器,内容区域同时变模糊、呈半透明、且不可交互。
底层原理:嵌套模式是如何渲染的
模板结构(Spin.razor)
查看 Spin.razor 的模板实现,可以发现嵌套模式实际渲染为两层结构:
@if (Simple) { @simpleTemplate(this) } else { <div class="@WrapperClassMapper.Class" @ref="Ref"> <div> @simpleTemplate(this) </div> </div> }- 当不满足
Simple(即存在子内容)时,外层套一个WrapperClassMapper驱动的容器,其 class 中包含ant-spin-nested-loading(见 Spin.razor.cs 的SetClass方法); simpleTemplate内部根据_isLoading决定是否渲染加载指示器,同时渲染承载子内容的ant-spin-container容器:
RenderFragment<Spin> simpleTemplate = spin=> @<Template> @if (spin._isLoading) { <div class="@spin.ClassMapper.Class" id="@spin.Id" style="@spin.Style" @ref="spin.Ref"> @if (spin.Indicator != null) { @spin.Indicator } else { @spin.defaultTemplate } @if (spin.Tip != null) { <div class="ant-spin-text">@spin.Tip</div> } </div> } @if (!spin.Simple) { <div class="ant-spin-container @spin.ContainerClass"> @spin.ChildContent </div> } </Template>;由此可以得出嵌套模式的最终 DOM 骨架:
div.ant-spin-nested-loading ├── div │ ├── div.ant-spin.ant-spin-spinning (加载指示器,绝对定位覆盖) │ │ ├── span.ant-spin-dot (默认四点旋转动画) │ │ └── div.ant-spin-text (可选,Tip 文案) │ └── div.ant-spin-container.ant-spin-blur (子内容容器,加载时加模糊)状态驱动:模糊遮罩的开关
子内容容器上的 class 由 Spin.razor.cs 计算:
private string ContainerClass => _isLoading ? $"{PrefixCls}-blur" : "";加载时容器被加上ant-spin-blur;恢复后该 class 被移除。_isLoading的同步逻辑位于OnParametersSet:当Spinning参数变化时直接更新内部状态并触发StateHasChanged()重渲染(Spin.razor.cs)。
样式层:模糊、遮罩与不可交互
样式实现位于 index.less,关键规则如下:
.ant-spin-nested-loading设置position: relative,作为加载指示器的定位基准;> div > .ant-spin中的指示器采用position: absolute,撑满整个容器(width/height: 100%),z-index: 4覆盖在内容之上;.ant-spin-container设置position: relative与transition: opacity 0.3s,并使用::after伪元素实现遮罩层(z-index: 10);.ant-spin-blur开启后,内容区opacity: 0.5、user-select: none、pointer-events: none——这正是"加载中禁止交互、防止误操作"的底层实现;- 指示器的四点圆球由
antSpinMove(透明度交替)与antRotate(整体旋转)两组@keyframes驱动(index.less)。
从源码结构可以推断,嵌套模式"模糊 + 半透明 + 屏蔽点击"的体验完全由 CSS 层保证,Blazor 组件层只负责按需切换ant-spin-blur类名。
核心参数详解(API 全景)
官方 API 文档 index.zh-CN.md 列出了以下参数,结合 Spin.razor.cs 的[Parameter]声明与默认值,整理如下:
| 参数 | 说明 | Blazor 类型 | 默认值 |
|---|---|---|---|
| Spinning | 是否为加载中状态,嵌套模式下直接决定内容容器是否加ant-spin-blur | bool | true |
| Delay | 延迟显示加载效果的时间(毫秒),防止状态快速切换导致闪烁 | int | 0 |
| Size | 组件大小,可选small、default、large | SpinSize | SpinSize.Default |
| Tip | 当作为包裹元素时,可自定义描述文案(显示在指示器下方) | string | null |
| Indicator | 自定义加载指示符(替代默认四点动画) | RenderFragment | null |
| WrapperClassName | 嵌套模式下外层包装容器的类属性 | string | null |
| ChildContent | 被包裹、需进入加载状态的内容 | RenderFragment | null |
其中SpinSize枚举定义在 SpinSize.cs,取值为Small、Default、Large。组件按Size在 class 上追加ant-spin-sm或ant-spin-lg(Spin.razor.cs),对应样式见 index.less:small 圆球 6px、默认 9px、large 14px。
几点说明:
- 官方 API 表沿用了 React 版 antd 的表述(如
ReactNode、number),实际在 Blazor 中对应类型以上表为准; Spinning默认值为true:若不显式传参,嵌套内容会直接处于加载态,官方 demo 显式绑定Spinning="loading"正是为了可控;- 文档中提到 React 版的静态方法
Spin.setDefaultIndicator用于全局自定义指示器,在 Blazor 版本中暂无对应静态方法,请通过Indicator参数按组件粒度自定义。
进阶实战一:给加载态加上 Tip 文案
在嵌套模式下,Tip会在指示器下方渲染一行描述文字(class 为ant-spin-text)。官方示例 Tip.razor:
<Spin Tip="Loading..."> <Alert Message="Alert message title" Description="Further details about the context of this alert." Type="AlertType.Info" /> </Spin>此时容器上方显示旋转指示器,并在其下方展示 "Loading..." 文案。样式上,.ant-spin-show-text会调整指示器的垂直偏移(margin-top: -(dot-size/2) - 10px),为文案预留空间(index.less)。注意:Tip仅在嵌套模式(有子内容)下才有意义,因为独立形态没有内容容器可描述。
进阶实战二:Delay 延迟加载,防止闪烁
异步请求很快返回时,加载态一闪而过会造成视觉抖动。Delay参数(毫秒)专门用于解决这一问题,官方示例 DelayAndDebounce.razor:
<Spin Spinning="loading" Delay="500"> <Alert Message="Alert message title" Description="Further details about the context of this alert." Type="AlertType.Info" /> </Spin>其底层实现是System.Timers.Timer延迟生效:组件初始化时若Delay > 0即创建定时器(Spin.razor.cs),并在OnParametersSet中检测到Spinning变化时重启定时器,延时结束后才更新_isLoading并触发重渲染(Spin.razor.cs)。组件销毁时定时器被Dispose,避免资源泄漏(Spin.razor.cs)。
用法要点:将Delay设为略大于"预计最快返回时间",例如 500ms,即可在快速响应场景下完全不闪加载动画,而慢请求仍能看到完整加载态。
进阶实战三:用 Indicator 自定义加载指示器
官方示例 CustomIndicator.razor 展示了用图标替换默认四点动画:
<Spin Indicator="antIcon" /> @code{ RenderFragment antIcon = @<Icon Type="@IconType.Outline.Loading" Style="font-size: 24px" Spin />; }Indicator是一个RenderFragment,渲染时优先输出Indicator,否则回退到默认的ant-spin-dot四点动画(Spin.razor)。该能力在嵌套模式中同样生效——你可以为"卡片加载中"定制品牌化的加载动效。
嵌套模式最佳实践
- 始终显式控制
Spinning:Spinning默认true,请像官方 demo 那样绑定真实的数据加载状态(如bool loading),并在异步任务完成后置回false; - 结合真实异步场景:常见范式是将
loading与async方法联动,例如列表刷新、表单提交期间置true,finally中置false,保证无论成败都能恢复内容交互; - 善用
Delay防闪烁:对"大概率快速返回"的本地缓存或内存数据请求,设置 200~500ms 延迟可显著提升观感; - 必要时配合
Tip:加载超过秒级的操作(如导出、批量处理),给用户明确的文案预期; - 注意交互屏蔽:加载期间内容区
pointer-events: none,用户无法点击,因此不要让加载态长时间覆盖关键操作入口,超时要有兜底; - 尺寸选择:卡片内部空间较小时优先
Size="SpinSize.Small",独立占位场景(如内部示例)再考虑Default/Large。
小结
Spin 的"卡片加载中"嵌套模式,本质是一个以ChildContent是否为空为分界的双形态组件:传入内容即自动套上ant-spin-nested-loading包裹层,加载时通过ant-spin-blur类完成内容的模糊、降透明度与点击屏蔽。配合Spinning、Delay、Tip、Indicator四个高频参数,即可在 ant-design-blazor 中轻松实现与 Ant Design 一致的区块级加载体验。建议结合组件文档 index.zh-CN.md、源码 Spin.razor.cs 与样式 index.less 进一步深入研读。
- 前端
- UI组件
- 设计系统
【免费下载链接】ant-design-blazor
基于 Ant Design 与 Blazor 的前端组件库。让开发者解放生产力,实现更大价值。
相关推荐
MAS 激活脚本:一条命令免费激活 Windows 11 与 Office 的完整指南
MAS 激活脚本:一条命令免费激活 Windows 11 与 Office 的完整指南 MAS 激活脚本是一个开源的 Windows 激活工具,把 HWID、O
操作系统Ant Design Spin 组件完整指南:加载动画、嵌套遮罩、进度与全屏模式
Ant Design Spin 组件完整指南:加载动画、嵌套遮罩、进度与全屏模式 Spin 是 Ant Design(antd)中用于表示页面或区块「加载中」状
前端UI组件设计系统Ant Design Spin 内嵌模式(Embedded Mode)实战:将任意容器变为加载状态
Ant Design Spin 内嵌模式(Embedded Mode)实战:将任意容器变为加载状态 Spin 是 Ant Design 反馈类组件中用于承载“页
前端UI组件设计系统
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考