Skip to content

FxLoading 加载

加载数据时显示动效。不依赖任何 UI 框架,提供 v-loading 指令与 FxLoadingService 命令式两种用法。

基础用法

v-loading 绑定布尔值控制显隐,可附在任意元素上(元素需具备定位,组件会自动为非定位父级补 relative)。

自定义

可自定义加载文字 text、背景 background、自定义 SVG spinner(spinner / svg + svgViewBox)。

全屏加载

修饰符 .fullscreen.lock 全屏锁定加载;也可用 FxLoadingService 命令式调用,返回实例 .close() 关闭。

命令式(service)

FxLoadingService(options) 可在任意时机调用。全屏加载为单例,重复调用复用同一实例。

局部引入

ts
import { FxLoadingDirective, FxLoadingService } from "@fx/components"

// 指令需全局注册
app.directive("loading", FxLoadingDirective)

// 命令式调用
const instance = FxLoadingService({ fullscreen: true, text: "加载中" })
instance.close()

API

v-loading 指令

vue
<div v-loading="loading">内容</div>
<div v-loading.fullscreen.lock="loading">全屏锁定</div>
<div v-loading="{ text: '加载中', background: 'rgba(0,0,0,0.7)' }">
  内容
</div>
修饰符说明
fullscreen全屏加载
body挂载到 document.body
lock锁定滚动(fullscreen 下生效)

指令既可绑定布尔值,也可绑定对象配置。除对象属性外,还支持以 DOM 属性方式配置(命名形如 element-loading-textelement-loading-svg 等),用于不便走绑定值的场景。

Service / Options Attributes

FxLoadingService(options) 与指令对象配置共用同一份 options。

名称说明类型默认值
target覆盖目标(DOM 节点或选择器)HTMLElement | stringdocument.body
fullscreen是否全屏booleantrue(target=body)
lock是否锁定滚动(fullscreen 下生效)booleanfalse
textspinner 下方显示的加载文字string | VNode | VNode[]''
spinner自定义 spinner(SVG markup,注入 svg 内,优先级高于 svgstring''
svg自定义 SVG 源码(inner SVG markup),优先级低于 spinnerstring''
svgViewBox自定义 SVG 的 viewBoxstring'0 0 50 50'
background遮罩背景色string''(token 默认遮罩)
customClass自定义类名(附加到遮罩根节点)string''
body是否挂载到 document.bodybooleanfalse
beforeClose关闭前回调,返回 false 取消关闭() => boolean
closed完全关闭(动画结束)后的回调() => void

Service Instance Exposes

FxLoadingService() 返回的实例方法与属性:

名称说明类型
close关闭并淡出卸载() => void
setText动态更新文字(text: string) => void
visible当前可见状态(ref)Ref<boolean>

Slots

名称说明作用域参数
text覆盖默认文字渲染(需设 text)

实现说明

  • 渲染方式:FxLoading 不依赖具体 UI 框架。FxLoadingService 通过 createVNode + render 渲染 loading.vue 并挂载到目标父节点;指令 v-loading 是对 service 的封装,支持布尔值 / 对象配置 / DOM 属性三种取值来源。
  • 渲染结构spinnersvg 均为 SVG markup,二者注入同一个 <svg class="circular">spinner 优先于 svg),带 class="path" 的子元素(<circle>/<path>)自动获得描边色(--color-on-mask)与 fx-loading-dash 流动动画 —— 这是 spinner/svg 必须落在 svg 上下文内的原因,裸 <path> 放在 HTML 中不会渲染。二者均未提供时,默认渲染 @fx-core/iconep:loading 图标并施加 2s 线性旋转。spinner 用 position: absolute + top: 50% + 负 margin(spinner 尺寸之半)让 svg 几何中心落在蒙罩 50% 线,文字在下方自然排列、不参与垂直居中(避免「svg + 文字组合居中」把图标挤偏上);svg 需 vertical-align: top 贴 spinner 内容顶(默认 baseline 会被父级 line-height 推下沉、整体偏上);<svg> 根元素旋转需显式 transform-box: fill-box + transform-origin: center,否则默认按 viewBox 坐标系解析,遇到带偏移的 viewBox 旋转中心会错位。
  • 样式取值:spinner 52px / 全屏 64px / 文字 14px / 旋转 2s;视觉规格全部走 @fx/styles token —— 遮罩背景用 --color-mask(与 fxDialog/fxDrawer 共用的遮罩语义色,明暗自适应),深色蒙罩上 spinner / 文字色统一用 --color-on-mask(遮罩内容语义色,默认派生自 --color-white,可在主题层覆盖)保证对比度,过渡时长用 --duration-normal,不引用任何第三方 UI 库 CSS 变量。
  • 全屏单例:全屏加载复用同一实例,避免重复叠加;同一父节点的多个局部 loading 通过 loading-number 属性计数,仅当最后一个关闭时才移除 fx-loading-parent--relative,防止误伤并发 loading。
  • 关闭流程close() 先校验 beforeClose,置 visible=false 触发淡出,待淡出动画结束(400ms 兜底)后 handleAfterLeave 真正卸载 DOM、移除父级类、回退 loading-number 并触发 closed
  • 响应式更新:指令在 updated 时比对配置,配置变化会重建实例,使 text / background / spinner 等即时生效。
  • fx 增强:默认 spinner 使用 @fx-core/iconep:loading 图标;FxIcon 默认 size=16px 会在内联 style 写死宽高、覆盖外部 CSS,故通过 size prop 显式传入 CSS 变量来跟随 spinner 尺寸,避免图标被固定在 16px。