Appearance
表单组件体系与数据交互
本文档引用文件
目录
简介
本文档深入解析移动端表单组件体系,重点分析 tm-form 与 tm-input 的实现机制。涵盖表单验证规则配置、错误提示机制、提交流程控制,以及 validator.ts 中验证逻辑的实现方式。同时对比 tm-input 原生组件与 CustomInput 自定义组件在属性传递、事件处理和样式控制方面的差异,并提供表单数据双向绑定、动态字段渲染和复杂表单布局的最佳实践。
项目结构
项目采用模块化结构,主要分为 codegen、deno、pc 和 uni 四个模块。其中 uni 模块包含移动端核心组件,位于 uni/src/uni_modules/tm-ui/components 目录下,主要包括 tm-form、tm-input 等表单相关组件。
图示来源
本节来源
核心组件
核心组件包括 tm-form、tm-input 和 CustomInput。tm-form 负责表单整体管理与验证,tm-input 提供基础输入功能,CustomInput 则是基于 tm-input 的封装,增加只读模式等特性。
本节来源
架构概览
系统采用分层架构,tm-form 作为容器组件,通过 provide/inject 向下传递表单状态和验证方法。tm-input 作为原子组件,处理用户输入并触发事件。CustomInput 在其基础上扩展功能,适配不同平台需求。
图示来源
详细组件分析
tm-form 组件分析
tm-form 组件负责管理整个表单的验证流程。其核心功能包括:
- 表单验证规则配置:通过
rules属性统一配置所有字段的验证规则,支持嵌套对象(使用点号连接)。 - 错误提示机制:通过
provide向子组件传递验证状态,子组件根据状态显示错误信息。 - 提交流程控制:调用
submit()方法触发验证,并通过emit("submit")返回验证结果。
图示来源
验证逻辑实现
validator.ts 文件中的 defaultValidator 函数是验证的核心。它根据规则类型(type)执行不同的验证逻辑:
required: 检查值是否为空。type: 支持number、string、array、date、phone、email等类型校验。min/max: 检查数值、字符串长度或数组长度。validator: 支持自定义验证函数。rule: 支持正则表达式校验。
图示来源
本节来源
tm-input 与 CustomInput 组件对比分析
tm-input 是基础输入组件,CustomInput 是其在不同平台的封装。
属性传递
tm-input:通过_attrs计算属性接收所有属性,支持丰富的输入类型(text,number,textarea等)。CustomInput:通过props明确定义所需属性,并将未定义的属性通过v-bind="$attrs"传递给内部的tm-input或el-input。
事件处理
tm-input:直接监听原生input、blur、focus等事件,并通过emits触发自定义事件。CustomInput:在tm-input事件基础上,增加onChange、onClear等处理逻辑,并支持Decimal类型的精度控制。
样式控制
tm-input:使用内联样式和计算属性动态控制颜色、字体、圆角等。CustomInput:通过un-*工具类和:deep()选择器控制样式,并支持只读模式下的不同外观。
图示来源
本节来源
依赖分析
组件间依赖关系清晰,tm-form 依赖 validator.ts 进行验证,CustomInput 依赖 tm-input 实现基础功能。provide/inject 机制降低了组件间的耦合度。
图示来源
本节来源
性能考量
- 避免重复计算:
tm-form中使用computed缓存验证规则,减少重复计算。 - 合理使用 watch:
CustomInput中使用watch同步props和modelValue,避免不必要的更新。 - 虚拟滚动:对于长列表表单,建议使用虚拟滚动技术提升性能。
故障排除指南
- 表单不触发验证:检查字段是否被正确标记(
_setMarker),确保name属性与rules中的键名匹配。 - 输入框样式异常:检查
uni平台的styleIsolation配置,确保样式隔离正确。 - 只读模式显示异常:确认
readonly属性正确传递,且readonlyPlaceholder有值。
本节来源
结论
tm-form 与 tm-input 组件体系设计合理,验证机制灵活高效。CustomInput 的封装提升了组件的复用性和可维护性。建议在复杂表单场景中充分利用 provide/inject 和计算属性优化性能。