Skip to content

Commit 6eb6c0c

Browse files
committed
+ form-helper: add comprehensive documentation for FormHelper component, detailing instance creation, field value manipulation, and custom field lookup, enhancing developer understanding and usage.
1 parent fdefabe commit 6eb6c0c

1 file changed

Lines changed: 184 additions & 0 deletions

File tree

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
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

Comments
 (0)