基础组件
目录
- 简介
- 项目结构
- 核心组件概览
- BaseInput 组件详解
- BaseConfigSelect 组件详解
- BaseConfigProvider 配置提供者
- 组件集成架构
- 国际化与多语言支持
- 性能优化策略
- 开发建议
- 故障排除
- 总结
简介
lmes-web-base 使用 Vue 3 和 TypeScript,提供表单输入、选择器、表格等 MES 基础 UI 组件,并集成 Element Plus 和 Arco Design。
本组件库的核心设计理念是:
- 统一性:提供一致的用户体验和视觉风格
- 可扩展性:支持自定义配置和主题定制
- 国际化:内置多语言支持,适应全球化需求
- 无障碍访问:遵循 WCAG 标准,确保可访问性
- 高性能:优化的渲染机制和内存管理
项目结构
图表来源
src/components/index.ts
章节来源
src/components/index.tspackage.json
核心组件概览
组件分类体系
图表来源
src/components/BaseInput/BaseInput.tsxsrc/components/BaseConfigSelect/BaseConfigSelect.tsxsrc/components/DyForm/DyForm.tsx
主要依赖关系
图表来源
package.json
章节来源
package.json
BaseInput 组件详解
设计理念与封装机制
BaseInput 是一个高度封装的基础输入组件,它在 Element Plus 的 el-input 基础上进行了深度定制,提供了更丰富的交互能力和更好的用户体验。
核心特性
- 双向绑定支持:通过 v-model 实现数据的双向绑定
- 事件冒泡控制:智能的事件传播管理
- 键盘事件处理:支持 Enter 键触发特定事件
- 国际化适配:自动翻译占位符文本
- 样式隔离:使用 SCSS 模块化避免样式污染
Props 接口定义
interface BaseInputProps {
modelValue: string | number; // 双向绑定值
placeholder: string; // 输入提示文本
readOnly: boolean; // 只读状态
disabled: boolean; // 禁用状态
LanguageScopeKey: string; // 国际化作用域
onChange: Function; // 值变化回调
onEnter: Function; // Enter键按下回调
}
事件回调机制
图表来源
src/components/BaseInput/BaseInput.tsx
插槽使用规范
虽然 BaseInput 当前主要作为基础输入组件使用,但其设计预留了插槽扩展能力:
// 插槽定义示例
interface BaseInputSlots {
prefix?: VNode; // 输入框前缀内容
suffix?: VNode; // 输入框后缀内容
prepend?: VNode; // 输入框前置内容
append?: VNode; // 输入框后置内容
}
样式定制方案
BaseInput 使用 SCSS 模块化设计,提供了完整的样式定制能力:
.baseInput {
width: 100%;
height: 100%;
display: flex;
justify-content: flex-start;
align-items: center;
.input {
border-radius: 4px;
padding: 0 6px;
height: calc(100% - 6px);
border: 1px solid transparent;
transition: all 0.1s ease-in;
&:focus {
border: 1px solid #5a84ff;
}
}
}
章节来源
src/components/BaseInput/BaseInput.tsxsrc/components/BaseInput/BaseInput.module.scss
BaseConfigSelect 组件详解
集成 Element Plus 选择器
BaseConfigSelect 是一个专门用于配置语言选项的选择器组件,它集成了 Element Plus 的 el-select 组件并进行了本地化定制。
功能特性
- 动态选项加载:从 API 获取语言配置列表
- 默认选项支持:包含跟随系统和原始文本选项
- 实时语言切换:支持运行时语言环境变更
- 项目级配置:可扩展支持项目级别的配置管理
数据流架构
图表来源
src/components/BaseConfigSelect/BaseConfigSelect.tsx
代码实现分析
// 关键方法解析
const getOptions = async () => {
const resp = await request.get('/api/v1/multiplelanguage/languagelist')
const defaultOptions = [
{
id: 0,
languageType: 'auto',
enable: true,
createDateTime: new Date().toDateString(),
name: '跟随系统',
},
{
id: 0,
languageType: 'original',
enable: true,
createDateTime: new Date().toDateString(),
name: '原始文本',
},
]
options.value.push(...defaultOptions, ...resp)
langValue.value = options.value?.[0]?.languageType
}
章节来源
src/components/BaseConfigSelect/BaseConfigSelect.tsxsrc/components/BaseConfigSelect/BaseConfigSelect.module.scss
BaseConfigProvider 配置提供者
Element Plus 命名空间配置
BaseConfigProvider 是一个轻量级的配置提供者组件,主要用于设置 Element Plus 组件的命名空间,确保组件在不同项目环境下的正确渲染。
核心功能
- 命名空间注入:自动注入 VITE_APP_NAMESPACE 环境变量
- 配置传递:将配置信息传递给子组件
- 主题一致性:确保整个应用的主题一致性
实现原理
export default defineComponent({
setup(props, { attrs, slots }) {
const namespace = import.meta.env.VITE_APP_NAMESPACE
return () => {
return (
<el-config-provider {...attrs} namespace={namespace}>
{slots.default?.()}
</el-config-provider>
)
}
},
})
章节来源
src/components/BaseConfigProvider/BaseConfigProvider.tsx
组件集成架构
DyForm 表单引擎
DyForm 是动态表单组件,支持多种输入类型和表单布局。
支持的输入类型
图表来源
src/components/DyForm/DyForm.tsx
表单验证集成
DyForm 内置了完整的表单验证机制:
const validate = () => {
if (!formRef.value) return false
return new Promise((resolve, reject) => {
formRef.value?.validate((valid: boolean) => {
if (valid) {
resolve(true)
} else {
reject(false)
}
})
})
}
BaseTable 表格组件
BaseTable 是一个基于 Arco Design 的增强型表格组件,提供了丰富的功能和灵活的配置选项。
核心功能特性
- 虚拟滚动:支持大数据量表格的高性能渲染
- 列拖拽排序:可配置的列顺序调整功能
- 行选择:多选、单选模式支持
- 自定义列渲染:支持插槽和自定义渲染函数
- 响应式布局:自动适配不同屏幕尺寸
性能优化策略
图表来源
src/components/BaseTable/BaseTable.tsx
章节来源
src/components/DyForm/DyForm.tsxsrc/components/BaseTable/BaseTable.tsx
国际化与多语言支持
语言管理系统
lmes-web-base 提供了完整的国际化支持,基于 SDK 的 Language 模块实现。
语言配置结构
interface LanguageConfig {
lang: Record<string, any>; // 语言映射对象
key: string; // 语言标识符
followLang: string; // 跟随的语言设置
}
多语言支持流程
图表来源
src/libs/Language/Language.ts
语言切换机制
export const getLang = (key: string) => {
const langMap: Record<string, any> = {
'en-US': EN,
th: TH,
'zh-CN': ZH,
original: ZH,
}
const langKey: Record<string, string> = {
'en-US': 'EN',
th: 'TH',
'zh-CN': 'ZH',
original: 'ZH',
}
return {
lang: langMap[key] || ZH,
key: langKey[key],
}
}
章节来源
src/libs/Language/Language.ts
性能优化策略
懒加载与按需导入
虚拟滚动在大型表单场景下的应用策略
场景识别
- 大数据量表格:超过 1000 行的数据
- 复杂表单布局:包含大量嵌套字段的表单
- 移动端应用:内存受限的移动设备
实施策略
// 虚拟滚动配置示例
const virtualListProps = {
height: autoHeight.value, // 可视区域高度
itemHeight: 48, // 每行高度
buffer: 20, // 缓冲区大小
threshold: 100, // 触发阈值
}
性能监控指标
- 首次渲染时间:< 200ms
- 内存占用:稳定在 50MB 以下
- 滚动流畅度:FPS > 60
- CPU 使用率:< 30%
开发建议
响应式数据流实现
组合式API使用模式
// 响应式状态管理
const useFormState = () => {
const formData = ref({})
const loading = ref(false)
const errors = ref({})
const updateField = (field: string, value: any) => {
set(formData.value, field, value)
}
return {
formData,
loading,
errors,
updateField,
}
}
表单验证集成
// 验证规则定义
const validationRules = {
required: {
required: true,
message: '此字段为必填项',
},
email: {
type: 'email',
message: '请输入有效的邮箱地址',
},
minLength: (min: number) => ({
min,
message: `至少需要 ${min} 个字符`,
}),
}
常见使用误区与解决方案
误区 1:直接修改 props
// ❌ 错误做法
const handleChange = (value: string) => {
props.modelValue = value // 直接修改props
}
// ✅ 正确做法
const handleChange = (value: string) => {
emit('update:modelValue', value) // 通过emit更新父组件
}
误区 2:忽略错误处理
// ❌ 错误做法
const fetchData = async () => {
const data = await api.getData()
return data
}
// ✅ 正确做法
const fetchData = async () => {
try {
const data = await api.getData()
return data
} catch (error) {
console.error('数据加载失败:', error)
throw error
}
}
误区 3:过度使用全局状态
// ❌ 错误做法
const globalState = useGlobalState()
// ✅ 正确做法
const localState = useLocalState()
const parentState = inject('parentState')
故障排除
常见问题诊断
组件样式不生效
症状:组件显示异常或样式丢失
排查步骤:
- 检查 SCSS 文件是否正确导入
- 验证 CSS Modules 配置
- 确认主题变量是否正确设置
解决方案:
// 确保正确的样式导入
@import '~lmes-web-base/dist/style.css';
// 或使用模块化导入
import styles from './MyComponent.module.scss';
国际化文本不显示
症状:组件中的文本未正确翻译
排查步骤:
- 检查 LanguageScopeKey 是否正确设置
- 验证语言包是否正确加载
- 确认 _t 函数调用位置
解决方案:
// 在组件中正确使用国际化
const _t = getScopeT(props.LanguageScopeKey)
return _t('component.placeholder.text')
表单验证失效
症状:表单提交时验证规则不生效
排查步骤:
- 检查验证规则格式是否正确
- 确认 formRef 是否正确绑定
- 验证字段名与验证规则匹配
解决方案:
// 正确的验证规则配置
const formRules = {
username: [
{ required: true, message: '用户名不能为空' },
{ min: 3, max: 20, message: '长度在 3 到 20 个字符' }
]
}
性能问题诊断
渲染性能问题
症状:页面卡顿或响应缓慢
诊断工具:
- Chrome DevTools Performance
- Vue DevTools Profiler
- Memory Timeline
优化策略:
// 使用防抖减少频繁更新
const debouncedUpdate = debounce((value) => {
emit('update:modelValue', value)
}, 300)
// 启用虚拟滚动
<BaseTable
:isVScroll="true"
:autoHeight="true"
/>
总结
lmes-web-base 基础 UI 组件的实现方式包括:
技术优势
- 现代化技术栈:基于 Vue 3 Composition API 和 TypeScript 构建
- 组件化设计:按组件组织代码,便于维护和扩展
- 性能优化:内置虚拟滚动、懒加载等性能优化机制
- 类型安全:完整的 TypeScript 类型定义,提升开发体验
功能特色
- 统一的国际化支持:内置多语言切换和文本管理机制
- 灵活的配置系统:支持主题定制和组件个性化配置
- 完善的表单处理:动态表单生成和验证机制
- 丰富的交互体验:支持键盘导航、无障碍访问等功能
应用价值
- 提高开发效率:标准化的组件接口和使用方式
- 保证代码质量:统一的设计规范和开发建议
- 降低维护成本:清晰的组件职责和依赖关系
- 提升用户体验:一致的交互模式和视觉效果
通过合理使用这些基础组件,开发者可以快速构建出高质量的 MES 系统界面,同时确保代码的可维护性和扩展性。随着项目的不断发展,这些基础组件也将持续演进,为用户提供更好的开发体验和产品体验。