反馈类

加载器

加载器组件用于告知用户内容正在加载且需要一段不确定的时长。

代码演示

如何引入

<script setup lang="ts">
    import { Spin } from '@fibrous/semi-ui-vue';
</script>

基本用法

A basic spin.
代码
<script setup lang="ts">
    import { Spin } from '@fibrous/semi-ui-vue';
</script>

<template>
    <div style="margin-left: 30px">
        <div style="margin-bottom: 10px">A basic spin.</div>
        <Spin />
    </div>
</template>

尺寸

组件定义了三种尺寸:大、中(默认)、小。

size: small


size: middle


size: large
代码
<script setup lang="ts">
    import { Spin } from '@fibrous/semi-ui-vue';
</script>

<template>
    <div style="margin-left: 30px">
        <div style="margin-bottom: 5px">size: small</div>
        <Spin size="small" />
        <br />
        <br />
        <div style="margin-bottom: 10px">size: middle</div>
        <Spin size="middle" />
        <br />
        <br />
        <div style="margin-bottom: 15px">size: large</div>
        <Spin size="large" />
    </div>
</template>

带文字的

通过 #tip 插槽可设置当 Spin 用作包裹元素时的文字,被包裹的内容放在默认插槽。

I am loading...

Here are some texts.

And more texts on the way.

代码
<script setup lang="ts">
    import { Spin } from '@fibrous/semi-ui-vue';
</script>

<template>
    <div>
        <Spin>
            <template #tip>I am loading...</template>
            <div style="border: 1px solid var(--semi-color-primary); border-radius: 4px; padding-left: 8px">
                <p>Here are some texts.</p>
                <p>And more texts on the way.</p>
            </div>
        </Spin>
    </div>
</template>

自定义指示符

可以通过 #indicator 插槽自定义 Spin 的指示符样式。

A spin with customized indicator.
代码
<script setup lang="ts">
    import { IconLoading } from '@fibrous/semi-icons-vue';
    import { Spin } from '@fibrous/semi-ui-vue';
</script>

<template>
    <div style="margin-left: 30px">
        <div>A spin with customized indicator.</div>
        <Spin>
            <template #indicator>
                <IconLoading />
            </template>
        </Spin>
    </div>
</template>

延迟显示

通过 delay 设置延迟显示 loading 的效果
组件是否处于 loading 状态由传入的 spinning 值决定,loading 为受控属性

代码
<script setup lang="ts">
    import { ref } from 'vue';
    import { Button, Spin } from '@fibrous/semi-ui-vue';

    const loading = ref(false);
</script>

<template>
    <div>
        <Button style="margin-right: 20px" @click="loading = !loading">延迟显示的spin</Button>
        <Spin :delay="1000" :spinning="loading" />
    </div>
</template>

受控

通过 spinning 控制组件是否处于 loading 状态

代码
<script setup lang="ts">
    import { ref } from 'vue';
    import { Button, Spin } from '@fibrous/semi-ui-vue';

    const loading = ref(false);
</script>

<template>
    <div>
        <Button style="margin-right: 20px" @click="loading = !loading">受控的 Spin</Button>
        <Spin :spinning="loading" />
    </div>
</template>

API 参考

Props

属性说明类型默认值
size组件大小。SpinSizesemiDefault("Spin", "size", "middle")
spinning是否处于加载中的状态。booleansemiDefault("Spin", "spinning", true)
delay延迟显示加载效果的时间,单位毫秒。numbersemiDefault("Spin", "delay", 0)
wrapperClassName包裹元素的类名。stringsemiGlobalDefault("Spin", "wrapperClassName")
childStyle内部子元素的样式。CSSPropertiessemiGlobalDefault("Spin", "childStyle")

Events

事件说明回调参数
无

Slots

插槽说明作用域参数
default被包裹的内容;有默认插槽时 Spin 作为包裹元素,加载期间带 aria-busy,且内容不可聚焦、不可操作(inert)。any
indicator自定义加载指示符。any
tip当 Spin 作为包裹元素时,自定义描述文字。any

Exposes

名称说明类型
无

class、style 与原生属性经 attrs 落在根元素上。

Spin 作为包裹元素且处于加载中时,被包裹的内容带 inert,不能聚焦和操作,根元素带 aria-busy。焦点原在被包裹内容里时会先移到 Spin 根元素,加载结束后回到原来的元素。

设计变量

下表是组件内部的 Sass 变量,不能覆写。定制样式请覆写 --semi-* CSS 变量(见 Design Token 页),或写不分层的 CSS 规则。
Sass 变量值用法
$animation_duration-spin_wrapper-spin600ms加载图标容器旋转一周时长
$animation_duration-spin_customChildren-spin1600ms自定义指示器时旋转一周时长
$color-spin-bgvar(--semi-color-primary)加载图标背景颜色
$width-spin_large32px加载图标尺寸 - 大
$width-spin_middle20px加载图标尺寸 - 中
$width-spin_small14px加载图标尺寸 - 小
$opacity-spin_children0.5加载图标透明度

文案规范

  • 准确地说明加载状态,使用比如“Loading”, “Submitting”, “Processing”等词
  • 使用尽量少的词汇去描述状态

FAQ

  • 怎么修改 icon 的颜色?

    可以通过给 .semi-spin-wrapper 类添加 color 属性覆盖原有的颜色(推荐以更高权重覆盖)

    .custom .semi-spin-wrapper {
      color: red;
    }