Result 组件设计
概述
Result 组件是本组件库中用于展示结果反馈的核心组件。它延续了我们组件库一贯的设计理念,采用"关注点分离"和"逻辑抽象"的原则,通过动态图标加载和插槽机制实现了一套完整且易用的结果反馈解决方案。
Result 组件专注于处理结果页面的展示、状态管理和内容自定义功能,支持多种状态(成功、失败、警告、信息等)和灵活的内容扩展,为用户提供了一套强大、灵活的结果反馈工具。
设计理念
分层架构
Result 组件严格按照三层架构设计:
- 结构层 result.vue - 负责组件的 DOM 结构和基本布局
- 逻辑层 type.ts 和 result.vue 的逻辑部分 - 处理动态图标加载和插槽逻辑
- 表现层 result.scss - 定义组件的视觉呈现和样式规则
逻辑抽象
Result 组件将复杂的逻辑抽象为核心函数和计算属性:
- iconMap - 动态加载图标组件
currentIcon- 根据 icon 属性动态选择图标- 插槽机制 - 支持自定义副标题和额外内容
这种设计使得组件本身只需要声明所需逻辑,而具体的计算由逻辑函数完成。
核心功能设计
Props 结构化设计
Result 组件的 props 设计简洁明了:
typescript
export interface Props {
/** 图标类型 */
icon?: IconType;
/** 主标题 */
title?: string;
/** 副标题 */
subTitle?: string;
}参数说明:
- icon:支持
'primary'、'success'、'warning'、'error'、'info',默认为'info'。 - title:主标题文本。
- subTitle:副标题文本。
动态图标加载
Result 组件通过 defineAsyncComponent 实现动态图标加载:
typescript
const iconMap: Record<IconType, Component> = {
primary: defineAsyncComponent(() => import('./primary.vue')),
success: defineAsyncComponent(() => import('./success.vue')),
warning: defineAsyncComponent(() => import('./warning.vue')),
error: defineAsyncComponent(() => import('./error.vue')),
info: defineAsyncComponent(() => import('./info.vue')),
};
const currentIcon = iconMap[props.icon || 'info'];该逻辑确保图标按需加载,提升性能。
样式系统设计
CSS 变量控制
Result 组件通过 SCSS 实现样式控制:
--icon-size- 图标大小--title-color- 主标题颜色--subtitle-color- 副标题颜色
布局系统
Result 组件支持灵活的布局控制:
- 垂直居中布局 - 默认使用 Flexbox 布局
- 间距控制 - 通过 SCSS 变量调整间距
状态样式
Result 组件根据不同状态提供相应的样式:
- 默认状态 - 使用信息图标(灰色)
- 成功状态 - 使用绿色图标
- 警告状态 - 使用黄色图标
- 错误状态 - 使用红色图标
- 主要状态 - 使用蓝色图标
组件结构设计
整体结构
Result 组件的整体结构如下:
html
<div class="result">
<component :is="currentIcon" class="result-icon" />
<div class="result-title">{{ title }}</div>
<div class="result-subtitle">
<slot v-if="slots['sub-title']" name="sub-title"></slot>
<span v-else>{{ subTitle }}</span>
</div>
<div class="result-extra">
<slot name="extra"></slot>
</div>
</div>组件层次
Result 组件包含四个主要部分:
- 容器 -
.result- 包裹整个结果反馈区域 - 图标区域 -
.result-icon- 动态加载的图标 - 主标题 -
.result-title- 显示主标题文本 - 副标题 -
.result-subtitle- 显示副标题或插槽内容 - 额外内容 -
.result-extra- 显示额外内容插槽
交互设计
插槽支持
Result 组件支持通过插槽自定义内容:
- 副标题插槽 -
sub-title:允许用户自定义副标题内容。 - 额外内容插槽 - extra:允许用户添加按钮或其他操作元素。
示例:
vue
<MYResult title="操作成功" icon="success">
<template #sub-title>
<span class="custom-subtitle">自定义副标题内容</span>
</template>
<template #extra>
<button class="retry-button">重试</button>
</template>
</MYResult>扩展性设计
Result 组件具备良好的扩展性:
- 图标切换:通过 icon 属性动态切换图标
- 内容自定义:通过插槽机制支持自定义副标题和额外内容
- 样式定制:通过 SCSS 变量调整组件样式
样式细节
Result 组件在样式处理上有以下特点:
- 响应式设计:支持灵活的布局适配
- 一致性:与组件库其他组件保持样式一致性
- 无障碍设计:支持屏幕阅读器识别文本内容
- 动画效果:图标和文字有平滑的过渡效果
性能优化
通过以下方式优化性能:
- 使用
defineAsyncComponent按需加载图标组件 - 将复杂逻辑移至独立的函数中
- 避免不必要的重新渲染
- 使用 Vue 3 Composition API 提高运行效率
设计价值
Result 组件延续了我们组件库的设计哲学:
- 关注点分离:结构、样式、逻辑完全解耦
- 高度复用:通过函数抽象通用逻辑
- 易于维护:清晰的代码结构和命名规范
- 可扩展性强:支持丰富的定制选项
- 一致性:与 Button、Alert 等其他组件保持一致的设计语言