异步校验与表单处理


真切的感受到了async 和await在实际开发的作用有多大,举个代码片段例子,一个简单的表单校验加按钮触发控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
  const validateFields = async () => {
try {
// 触发表单验证
await form.validateFields();
return true;
} catch (error) {
if (form.getFieldsError()) {
message.error(t('normal.searchLimit'));
}
return false;
}
};

const { run: getList } = useRequest(
async (options?: any) => {
const { pageNum = defaultPageNum, pageSize = curPageSize } = options || {};
const requestConfig = {
pageNum,
serviceType: 1,
pageSize,
...getFormParams(),
};
exportParams.current = requestConfig;
if (options) {
setCurPageNum(options.pageNum);
setCurPageSize(options.pageSize);
}
const isValid = await validateFields();
if (isValid) {
return getRecordList(requestConfig);
}
return null;
},

validateFields的函数返回值是一个异步函数来的,所以返回的是一个promise对象,而不是一个普通的函数,所以不能够直接调用validateFields()来获取返回的值,而是要加await修饰符等待它执行完毕。但是同步的await去修饰的函数要运行的时候,外部必须加上async去搭配使用的,因为它只允许在异步函数里面使用,不然会出现问题。

另外表单验证可以使用自带的rule,而不需要使用到自定义的validateStatus的写法。比如:

1
<Form.Item name={['selectSearch', 'fieldValue']} className={styles.input} validateStatus={formErrors.fieldValue ? 'error' : ''} help={formErrors.fieldValue}>

而是这样的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  return (
<div className="container">
<PageContainer title={t('subscribe.record')}>
<Form layout="inline" form={form} initialValues={{ status: ['active'] }} validateTrigger={[]}>
<Form.Item name="sellerId" rules={formErrorRule}>
<SellerPicker style={{ width: '150px' }} />
</Form.Item>
<Form.Item name="subType" rules={formErrorRule}>
<Select style={{ width: '150px' }} placeholder={t('seller.subscribeType')}>
<Select.Option value="trial">{t('seller.tryOut')}</Select.Option>
<Select.Option value="paid">{t('seller.pay')}</Select.Option>
<Select.Option value="free">{t('subscribe.free')}</Select.Option>
</Select>
</Form.Item>
// 省略
<div style={{ display: 'flex', gap: '5px', flexWrap: 'wrap' }}>
<AuthButton type="primary" authCode="12:07:01" onClick={search}>
{t('normal.search')}
</AuthButton>
<AuthButton authCode="12:07:02" onClick={onReset}>
{t('normal.reset')}
</AuthButton>
<AuthButton authCode="12:07:03" onClick={toggle} loading={exporting}>
{t('normal.export')}
</AuthButton>
{renderElement()}
</div>
</Form>
<br />
<Table rowKey="id" scroll={{ x: 2000 }} columns={columns} dataSource={list} pagination={pageConfig} />
</PageContainer>
</div>
);
};
1
2
3
4
5
6
7
8
9
10
11
const formErrorRule: Rule[] = [
({ getFieldsValue }) => ({
validator() {
const { sellerId, subType, subBizType, status } = getFieldsValue();
if (!sellerId && !subType && !subBizType && status.length === 0) {
return Promise.reject();
}
return Promise.resolve();
},
}),
];

以满足某种业务场景,在需要用的校验的时候,就去使用那个方法。


文章作者: 悠然寂夏
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 悠然寂夏 !
评论
评论
评论
  目录