Skip to content

Commit 20f328f

Browse files
author
Tenny
committed
fix(Form): 表单增加 validate、validateField、clearValidate 手动验证函数
1 parent bde5454 commit 20f328f

File tree

3 files changed

+67
-7
lines changed

3 files changed

+67
-7
lines changed

docs/components/form.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,3 +240,12 @@
240240
| `label-width` | 标签宽度,例如 `50px` | `string` | - |
241241
| `error` | 表单域验证错误时的提示信息。设置该值会导致表单验证状态变为 `error`,并显示该错误信息。 | `string` | - |
242242
| `label-position` | 标签位置, *可选* | `left``right``top` | - |
243+
244+
### Form Methods
245+
246+
<!-- prettier-ignore -->
247+
| 方法名 | 说明 | 参数 |
248+
| ------ | ---- | ---- |
249+
| `validate` | 对整个表单进行校验的方法 | `() => void` |
250+
| `validateField` | 对部分表单字段进行校验的方法 | `(field: string \| string[]) => void` |
251+
| `clearValidate` | 移除表单项的校验结果 | `-` |

src/components/form/Form.vue

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ if (props.model != null && validator != null) {
6060
const watcher = [];
6161
for (const key in props.model) {
6262
keys.push(key);
63-
//@ts-ignore
63+
//@ts-expect-error: Unreachable code error
6464
watcher.push(() => props.model[key]);
6565
}
6666
if (watcher.length > 0) {
@@ -100,6 +100,17 @@ provide(formDisabledContext, () => props.disabled);
100100
function handleSubmit(e: Event) {
101101
e.preventDefault();
102102
if (validator != null) {
103+
validate();
104+
} else {
105+
emits('submit');
106+
}
107+
}
108+
109+
/**
110+
* 校验全部表单数据
111+
*/
112+
function validate() {
113+
if (validator != null && props.model != null) {
103114
validator
104115
.validate(props.model)
105116
.then(() => {
@@ -111,8 +122,48 @@ function handleSubmit(e: Event) {
111122
[err.key]: err.message,
112123
};
113124
});
114-
} else {
115-
emits('submit');
116125
}
117126
}
127+
128+
/**
129+
* 校验部分表单数据
130+
* @param field
131+
*/
132+
function validateField(field: string | string[]) {
133+
if (validator != null && props.model != null) {
134+
const tacks: Promise<{
135+
key: string;
136+
value: any;
137+
}>[] = [];
138+
if (Array.isArray(field)) {
139+
for (let i = 0, len = field.length; i < len; i++) {
140+
tacks.push(
141+
validator.validateKey(field[i], props.model[field[i]], props.model),
142+
);
143+
}
144+
} else {
145+
tacks.push(validator.validateKey(field, props.model[field], props.model));
146+
}
147+
Promise.allSettled(tacks).then((results) => {
148+
for (let i = 0, len = results.length; i < len; i++) {
149+
const result = results[i];
150+
if (result.status === 'rejected') {
151+
errors.value[result.reason.key] = result.reason.message;
152+
} else {
153+
errors.value[result.value.key] = undefined;
154+
}
155+
}
156+
});
157+
}
158+
}
159+
160+
function clearValidate() {
161+
errors.value = {};
162+
}
163+
164+
defineExpose({
165+
validate,
166+
validateField,
167+
clearValidate,
168+
});
118169
</script>

src/hooks/useFormReset.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,22 @@ export default function useFormReset<T>(params: T) {
2323
* @example
2424
* set('age', 1);
2525
*/
26-
function set(key: string, value: any): void;
26+
function setFields(key: string, value: any): void;
2727
/**
2828
* 设置多个值
2929
* @param values 键值对数据
3030
*
3131
* @example
3232
* set({ age: 1, name: 'test'})
3333
*/
34-
function set(values: Record<string, any>): void;
35-
function set(...args: any[]) {
34+
function setFields(values: Record<string, any>): void;
35+
function setFields(...args: any[]) {
3636
if (args.length === 1) {
3737
formFields.value = { ...formFields.value, ...args[0] };
3838
} else {
3939
formFields.value[args[0] as keyof T] = args[1];
4040
}
4141
}
4242

43-
return { formFields, resetFields, set };
43+
return { formFields, resetFields, setFields };
4444
}

0 commit comments

Comments
 (0)