Input 组件设计
概述
Input 组件是本组件库中用于数据输入的基础表单组件。它延续了我们组件库一贯的设计理念,采用"关注点分离"和"逻辑抽象"的原则,通过 useClassComputed 和 useStyleComputed等核心 Hooks 实现了强大而灵活的输入框控制功能。
Input 组件专注于处理用户的文本输入操作,为用户提供了一套完整且易用的数据录入解决方案,支持多种输入类型、状态控制和交互功能。
设计理念
分层架构
Input 组件严格按照三层架构设计:
- 结构层 input.vue - 负责组件的 DOM 结构和基本布局
- 逻辑层 inputComputed.ts - 通过 Hooks 处理复杂的响应式计算
- 表现层 input.scss - 定义组件的视觉呈现和样式规则
逻辑抽象
Input 组件将复杂的样式逻辑抽象为多个核心 Hooks:
- useClassComputed - 处理动态类名生成
- useStyleComputed - 处理动态样式生成
这种设计使得组件本身只需要声明所需逻辑,而具体的计算由 Hooks 完成。
核心功能设计
Props 结构化设计
Input 组件的 props 按照功能划分为多个逻辑组:
typescript
// 输入类型与标签
const typeAndTagProps = {
type: {
type: String as PropType<string>,
default: 'text'
},
tag: {
type: String as PropType<string>,
default: 'input'
},
textColor: {
type: String as PropType<string>,
default: ''
}
}
// 尺寸相关
const sizeProps = {
width: {
type: [String, Number] as PropType<string | number>,
default: '100%'
},
height: {
type: [String, Number] as PropType<string | number>,
default: '30px'
}
}
// 状态控制
const stateProps = {
disabled: {
type: Boolean,
default: false
},
clearable: {
type: Boolean,
default: false
},
showPassword: {
type: Boolean,
default: false
}
}这种分组方式使得代码结构更加清晰,也方便后续的功能扩展。
输入类型支持
Input 组件支持多种输入类型:
- 文本输入 - 默认的文本输入框
- 密码输入 - 支持密码可见性切换
- 多行文本 - 通过
tag="textarea"实现 - 数字输入 - 通过
type="number"实现
状态控制功能
Input 组件提供了丰富的状态控制功能:
- 清空功能 - 通过 clearable 属性启用清空按钮
- 密码可见性切换 - 通过 showPassword 属性启用密码可见性切换
- 禁用状态 - 通过 disabled 属性控制禁用状态
- 字数统计 - 通过 wordLimit 和 maxlength 属性实现字数统计
样式系统设计
CSS 变量控制
Input 组件通过 CSS 变量实现样式控制:
--my-input-placeholder- 占位符颜色控制
尺寸控制
Input 组件支持灵活的尺寸控制:
- 宽度控制 - 支持像素值、百分比等单位
- 高度控制 - 支持像素值、百分比等单位
状态样式
Input 组件根据不同状态提供相应的样式:
- 默认状态 - 标准输入框样式
- 聚焦状态 - 聚焦时的边框和阴影效果
- 悬停状态 - 鼠标悬停时的边框效果
- 禁用状态 - 禁用时的半透明效果
组件结构设计
Input 组件采用包装器模式设计:
html
<div class="my-input-wrapper">
<component :is="props.tag" class="my-input" />
<div v-if="hasAnySuffix" class="my-input__suffix">
<!-- 后缀图标 -->
</div>
</div>这种设计允许组件支持多种输入类型(input、textarea等),并通过后缀区域显示功能图标。
交互设计
清空功能
Input 组件支持一键清空功能:
- 鼠标悬停时显示清空按钮
- 点击清空按钮清除输入内容
- 清空后自动聚焦到输入框
密码可见性切换
Input 组件支持密码可见性切换:
- 点击眼睛图标切换密码可见性
- 通过showView状态控制输入类型
字数统计
Input 组件支持字数统计功能:
- 显示当前输入字符数和最大限制数
- 接近限制时高亮显示
扩展性设计
Input 组件具备良好的扩展性:
- 自定义标签支持:可通过 tag prop 渲染为不同 HTML 元素
- 全面样式控制:支持宽度、高度、文字颜色等完整样式设置
- 状态控制:支持禁用、清空、密码可见性等多种状态控制
- 功能扩展:支持字数统计、占位符颜色等附加功能
- 主题适配:通过 CSS 变量支持主题定制
样式细节
Input 组件在样式处理上有以下特点:
- 标准化设计:采用业界标准的输入框样式
- 响应式设计:支持灵活的宽高控制
- 交互反馈:提供聚焦、悬停等交互状态反馈
- 无障碍设计:支持键盘导航和屏幕阅读器
- 图标布局:通过后缀区域合理布局功能图标
性能优化
通过以下方式优化性能:
- 使用 computed 属性缓存计算结果
- 将复杂逻辑移至独立的 hooks 中
- 避免不必要的重新渲染
- 使用 Vue 3 Composition API 提高运行效率
- 合理使用事件监听器的添加和移除
设计价值
Input 组件延续了我们组件库的设计哲学:
- 关注点分离:结构、样式、逻辑完全解耦
- 高度复用:通过 hooks 抽象通用逻辑
- 易于维护:清晰的代码结构和命名规范
- 可扩展性强:支持丰富的定制选项
- 一致性:与 Form、Button 等其他组件保持一致的设计语言