Appearance
xtf-state-view
组件说明
xtf-state-view 是状态视图,用于在内容、加载、空数据和异常反馈之间切换。当前实现通过 action 等事件反馈交互。
- 实际 Demo 路由:
#/pages/components/xtf-state-view/index - Demo 源码
基础用法
1. 内容状态
content 状态只渲染默认插槽中的业务内容。
vue
<template>
<view class="doc-state-content">
<XtfStateView status="content"><text class="doc-content-text">今日订单 18 笔,成交金额 CNY 8,420.00</text></XtfStateView>
</view>
</template>
<script setup lang="uts">
import XtfStateView from "@/uni_modules/xtf-linkuiunix/components/xtf-state-view/xtf-state-view.uvue"
console.log("state content")
</script>
<style>
.doc-state-content { display: flex; flex-direction: column; padding: 24rpx; }
.doc-content-text { color: #334155; font-size: 26rpx; }
</style>2. Spinner 与骨架加载
loadingVariant 分别选择 spinner 和 skeleton,骨架行数由 skeletonRows 控制。
vue
<template>
<view class="doc-state-loading">
<XtfStateView status="loading" loading-variant="spinner" loading-text="正在同步订单" /><XtfStateView status="loading" loading-variant="skeleton" :skeleton-rows="4" :centered="false" />
</view>
</template>
<script setup lang="uts">
import XtfStateView from "@/uni_modules/xtf-linkuiunix/components/xtf-state-view/xtf-state-view.uvue"
console.log("loading variants: spinner/skeleton")
</script>
<style>
.doc-state-loading { display: flex; flex-direction: column; padding: 24rpx; }
</style>3. 空状态与操作
empty 状态可显示操作入口,点击后只触发 action。
vue
<template>
<view class="doc-state-empty">
<XtfStateView status="empty" title="暂无订单" description="新订单会显示在这里" action-text="创建订单" @action="onAction" />
</view>
</template>
<script setup lang="uts">
import XtfStateView from "@/uni_modules/xtf-linkuiunix/components/xtf-state-view/xtf-state-view.uvue"
function onAction(payload: any): void { console.log("empty action", payload) }
</script>
<style>
.doc-state-empty { display: flex; flex-direction: column; padding: 24rpx; }
</style>4. 错误状态与重试
error 状态的操作会先触发 action,再触发 retry;两个事件都应由业务层处理。
vue
<template>
<view class="doc-state-error">
<XtfStateView status="error" title="加载失败" description="请检查网络后重试" action-text="重新加载" @action="onAction" @retry="onRetry" />
</view>
</template>
<script setup lang="uts">
import XtfStateView from "@/uni_modules/xtf-linkuiunix/components/xtf-state-view/xtf-state-view.uvue"
function onAction(payload: any): void { console.log("error action", payload) }
function onRetry(payload: any): void { console.log("error retry", payload) }
</script>
<style>
.doc-state-error { display: flex; flex-direction: column; padding: 24rpx; }
</style>5. 动态状态与状态插槽
动态切换四种状态,并分别用 loading、empty、error、action slot 替换反馈内容。
vue
<template>
<view class="doc-state-dynamic">
<button class="doc-action-button" @click="nextStatus">切换状态</button><text class="doc-state-text">status: {{ status }}</text><XtfStateView :status="status" action-text="继续" @action="onAction" @retry="onRetry"><text class="doc-content-text">内容已加载</text><template #loading><text class="doc-content-text">自定义加载中</text></template><template #empty><text class="doc-content-text">暂无业务记录</text></template><template #error><text class="doc-content-text">业务请求失败</text></template><template #action="slotProps"><text class="doc-content-text">处理 {{ slotProps.status }}</text></template></XtfStateView>
</view>
</template>
<script setup lang="uts">
import XtfStateView from "@/uni_modules/xtf-linkuiunix/components/xtf-state-view/xtf-state-view.uvue"
import { ref } from "vue"
type StateStatus = "content" | "loading" | "empty" | "error"
const statuses = ["content", "loading", "empty", "error"] as StateStatus[]
const status = ref<StateStatus>("content")
function nextStatus(): void { const index = statuses.indexOf(status.value); status.value = statuses[(index + 1) % statuses.length]; console.log("status", status.value) }
function onAction(payload: any): void { console.log("dynamic action", payload) }
function onRetry(payload: any): void { console.log("dynamic retry", payload) }
</script>
<style>
.doc-state-dynamic { display: flex; flex-direction: column; padding: 24rpx; }
.doc-content-text { color: #334155; font-size: 26rpx; }
.doc-action-button { margin-top: 16rpx; }
.doc-state-text { margin-top: 12rpx; color: #475569; font-size: 24rpx; }
</style>全部属性
| 属性 | 源码类型 | withDefaults 默认值 | 实际行为 / 范围 | 适用范围 |
|---|---|---|---|---|
status | XtfStateStatus | "content" | 参与组件运行逻辑;源码在 10 处读取该值;消费位置:script 行 47、script 行 52、script 行 53、script 行 55 | 需要覆盖组件默认业务值时设置。 |
loadingVariant | "spinner" | "skeleton" | "spinner" | 参与组件运行逻辑;源码在 1 处读取该值;可选值:spinner / skeleton;消费位置:template 行 6 | 需要控制显示、可用性或交互状态时设置。 |
loadingText | string | "" | 设置对应区域的显示文案;消费位置:template 行 7 | 需要控制显示、可用性或交互状态时设置。 |
skeletonRows | number | 3 | 参与组件运行逻辑;源码在 2 处读取该值;消费位置:script 行 46 | 需要覆盖组件默认业务值时设置。 |
emptyType | string | "default" | 参与组件运行逻辑;源码在 1 处读取该值;消费位置:template 行 11 | 需要覆盖组件默认业务值时设置。 |
errorType | string | "network" | 参与组件运行逻辑;源码在 1 处读取该值;消费位置:template 行 18 | 需要覆盖组件默认业务值时设置。 |
title | string | "" | 参与组件运行逻辑;源码在 2 处读取该值;消费位置:template 行 11、template 行 18 | 需要提供业务文案或图标内容时设置。 |
description | string | "" | 参与组件运行逻辑;源码在 2 处读取该值;消费位置:template 行 11、template 行 18 | 需要提供业务文案或图标内容时设置。 |
actionText | string | "" | 设置对应区域的显示文案;消费位置:script 行 48、template 行 13、template 行 20 | 需要提供业务文案或图标内容时设置。 |
theme | string | "primary" | 参与组件运行逻辑;源码在 5 处读取该值;消费位置:template 行 7、template 行 11、template 行 13、template 行 18 | 需要调整布局或视觉表现时设置。 |
centered | boolean | true | 参与组件运行逻辑;源码在 1 处读取该值;消费位置:script 行 47 | 需要覆盖组件默认业务值时设置。 |
minHeight | string | number | 320 | 设置对应区域高度;消费位置:script 行 50 | 需要调整布局或视觉表现时设置。 |
customClass | string | "" | 参与组件运行逻辑;源码在 1 处读取该值;消费位置:script 行 47 | 需要调整布局或视觉表现时设置。 |
customStyle | string | UTSJSONObject | "" | 参与组件运行逻辑;源码在 1 处读取该值;消费位置:script 行 50 | 需要调整布局或视觉表现时设置。 |
事件
| 事件名称 | 源码触发边界 | 回调参数 | 参数说明 |
|---|---|---|---|
action | handleAction 内触发(script 行 54);参数表达式:detail;前置 guard:provider?.getDisabled() == true || (props.status != "empty" && props.status != "error") | (...args: any[]) | 表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。 |
retry | handleAction 内触发(script 行 55);参数表达式:detail;前置 guard:provider?.getDisabled() == true || (props.status != "empty" && props.status != "error") | (...args: any[]) | 表中参数表达式来自当前源码直接调用点;禁用、守卫失败或未进入该函数分支时不会触发。 |
插槽
| 插槽 | Scope 参数 | 实际渲染位置 |
|---|---|---|
default | (props: {}) | 仅在模板对应 <slot> 渲染位置生效。 |
loading | (props: {}) | 仅在模板对应 <slot> 渲染位置生效。 |
empty | (props: {}) | 仅在模板对应 <slot> 渲染位置生效。 |
error | (props: {}) | 仅在模板对应 <slot> 渲染位置生效。 |
action | (props: { status: XtfStateStatus }) | 仅在模板对应 <slot> 渲染位置生效。 |
方法
实例方法
| 方法 | 签名 / 返回值 | 调用边界 |
|---|---|---|
| - | - | 当前组件没有公开实例方法。 |
公开状态
| 状态 | 类型 / 包装 | 读取边界 |
|---|---|---|
| - | - | 当前组件没有公开状态。 |
主题说明
- 当前组件 CSS 未读取
var(--xtf-*)主题变量;颜色或尺寸可能来自 props、固定样式或父级上下文。
平台与实现边界
- 基线为 HBuilderX 5.26+ 与 uni-app x;当前报告已验证 Web Chromium 的对应 Demo,不据此承诺 Safari、小程序或 App 原生端等价。
- Android、iOS、HarmonyOS、Vapor 原生路径、触摸手势、字体、Canvas、安全区和系统权限能力,只有源码或完整性报告明确覆盖的部分才可视为已验证。
- 本文按当前源码生成,不补入旧版
xtf-linkui存在但迁移版未实现的 props、事件、slot 或方法。 - 详细公共边界见 平台与实现边界,逐项运行证据见项目根目录 COMPONENT_COMPLETENESS.md。