|
| 1 | +# 表单助手 |
| 2 | + |
| 3 | +表单助手(FormHelper)用于更方便地对表单内控件的值进行读取和修改。它会自动在指定的表单容器内按照 `name`、`id` 或自定义属性查找表单字段,并且支持与 Picker 等 ZUI 组件集成,统一读写接口。 |
| 4 | + |
| 5 | +## 创建实例 |
| 6 | + |
| 7 | +通过 `new FormHelper(selector, options?)` 或工厂函数 `formHelper(selector, options?)` 创建实例。`selector` 为表单容器的选择器或 DOM 元素。 |
| 8 | + |
| 9 | +```js |
| 10 | +// 使用类构造器 |
| 11 | +const helper = new zui.FormHelper('#myForm'); |
| 12 | + |
| 13 | +// 使用工厂函数 |
| 14 | +const helper = zui.formHelper('#myForm'); |
| 15 | +``` |
| 16 | + |
| 17 | +## 获取字段值 |
| 18 | + |
| 19 | +使用 `getFieldVal(query)` 方法获取指定字段的值。`query` 为字段名、ID 或 CSS 选择器。如果字段关联了自定义控件(如 Picker),会通过控件接口获取值。 |
| 20 | + |
| 21 | +```js |
| 22 | +const helper = zui.formHelper('#myForm'); |
| 23 | + |
| 24 | +// 获取 name="username" 的字段值 |
| 25 | +const username = helper.getFieldVal('username'); |
| 26 | + |
| 27 | +// 获取 name="fruit" 关联的 Picker 控件的值 |
| 28 | +const fruit = helper.getFieldVal('fruit'); |
| 29 | +``` |
| 30 | + |
| 31 | +## 设置字段值 |
| 32 | + |
| 33 | +使用 `setFieldVal(query, value)` 方法设置指定字段的值。如果字段关联了自定义控件,会通过控件接口设置值。当字段未找到且 `throwError` 为 `true`(默认)时会抛出错误。 |
| 34 | + |
| 35 | +```js |
| 36 | +const helper = zui.formHelper('#myForm'); |
| 37 | + |
| 38 | +helper.setFieldVal('username', '张三'); |
| 39 | +helper.setFieldVal('fruit', 'apple'); |
| 40 | +``` |
| 41 | + |
| 42 | +## 批量设置表单数据 |
| 43 | + |
| 44 | +使用 `setFormData(data)` 方法一次性设置多个字段的值。 |
| 45 | + |
| 46 | +```js |
| 47 | +const helper = zui.formHelper('#myForm'); |
| 48 | + |
| 49 | +helper.setFormData({ |
| 50 | + username: '张三', |
| 51 | + email: 'zhangsan@example.com', |
| 52 | + fruit: 'banana', |
| 53 | +}); |
| 54 | +``` |
| 55 | + |
| 56 | +## 获取字段信息 |
| 57 | + |
| 58 | +使用 `getFieldInfo(query)` 方法获取字段的完整信息,返回一个 `FormField` 对象,包含字段的 DOM 元素、名称、当前值以及关联的控件信息。 |
| 59 | + |
| 60 | +```js |
| 61 | +const helper = zui.formHelper('#myForm'); |
| 62 | + |
| 63 | +const info = helper.getFieldInfo('username'); |
| 64 | +if (info) { |
| 65 | + console.log(info.name); // 字段 name 属性 |
| 66 | + console.log(info.value); // 字段当前值 |
| 67 | + console.log(info.$field); // Cash 封装的 DOM 元素 |
| 68 | + console.log(info.control); // 关联的控件信息(如 Picker),无控件时为 undefined |
| 69 | +} |
| 70 | +``` |
| 71 | + |
| 72 | +## 字段查询规则 |
| 73 | + |
| 74 | +`query` 参数按以下优先级查找字段: |
| 75 | + |
| 76 | +1. 如果 `query` 以 `#`、`.` 或 `[` 开头,直接作为 CSS 选择器查找; |
| 77 | +2. 查找 `[zui-form-field="query"]` 属性的元素; |
| 78 | +3. 查找 `[name="query"]` 属性的元素; |
| 79 | +4. 当 `matchID` 为 `true`(默认)时,查找 `#query` 的元素; |
| 80 | +5. 当 `matchBrackets` 为 `true`(默认)且 `query` 不含 `[` 时,查找 `[name="query[]"]` 或 `[name^="query["]` 的元素。 |
| 81 | + |
| 82 | +## 自定义字段查找 |
| 83 | + |
| 84 | +通过 `fields` 选项可以自定义字段的查找逻辑,支持函数或按字段名映射的对象。 |
| 85 | + |
| 86 | +```js |
| 87 | +const helper = zui.formHelper('#myForm', { |
| 88 | + fields: { |
| 89 | + customField: (query, $scope) => { |
| 90 | + // 返回 Cash 对象、FormField 对象或 false(忽略该字段) |
| 91 | + return $scope.find('.my-custom-input'); |
| 92 | + }, |
| 93 | + }, |
| 94 | +}); |
| 95 | +``` |
| 96 | + |
| 97 | +也可以使用统一的查找函数处理所有字段: |
| 98 | + |
| 99 | +```js |
| 100 | +const helper = zui.formHelper('#myForm', { |
| 101 | + fields: (query, $scope) => { |
| 102 | + return $scope.find(`[data-field="${query}"]`); |
| 103 | + }, |
| 104 | +}); |
| 105 | +``` |
| 106 | + |
| 107 | +## 注册全局控件 |
| 108 | + |
| 109 | +通过 `FormHelper.registerControl(type, finder)` 可注册全局的自定义控件查找器,适用于所有 `FormHelper` 实例。 |
| 110 | + |
| 111 | +```js |
| 112 | +zui.FormHelper.registerControl('myControl', ($field, $scope) => { |
| 113 | + const $el = $field.closest('[data-my-control]'); |
| 114 | + if (!$el.length || !$el.closest($scope).length) { |
| 115 | + return; |
| 116 | + } |
| 117 | + const instance = $el.data('myControlInstance'); |
| 118 | + if (!instance) { |
| 119 | + return; |
| 120 | + } |
| 121 | + return { |
| 122 | + $element: $el, |
| 123 | + instance, |
| 124 | + getVal: () => instance.getValue(), |
| 125 | + setVal: (value) => { |
| 126 | + instance.setValue(value); |
| 127 | + return true; |
| 128 | + }, |
| 129 | + }; |
| 130 | +}); |
| 131 | +``` |
| 132 | + |
| 133 | +## 初始化选项 |
| 134 | + |
| 135 | +<Props> |
| 136 | +/** 当查询参数无法作为 name 匹配时,是否自动将查询参数作为 ID 查询,默认 `true`。 */ |
| 137 | +matchID?: boolean; |
| 138 | +/** 当查询参数无法作为 name 匹配时,是否自动将查询参数作 `name[]` 的形式进行查询,默认 `true`。 */ |
| 139 | +matchBrackets?: boolean; |
| 140 | +/** 是否缓存查询字段,开启后同一 query 只查询一次 DOM,默认 `false`。 */ |
| 141 | +cacheQuery?: boolean; |
| 142 | +/** 是否允许同名字段,当为 `false`(默认)时,查找到多个同名字段会抛出错误。 */ |
| 143 | +allowSameName?: boolean; |
| 144 | +/** 控件查找器映射,用于识别和操作自定义控件(如 Picker)。 */ |
| 145 | +controls?: Record<string, FormControlFinder>; |
| 146 | +/** 表单字段自定义查找器,可以是按字段名映射的对象或统一的查找函数。 */ |
| 147 | +fields?: Record<string, FormFieldFinder> | FormFieldFinder; |
| 148 | +/** 是否在找不到字段时抛出错误,默认 `true`。 */ |
| 149 | +throwError?: boolean; |
| 150 | +</Props> |
| 151 | + |
| 152 | +## FormField 类型 |
| 153 | + |
| 154 | +`getFieldInfo` 返回的字段信息对象结构如下: |
| 155 | + |
| 156 | +<Props> |
| 157 | +/** 查询参数。 */ |
| 158 | +query: string; |
| 159 | +/** 字段 name 属性值。 */ |
| 160 | +name: string; |
| 161 | +/** 字段的 Cash 封装的 DOM 元素。 */ |
| 162 | +\$field: Cash; |
| 163 | +/** 字段当前值。 */ |
| 164 | +value: unknown; |
| 165 | +/** 关联的控件信息,无控件时为 undefined。 */ |
| 166 | +control?: FormControlInfo; |
| 167 | +</Props> |
| 168 | + |
| 169 | +## FormControlInfo 类型 |
| 170 | + |
| 171 | +关联的控件信息对象结构如下: |
| 172 | + |
| 173 | +<Props> |
| 174 | +/** 控件类型标识。 */ |
| 175 | +type: string; |
| 176 | +/** 控件实例。 */ |
| 177 | +instance: Component; |
| 178 | +/** 控件的 Cash 封装的 DOM 元素。 */ |
| 179 | +\$element: Cash; |
| 180 | +/** 获取控件值的方法。 */ |
| 181 | +getVal: () => unknown; |
| 182 | +/** 设置控件值的方法,返回是否成功。 */ |
| 183 | +setVal: (value: unknown) => boolean | undefined; |
| 184 | +</Props> |
0 commit comments