Timeline 组件设计
概述
Timeline 组件是本组件库中用于展示时间轴信息的核心组件。它延续了我们组件库一贯的设计理念,采用"关注点分离"和"逻辑抽象"的原则,通过 MYTimeline 和 MYTimelineItem 等核心组件实现了一套完整且易用的时间轴解决方案。
Timeline 组件专注于处理时间序列信息的展示和组织,为用户提供了一套强大、灵活的时间轴管理功能,支持垂直和水平两种布局方向,有效提升用户在浏览时间序列数据时的体验。
设计理念
分层架构
Timeline 组件严格按照三层架构设计:
- 结构层 timeline.vue, timelineItem.vue - 负责组件的 DOM 结构和基本布局
- 逻辑层 - 由于组件逻辑相对简单,主要逻辑直接在组件中实现
- 表现层 timeline.scss, timelineItem.scss - 定义组件的视觉呈现和样式规则
逻辑抽象
Timeline 组件将核心逻辑抽象为:
- direction - 控制时间轴的布局方向
- 节点连接线逻辑 - 处理时间轴项之间的连接线
- 时间戳区域 - 处理时间信息的展示
这种设计使得组件保持简洁,同时提供足够的灵活性。
核心功能设计
Props 结构化设计
Timeline 组件的 props 设计简洁明了:
typescript
defineProps<{
/** 时间轴方向 */
direction?: 'vertical' | 'horizontal';
/** 主题 */
theme?: string;
/** 自定义样式 */
style?: import('vue').StyleValue;
}>();TimelineItem 组件的 props 设计:
typescript
defineProps<{
/** 时间戳 */
timestamp: string;
/** 节点颜色 */
color?: string;
/** 图标 */
icon?: string;
}>();参数说明:
- direction:支持
'vertical'(默认)和'horizontal'两种方向。 - timestamp:时间轴项的时间戳信息。
- color:节点的颜色,支持自定义。
- style:支持自定义内联样式。
布局系统
Timeline 组件支持两种主要布局:
typescript
withDefaults(defineProps<{
direction?: 'vertical' | 'horizontal';
// ...
}>(), {
direction: 'vertical'
});布局说明:
- vertical:垂直布局(默认),时间轴从上到下排列。
- horizontal:水平布局,时间轴从左到右排列。
样式系统设计
CSS 变量控制
Timeline 组件通过 SCSS 实现样式控制:
--timeline-node-color- 节点颜色--timeline-line-color- 连接线颜色--timeline-timestamp-color- 时间戳颜色
布局系统
Timeline 组件支持灵活的布局控制:
- 垂直布局 - 默认使用 Flexbox 垂直排列时间项
- 水平布局 - 使用 Flexbox 水平排列时间项
- 间距控制 - 通过 SCSS 变量调整时间项间距
状态样式
Timeline 组件根据不同状态提供相应的样式:
- 默认状态 - 标准时间轴样式
- 自定义颜色状态 - 通过 color 属性自定义节点颜色
- 末尾项状态 - 最后一个时间项不显示连接线
组件结构设计
整体结构
Timeline 组件的整体结构如下:
html
<!-- 时间轴容器 -->
<div class="my-timeline" :class="[direction]" :style="style">
<slot />
</div>
<!-- 时间轴项 -->
<div class="my-timeline-item">
<div class="timeline-timestamp">
<slot name="timestamp">{{ timestamp }}</slot>
</div>
<div class="timeline-node">
<div class="timeline-dot" :style="{ backgroundColor: color }"></div>
<div class="timeline-line"></div>
</div>
<div class="timeline-content">
<slot />
</div>
</div>组件层次
Timeline 组件包含三个主要部分:
- 时间轴容器 -
.my-timeline- 包裹整个时间轴 - 时间轴项 -
.my-timeline-item- 单个时间点的容器 - 时间戳区域 -
.timeline-timestamp- 显示时间信息 - 节点区域 -
.timeline-node- 包含节点和连接线 - 内容区域 -
.timeline-content- 显示详细内容
交互设计
时间轴方向切换
Timeline 组件通过 direction 属性实现方向切换:
scss
.my-timeline {
display: flex;
flex-direction: column;
position: relative;
padding: 16px 0;
}
.my-timeline.horizontal {
flex-direction: row;
align-items: center;
padding: 0 16px;
}节点连接线处理
Timeline 组件通过 CSS 处理节点连接线:
scss
.timeline-node {
position: relative;
width: 24px;
display: flex;
flex-direction: column;
align-items: center;
.timeline-dot {
width: 14px;
height: 14px;
border-radius: 50%;
background-color: #409eff;
z-index: 1;
box-shadow: 0 0 0 3px rgba(64, 158, 255, 0.2);
}
.timeline-line {
position: absolute;
top: 14px;
bottom: -30px;
width: 2px;
background-color: #e4e7ed;
}
.my-timeline-item:last-child .timeline-line {
display: none;
}
}自定义时间戳
Timeline 组件支持通过插槽自定义时间戳:
vue
<MYTimelineItem timestamp="2023-01-01">
<template #timestamp>
<span class="custom-timestamp">自定义时间</span>
</template>
内容
</MYTimelineItem>扩展性设计
Timeline 组件具备良好的扩展性:
- 布局切换:通过 direction 属性控制时间轴方向
- 节点自定义:通过 color 属性自定义节点颜色
- 插槽支持:通过插槽机制支持自定义时间戳和内容
- 样式定制:通过 style属性自定义内联样式
样式细节
Timeline 组件在样式处理上有以下特点:
- 响应式设计:支持灵活的布局适配
- 一致性:与组件库其他组件保持样式一致性
- 无障碍设计:确保时间序列信息对屏幕阅读器友好
- 清晰的视觉层次:通过节点、连接线和时间戳创建清晰的视觉层次
性能优化
通过以下方式优化性能:
- 使用简单的 CSS 实现连接线效果
- 避免不必要的重排和重绘
- 使用 Vue 3 Composition API 提高运行效率
- 保持组件逻辑简单,减少计算量
设计价值
Timeline 组件延续了我们组件库的设计哲学:
- 关注点分离:结构、样式、逻辑完全解耦
- 简洁明了:提供最核心的功能,避免过度设计
- 易于维护:清晰的代码结构和命名规范
- 可扩展性强:支持丰富的定制选项
- 一致性:与 Card、List 等其他组件保持一致的设计语言