This commit is contained in:
oneao committed 2026-10-08 22:38:34 +08:00
1 parent f572dce2f6
commit e99a9fb274
356 files changed
+28877 -1055

No files matched your search

@@ -0,0 +1,90 @@
---
title: Spin 加载中
description: 包裹内容显示加载遮罩,或作为独立的加载指示器
---
# Spin 加载中
`Spin` 表达「正在加载」。它会**遮罩被包裹的内容并阻止交互**,这是它与只显示图标的纯视觉 loading 的区别。
## 何时使用
- 区域级加载:表格、卡片、表单在请求期间需要冻结交互时;
- 局部刷新:点「重新加载」后只遮住该区域,而不是整页 loading;
- 全局 loading 建议用顶部进度条或 [Message](/ui/feedback/message),避免整页白屏。
## 基础用法
传默认插槽即「包裹模式」:`spinning` 为 true 时给内容加遮罩并显示指示器。
:::demo{name="spin/basic"}
:::
## 独立使用
不传默认插槽时就是独立指示器,配 `description` 显示加载文案。
:::demo{name="spin/standalone"}
:::
## 延迟显示
`delay` 用来防「闪一下」:请求很快时根本不显示加载态,只有超过 `delay` 才出现。
:::demo{name="spin/delay"}
:::
## 使用建议
```vue
<!-- 推荐:局部冻结,用户知道「正在刷新的是哪一块」 -->
<G3Spin :spinning="loading" :delay="300">
<DataTable :rows="rows" />
</G3Spin>
<!-- 不推荐:把整页包起来,用户失去上下文 -->
<G3Spin :spinning="loading"><App /></G3Spin>
```
## API
### Props
| 名称 | 类型 | 默认值 | 说明 |
| --- | --- | --- | --- |
| `spinning` | `boolean` | `false` | 是否加载中。包裹模式下会显示遮罩并阻止点击;独立模式下控制指示器显隐 |
| `delay` | `number` | `0` | 延迟显示(ms)。请求快于该值时不显示加载态,避免闪烁 |
| `description` | `string` | — | 加载文案,显示在指示器下方 |
### Slots
| 名称 | 参数 | 说明 |
| --- | --- | --- |
| `default` | — | 被遮罩的内容。不传时渲染为独立指示器 |
| `indicator` | — | 自定义指示器(替换默认转圈) |
| `description` | — | 自定义文案内容 |
### 类型定义
```ts
export interface SpinProps {
spinning?: boolean
delay?: number
description?: string
}
```
### 样式变量
| 变量 | 默认值 | 说明 |
| --- | --- | --- |
| `--g3-spin-size` | `20px` | 指示器尺寸 |
| `--g3-spin-description-gap` | `8px` | 指示器与文案的间距 |
| `--g3-color-primary` | `#18181b` | 指示器颜色 |
## 实现说明
- 遮罩是绝对定位覆盖在内容之上(内容区保持原尺寸,不会因为加载而跳高跳宽),并吃掉点击,避免用户在加载中重复提交;
- 遮罩带 `aria-busy="true"`,屏幕阅读器能感知「该区域忙」,并且不会改变内容的可访问名称;
- `delay` 的计时在 `spinning` 变 true 时启动、变 false 时清除:这样连续多次短请求不会累积显示;
- 转圈动画在 `prefers-reduced-motion: reduce` 下会变成静态(保留图形、停止旋转),避免诱发不适。