跳到主要内容
版本:Next

基础组件

目录

  1. 简介
  2. 项目结构
  3. 核心组件概览
  4. BaseInput 组件详解
  5. BaseConfigSelect 组件详解
  6. BaseConfigProvider 配置提供者
  7. 组件集成架构
  8. 国际化与多语言支持
  9. 性能优化策略
  10. 最佳实践指南
  11. 故障排除
  12. 总结

简介

lmes-web-base 是一个专为制造执行系统(MES)设计的基础UI组件库,采用 Vue 3 + TypeScript 技术栈构建。该组件库提供了完整的表单输入、选择器、表格等基础UI组件,支持 Element Plus 和 Arco Design 两大主流UI框架的无缝集成。

本组件库的核心设计理念是:

  • 统一性:提供一致的用户体验和视觉风格
  • 可扩展性:支持自定义配置和主题定制
  • 国际化:内置多语言支持,适应全球化需求
  • 无障碍访问:遵循 WCAG 标准,确保可访问性
  • 高性能:优化的渲染机制和内存管理

项目结构

图表来源

章节来源

核心组件概览

组件分类体系

图表来源

主要依赖关系

图表来源

章节来源

BaseInput 组件详解

设计理念与封装机制

BaseInput 是一个高度封装的基础输入组件,它在 Element Plus 的 el-input 基础上进行了深度定制,提供了更丰富的交互能力和更好的用户体验。

核心特性

  1. 双向绑定支持:通过 v-model 实现数据的双向绑定
  2. 事件冒泡控制:智能的事件传播管理
  3. 键盘事件处理:支持 Enter 键触发特定事件
  4. 国际化适配:自动翻译占位符文本
  5. 样式隔离:使用 SCSS 模块化避免样式污染

Props 接口定义

interface BaseInputProps {
modelValue: string | number; // 双向绑定值
placeholder: string; // 输入提示文本
readOnly: boolean; // 只读状态
disabled: boolean; // 禁用状态
LanguageScopeKey: string; // 国际化作用域
onChange: Function; // 值变化回调
onEnter: Function; // Enter键按下回调
}

事件回调机制

图表来源

插槽使用规范

虽然 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;
}
}
}

章节来源

BaseConfigSelect 组件详解

集成 Element Plus 选择器

BaseConfigSelect 是一个专门用于配置语言选项的选择器组件,它集成了 Element Plus 的 el-select 组件并进行了本地化定制。

功能特性

  1. 动态选项加载:从 API 获取语言配置列表
  2. 默认选项支持:包含跟随系统和原始文本选项
  3. 实时语言切换:支持运行时语言环境变更
  4. 项目级配置:可扩展支持项目级别的配置管理

数据流架构

图表来源

代码实现分析

// 关键方法解析
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
}

章节来源

BaseConfigProvider 配置提供者

Element Plus 命名空间配置

BaseConfigProvider 是一个轻量级的配置提供者组件,主要用于设置 Element Plus 组件的命名空间,确保组件在不同项目环境下的正确渲染。

核心功能

  1. 命名空间注入:自动注入 VITE_APP_NAMESPACE 环境变量
  2. 配置传递:将配置信息传递给子组件
  3. 主题一致性:确保整个应用的主题一致性

实现原理

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>
)
}
},
})

章节来源

组件集成架构

DyForm 表单引擎

DyForm 是一个强大的动态表单组件,支持多种输入类型和复杂的表单布局。

支持的输入类型

图表来源

表单验证集成

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 的增强型表格组件,提供了丰富的功能和灵活的配置选项。

核心功能特性

  1. 虚拟滚动:支持大数据量表格的高性能渲染
  2. 列拖拽排序:可配置的列顺序调整功能
  3. 行选择:多选、单选模式支持
  4. 自定义列渲染:支持插槽和自定义渲染函数
  5. 响应式布局:自动适配不同屏幕尺寸

性能优化策略

图表来源

章节来源

国际化与多语言支持

语言管理系统

lmes-web-base 提供了完整的国际化支持,基于 SDK 的 Language 模块实现。

语言配置结构

interface LanguageConfig {
lang: Record<string, any>; // 语言映射对象
key: string; // 语言标识符
followLang: string; // 跟随的语言设置
}

多语言支持流程

图表来源

语言切换机制

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],
}
}

章节来源

性能优化策略

懒加载与按需导入

虚拟滚动在大型表单场景下的应用策略

场景识别

  1. 大数据量表格:超过 1000 行的数据
  2. 复杂表单布局:包含大量嵌套字段的表单
  3. 移动端应用:内存受限的移动设备

实施策略

// 虚拟滚动配置示例
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')

故障排除

常见问题诊断

组件样式不生效

症状:组件显示异常或样式丢失

排查步骤

  1. 检查 SCSS 文件是否正确导入
  2. 验证 CSS Modules 配置
  3. 确认主题变量是否正确设置

解决方案

// 确保正确的样式导入
@import '~lmes-web-base/dist/style.css';

// 或使用模块化导入
import styles from './MyComponent.module.scss';

国际化文本不显示

症状:组件中的文本未正确翻译

排查步骤

  1. 检查 LanguageScopeKey 是否正确设置
  2. 验证语言包是否正确加载
  3. 确认 _t 函数调用位置

解决方案

// 在组件中正确使用国际化
const _t = getScopeT(props.LanguageScopeKey)
return _t('component.placeholder.text')

表单验证失效

症状:表单提交时验证规则不生效

排查步骤

  1. 检查验证规则格式是否正确
  2. 确认 formRef 是否正确绑定
  3. 验证字段名与验证规则匹配

解决方案

// 正确的验证规则配置
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组件库通过精心设计的组件架构,为 MES 系统提供了完整、高效、易用的UI解决方案。其核心优势包括:

技术优势

  1. 现代化技术栈:基于 Vue 3 Composition API 和 TypeScript 构建
  2. 组件化设计:高度模块化的组件结构,便于维护和扩展
  3. 性能优化:内置虚拟滚动、懒加载等性能优化机制
  4. 类型安全:完整的 TypeScript 类型定义,提升开发体验

功能特色

  1. 统一的国际化支持:内置多语言切换和文本管理机制
  2. 灵活的配置系统:支持主题定制和组件个性化配置
  3. 完善的表单处理:动态表单生成和验证机制
  4. 丰富的交互体验:支持键盘导航、无障碍访问等功能

应用价值

  • 提高开发效率:标准化的组件接口和使用方式
  • 保证代码质量:统一的设计规范和最佳实践
  • 降低维护成本:清晰的组件职责和依赖关系
  • 提升用户体验:一致的交互模式和视觉效果

通过合理使用这些基础组件,开发者可以快速构建出高质量的 MES 系统界面,同时确保代码的可维护性和扩展性。随着项目的不断发展,这些基础组件也将持续演进,为用户提供更好的开发体验和产品体验。