264 lines
7.8 KiB
Vue
264 lines
7.8 KiB
Vue
|
<template>
|
|||
|
<PageWrapper title="表单校验示例">
|
|||
|
<div class="mb-4">
|
|||
|
<a-button @click="validateForm" class="mr-2"> 手动校验表单</a-button>
|
|||
|
<a-button @click="resetValidate" class="mr-2"> 清空校验信息</a-button>
|
|||
|
<a-button @click="getFormValues" class="mr-2"> 获取表单值</a-button>
|
|||
|
<a-button @click="setFormValues" class="mr-2"> 设置表单值</a-button>
|
|||
|
<a-button @click="resetFields" class="mr-2"> 重置</a-button>
|
|||
|
</div>
|
|||
|
<CollapseContainer title="表单校验">
|
|||
|
<BasicForm @register="register" @submit="handleSubmit"/>
|
|||
|
</CollapseContainer>
|
|||
|
</PageWrapper>
|
|||
|
</template>
|
|||
|
<script lang="ts">
|
|||
|
import {defineComponent} from 'vue';
|
|||
|
import {BasicForm, FormSchema, useForm} from '/@/components/Form/index';
|
|||
|
import {CollapseContainer} from '/@/components/Container';
|
|||
|
import {useMessage} from '/@/hooks/web/useMessage';
|
|||
|
import {PageWrapper} from '/@/components/Page';
|
|||
|
import {isAccountExist} from '/@/api/demo/system';
|
|||
|
|
|||
|
const schemas: FormSchema[] = [
|
|||
|
{
|
|||
|
field: 'field1',
|
|||
|
component: 'Input',
|
|||
|
label: '字段1',
|
|||
|
colProps: {
|
|||
|
span: 8,
|
|||
|
},
|
|||
|
required: true,
|
|||
|
},
|
|||
|
{
|
|||
|
field: 'field2',
|
|||
|
component: 'Input',
|
|||
|
label: '字段2',
|
|||
|
colProps: {
|
|||
|
span: 8,
|
|||
|
},
|
|||
|
required: true,
|
|||
|
},
|
|||
|
{
|
|||
|
field: 'id',
|
|||
|
label: 'id',
|
|||
|
required: true,
|
|||
|
defaultValue: 0,
|
|||
|
component: 'InputNumber',
|
|||
|
show: false,
|
|||
|
},
|
|||
|
{
|
|||
|
field: 'field3',
|
|||
|
component: 'DatePicker',
|
|||
|
label: '字段3',
|
|||
|
colProps: {
|
|||
|
span: 8,
|
|||
|
},
|
|||
|
required: true,
|
|||
|
},
|
|||
|
{
|
|||
|
field: 'field33',
|
|||
|
component: 'DatePicker',
|
|||
|
label: '字段33',
|
|||
|
colProps: {
|
|||
|
span: 8,
|
|||
|
},
|
|||
|
componentProps: {
|
|||
|
valueFormat: 'YYYY-MM-DD',
|
|||
|
},
|
|||
|
rules: [{required: true, type: 'string'}],
|
|||
|
},
|
|||
|
{
|
|||
|
field: 'field44',
|
|||
|
component: 'InputCountDown',
|
|||
|
label: '验证码',
|
|||
|
colProps: {
|
|||
|
span: 8,
|
|||
|
},
|
|||
|
required: true,
|
|||
|
},
|
|||
|
{
|
|||
|
field: 'field4',
|
|||
|
component: 'Select',
|
|||
|
label: '字段4',
|
|||
|
colProps: {
|
|||
|
span: 8,
|
|||
|
},
|
|||
|
componentProps: {
|
|||
|
mode: 'multiple',
|
|||
|
options: [
|
|||
|
{
|
|||
|
label: '选项1',
|
|||
|
value: '1',
|
|||
|
key: '1',
|
|||
|
},
|
|||
|
{
|
|||
|
label: '选项2',
|
|||
|
value: '2',
|
|||
|
key: '2',
|
|||
|
},
|
|||
|
],
|
|||
|
},
|
|||
|
rules: [
|
|||
|
{
|
|||
|
required: true,
|
|||
|
message: '请输入aa',
|
|||
|
type: 'array',
|
|||
|
},
|
|||
|
],
|
|||
|
},
|
|||
|
{
|
|||
|
field: 'field441',
|
|||
|
component: 'Input',
|
|||
|
label: '自定义校验',
|
|||
|
colProps: {
|
|||
|
span: 8,
|
|||
|
},
|
|||
|
rules: [
|
|||
|
{
|
|||
|
required: true,
|
|||
|
// @ts-ignore
|
|||
|
validator: async (rule, value) => {
|
|||
|
if (!value) {
|
|||
|
/* eslint-disable-next-line */
|
|||
|
return Promise.reject('值不能为空');
|
|||
|
}
|
|||
|
if (value === '1') {
|
|||
|
/* eslint-disable-next-line */
|
|||
|
return Promise.reject('值不能为1');
|
|||
|
}
|
|||
|
return Promise.resolve();
|
|||
|
},
|
|||
|
trigger: 'change',
|
|||
|
},
|
|||
|
],
|
|||
|
},
|
|||
|
{
|
|||
|
field: 'field5',
|
|||
|
component: 'CheckboxGroup',
|
|||
|
label: '字段5',
|
|||
|
colProps: {
|
|||
|
span: 8,
|
|||
|
},
|
|||
|
componentProps: {
|
|||
|
options: [
|
|||
|
{
|
|||
|
label: '选项1',
|
|||
|
value: '1',
|
|||
|
},
|
|||
|
{
|
|||
|
label: '选项2',
|
|||
|
value: '2',
|
|||
|
},
|
|||
|
],
|
|||
|
},
|
|||
|
rules: [{required: true}],
|
|||
|
},
|
|||
|
{
|
|||
|
field: 'field7',
|
|||
|
component: 'RadioGroup',
|
|||
|
label: '字段7',
|
|||
|
colProps: {
|
|||
|
span: 8,
|
|||
|
},
|
|||
|
componentProps: {
|
|||
|
options: [
|
|||
|
{
|
|||
|
label: '选项1',
|
|||
|
value: '1',
|
|||
|
},
|
|||
|
{
|
|||
|
label: '选项2',
|
|||
|
value: '2',
|
|||
|
},
|
|||
|
],
|
|||
|
},
|
|||
|
rules: [{required: true, message: '覆盖默认生成的校验信息'}],
|
|||
|
},
|
|||
|
{
|
|||
|
field: 'field8',
|
|||
|
component: 'Input',
|
|||
|
label: '后端异步验证',
|
|||
|
colProps: {
|
|||
|
span: 8,
|
|||
|
},
|
|||
|
helpMessage: ['本字段演示异步验证', '本地规则:必须填写', '后端规则:不能包含admin'],
|
|||
|
rules: [
|
|||
|
{
|
|||
|
required: true,
|
|||
|
message: '请输入数据',
|
|||
|
},
|
|||
|
{
|
|||
|
validator(_, value) {
|
|||
|
return new Promise((resolve, reject) => {
|
|||
|
isAccountExist(value)
|
|||
|
.then(() => resolve())
|
|||
|
.catch((err) => {
|
|||
|
reject(err.message || '验证失败');
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
},
|
|||
|
],
|
|||
|
},
|
|||
|
];
|
|||
|
|
|||
|
export default defineComponent({
|
|||
|
components: {BasicForm, CollapseContainer, PageWrapper},
|
|||
|
setup() {
|
|||
|
const {createMessage} = useMessage();
|
|||
|
const [
|
|||
|
register,
|
|||
|
{validateFields, clearValidate, getFieldsValue, resetFields, setFieldsValue},
|
|||
|
] = useForm({
|
|||
|
labelWidth: 120,
|
|||
|
schemas,
|
|||
|
actionColOptions: {
|
|||
|
span: 24,
|
|||
|
},
|
|||
|
});
|
|||
|
|
|||
|
async function validateForm() {
|
|||
|
try {
|
|||
|
const res = await validateFields();
|
|||
|
console.log('passing', res);
|
|||
|
} catch (error) {
|
|||
|
console.log('not passing', error);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
async function resetValidate() {
|
|||
|
clearValidate();
|
|||
|
}
|
|||
|
|
|||
|
function getFormValues() {
|
|||
|
const values = getFieldsValue();
|
|||
|
createMessage.success('values:' + JSON.stringify(values));
|
|||
|
}
|
|||
|
|
|||
|
function setFormValues() {
|
|||
|
setFieldsValue({
|
|||
|
field1: 1111,
|
|||
|
field5: ['1'],
|
|||
|
field7: '1',
|
|||
|
field33: '2020-12-12',
|
|||
|
field3: '2020-12-12',
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
return {
|
|||
|
register,
|
|||
|
schemas,
|
|||
|
handleSubmit: (values: any) => {
|
|||
|
createMessage.success('click search,values:' + JSON.stringify(values));
|
|||
|
},
|
|||
|
getFormValues,
|
|||
|
setFormValues,
|
|||
|
validateForm,
|
|||
|
resetValidate,
|
|||
|
resetFields,
|
|||
|
};
|
|||
|
},
|
|||
|
});
|
|||
|
</script>
|