# Bricks UI 组件技术文档 > **版本**: 1.0 > **作者**: Bricks Framework Team > **描述**: `bricks.UiType` 及其子类构成了一套用于构建表单输入控件的组件体系,支持文本、密码、数字、日期、文件上传、选择框等多种输入类型。所有组件均继承自统一基类 `bricks.UiType`,并可通过工厂模式动态创建。 --- ## 目录 - [概述](#概述) - [核心基类](#核心基类) - [`bricks.UiType`](#bricksuitype) - [`bricks.UiHide`](#bricksuihide) - [基础输入控件](#基础输入控件) - [`bricks.UiStr`](#bricksuistr) - [`bricks.UiPassword`](#bricksuipassword) - [`bricks.UiInt`](#bricksuiint) - [`bricks.UiFloat`](#bricksuifloat) - [`bricks.UiTel`](#bricksuitel) - [`bricks.UiEmail`](#bricksuiemail) - [`bricks.UiDate`](#bricksuidate) - [`bricks.UiText`](#bricksuitext) - [`bricks.UiCode`](#bricksuicode) - [复合与特殊控件](#复合与特殊控件) - [`bricks.UiCheck`](#bricksuicheck) - [`bricks.UiCheckBox`](#bricksuicheckbox) - [`bricks.UiSearch`](#bricksuisearch) - [多媒体输入控件](#多媒体输入控件) - [`bricks.UiFile`](#bricksuifile) - [`bricks.UiImage`](#bricksuiimage) - [`bricks.UiAudio`](#bricksuiaudio) - [`bricks.UiVideo`](#bricksuivideo) - [工厂系统](#工厂系统) - [`bricks._Input`](#bricks_input) - [`Input` 工厂实例](#input-工厂实例) --- ## 概述 该模块提供了一个可扩展的 UI 输入组件框架,基于 JavaScript 类和 DOM 封装,实现以下特性: - 统一接口:所有输入控件都实现了 `getValue()`, `setValue()`, `reset()`, `resultValue()` 等方法。 - 表单集成:支持通过 `set_formdata(formData)` 方法将值附加到 `FormData` 对象中。 - 值校验与格式化:通过正则表达式(`pattern`)进行输入过滤。 - 动态数据加载:如 `UiCode` 和 `UiCheckBox` 支持从 URL 异步加载选项数据。 - 用户交互事件:支持 `focus`, `blur`, `changed`, `keydown` 等事件绑定。 - 国际化支持:标签文本使用 `bricks.app.i18n._()` 进行翻译。 - 多媒体录制支持:图像、音频、视频可通过摄像头/麦克风直接采集。 --- ## 核心基类 ### `bricks.UiType` **继承自**: `bricks.Layout` **用途**: 所有输入控件的抽象基类,定义通用行为。 #### 构造函数 ```js new bricks.UiType(opts) ``` | 参数 | 类型 | 必需 | 描述 | |------|------|------|------| | `opts.name` | String | 是 | 控件名称(对应表单字段名) | | `opts.value` / `opts.defaultvalue` | Any | 否 | 初始值或默认值 | | `opts.required` | Boolean | 否 | 是否为必填项 | #### 属性 | 属性 | 类型 | 描述 | |------|------|------| | `name` | String | 字段名称 | | `value` | Any | 当前值 | | `required` | Boolean | 是否必填 | | `ctype` | String | 内部类型标识,默认 `'text'` | | `dom_element` | HTMLElement | 渲染后的 DOM 元素 | #### 方法 | 方法 | 说明 | |------|------| | `getValue()` → Object | 返回 `{ name: value }`,若存在用户数据则合并返回 | | `set_formdata(formData)` | 将当前值添加到 `FormData` 中 | | `resultValue()` → Any | 获取实际提交值(子类重写) | | `focus()` | 聚焦输入元素 | | `reset()` | 重置为初始值 | | `setValue(v)` | 设置值并更新 DOM | | `set_disabled(f)` | 设置禁用状态 | | `set_readonly(f)` | 设置只读状态 | | `set_required(f)` | 设置是否必填 | --- ### `bricks.UiHide` **继承自**: `bricks.UiType` **用途**: 隐藏字段,不显示但可携带数据。 #### 特性 - `uitype = 'hide'` - 自动设置 `display: none` 样式 #### 示例 ```js new bricks.UiHide({ name: 'user_id', value: '12345' }) ``` --- ## 基础输入控件 ### `bricks.UiStr` **继承自**: `bricks.UiType` **用途**: 单行文本输入框。 #### 支持配置项 (`opts`) | 属性 | 类型 | 说明 | |------|------|------| | `align` | String | 文本对齐方式:`left`, `center`, `right` | | `length` | Number | 最大字符数(maxlength) | | `minlength` | Number | 最小字符数 | | `tip` | String | 提示信息(暂未使用) | | `width` | String | 宽度(CSS 单位) | | `readonly` | Boolean/String | 是否只读 | | `required` | Boolean | 是否必填 | | `placeholder` | String | 占位符文本(自动国际化) | | `css` | String | 自定义 CSS 类名 | | `dynsize` | Boolean | 是否启用动态字体适配 | | `cfontsize` | Number | 字体缩放比例 | #### 方法扩展 - `create()`:创建 `` - `check_pattern(value)`:用正则校验输入 - `set_value_from_input(event)`:输入时触发值更新与事件派发 - `onfocus/onblur`:焦点处理,添加高亮样式 #### 示例 ```js new bricks.UiStr({ name: 'username', placeholder: 'Enter your username', required: true, width: '200px' }) ``` --- ### `bricks.UiPassword` **继承自**: `bricks.UiStr` **用途**: 密码输入框。 #### 特性 - `type="password"` - `uitype='password'` #### 示例 ```js new bricks.UiPassword({ name: 'password', placeholder: '******' }) ``` --- ### `bricks.UiInt` **继承自**: `bricks.UiStr` **用途**: 整数输入。 #### 特性 - `type="number"` - `textAlign: right` - 正则匹配:`\d*` - `resultValue()` 返回 `parseInt(value)` #### 示例 ```js new bricks.UiInt({ name: 'age', length: 3 }) ``` --- ### `bricks.UiFloat` **继承自**: `bricks.UiInt` **用途**: 浮点数输入。 #### 特性 - 正则匹配:`\d*\.?\d+` - 支持小数位控制(`dec_len`) - 自动设置 `step` 属性以限制精度 | 参数 | 默认值 | 说明 | |------|--------|------| | `dec_len` | 2 | 小数位数 | #### 示例 ```js new bricks.UiFloat({ name: 'price', dec_len: 2 }) ``` --- ### `bricks.UiTel` **继承自**: `bricks.UiStr` **用途**: 电话号码输入。 #### 特性 - `type="tel"` - 默认正则:`[+]?\\d+` - 支持自定义 `pattern` #### 示例 ```js new bricks.UiTel({ name: 'phone', pattern: '[0-9]{11}' }) ``` --- ### `bricks.UiEmail` **继承自**: `bricks.UiStr` **用途**: 邮箱地址输入。 #### 特性 - `type="email"` - 可选自定义 `pattern` #### 示例 ```js new bricks.UiEmail({ name: 'email', required: true }) ``` --- ### `bricks.UiDate` **继承自**: `bricks.UiStr` **用途**: 日期选择器。 #### 支持配置 | 属性 | 说明 | |------|------| | `max_date` | 最大允许日期(字符串格式 YYYY-MM-DD) | | `min_date` | 最小允许日期 | #### 特性 - `type="date"` - 若值为空,`resultValue()` 返回 `null` #### 示例 ```js new bricks.UiDate({ name: 'birth_date', min_date: '1900-01-01', max_date: '2024-12-31' }) ``` --- ### `bricks.UiText` **继承自**: `bricks.UiType` **用途**: 多行文本域(textarea)。 #### 支持配置 | 属性 | 类型 | 说明 | |------|------|------| | `rows` | Number | 行数 | | `cols` | Number | 列数 | | `height` | String | 高度(默认 `'200px'`) | #### 特性 - 支持 Tab 缩进(每 4 空格) - Shift+Tab 删除缩进 - Enter 换行(阻止默认行为) - 支持代码编辑风格缩进逻辑 #### 方法 | 方法 | 说明 | |------|------| | `handle_tab_indent(erase)` | 处理 Tab 缩进或反向删除 | | `handle_enter()` | 插入换行并保持光标位置 | #### 示例 ```js new bricks.UiText({ name: 'description', rows: 6, cols: 50 }) ``` --- ### `bricks.UiCode` **继承自**: `bricks.UiType` **用途**: 下拉选择框(类似 `` - 支持 `set_input_file(files)` 手动设置文件列表 #### 方法 | 方法 | 说明 | |------|------| | `handleFileSelect()` | 处理文件选择 | | `dropHandle()` | 处理拖放事件 | | `resultValue()` | 返回 File 或 FileList | #### 示例 ```js new bricks.UiFile({ name: 'attachment', accept: 'application/pdf', multiple: true }) ``` --- ### `bricks.UiImage` **继承自**: `bricks.UiFile` **用途**: 图像上传 + 拍照功能。 #### 特性 - `accept='image/'` - 添加拍照按钮(调用 `SysCamera`) - 支持预览上传或拍摄的图片(`show_image()`) #### 方法 | 方法 | 说明 | |------|------| | `take_photo()` | 打开相机 | | `accept_photo()` | 接收拍摄结果 | | `_show_image(file)` | 显示图片预览(URL 或 Blob) | #### 示例 ```js new bricks.UiImage({ name: 'avatar' }) ``` --- ### `bricks.UiAudio` **继承自**: `bricks.UiFile` **用途**: 音频上传 + 录音功能。 #### 特性 - `accept='audio/'` - 添加录音按钮(调用 `SysAudioRecorder`) - 支持播放预览(`AudioPlayer`) #### 方法 | 方法 | 说明 | |------|------| | `open_recorder()` | 打开录音器 | | `accept_audio()` | 接收录音文件 | | `_show_audio(file)` | 显示音频播放器 | #### 示例 ```js new bricks.UiAudio({ name: 'voice_note' }) ``` --- ### `bricks.UiVideo` **继承自**: `bricks.UiFile` **用途**: 视频上传 + 录制功能。 #### 特性 - `accept='video/'` - 添加录像按钮(调用 `SysVideoRecorder`) - 支持视频预览(`VideoPlayer`) #### 方法 | 方法 | 说明 | |------|------| | `open_recorder()` | 打开录像器 | | `accept_video()` | 接收录像文件 | | `_show_video(file)` | 显示视频播放器 | #### 示例 ```js new bricks.UiVideo({ name: 'demo_video' }) ``` --- ## 工厂系统 ### `bricks._Input` **用途**: 输入控件工厂类,用于注册和创建 UI 组件。 #### 方法 | 方法 | 说明 | |------|------| | `register(name, uitype, Klass)` | 注册组件类 | | `factory(options)` | 根据 `uitype` 创建实例 | #### 示例 ```js const factory = new bricks._Input(); factory.register('UiStr', 'str', bricks.UiStr); const input = factory.factory({ uitype: 'str', name: 'title' }); ``` --- ### `Input` 工厂实例 全局已初始化的工厂对象,预注册了所有标准控件。 #### 已注册映射表 | 名称 (name) | uitype | 类 | |------------|--------|-----| | `UiStr` | `str` | `bricks.UiStr` | | `UiPassword` | `password` | `bricks.UiPassword` | | `UiInt` | `int` | `bricks.UiInt` | | `UiFloat` | `float` | `bricks.UiFloat` | | `UiTel` | `tel` | `bricks.UiTel` | | `UiEmail` | `email` | `bricks.UiEmail` | | `UiDate` | `date` | `bricks.UiDate` | | `UiText` | `text` | `bricks.UiText` | | `UiCode` | `code` | `bricks.UiCode` | | `UiCheck` | `check` | `bricks.UiCheck` | | `UiCheckBox` | `checkbox` | `bricks.UiCheckBox` | | `UiFile` | `file` | `bricks.UiFile` | | `UiImage` | `image` | `bricks.UiImage` | | `UiAudio` | `audio`, `audiorecorder` | `bricks.UiAudio` | | `UiVideo` | `video` | `bricks.UiVideo` | | `UiSearch` | `search` | `bricks.UiSearch` | | `UiHide` | `hide` | `bricks.UiHide` | #### 使用方式 ```js const field = Input.factory({ uitype: 'email', name: 'contact_email' }); ``` --- ## 总结 本组件库提供了完整且可扩展的前端表单输入解决方案,具备以下优势: ✅ 统一 API 接口 ✅ 支持异步数据加载 ✅ 多媒体采集支持 ✅ 可定制样式与行为 ✅ 支持国际化 ✅ 事件驱动架构 适用于构建复杂的表单页面、数据录入系统、移动端 Web 应用等场景。 --- > ✅ **提示**:建议结合 `bricks.Layout`、`bricks.HBox`/`VBox` 布局容器组织表单结构。 > 📁 **资源路径**:图标资源位于 `imgs/` 目录下,需确保正确部署。