表單驗證詳解
<template>
<!-- 第一個坑
:model="formState.youForm" 一定要寫成這樣
不要寫成:model="formState"
:labelCol="{ style: 'width: 100px' }" 控制labe顯示寬度
useSlectValue 是一個字符串類型的,而不是數組類型。否者驗證規則會報錯的哈
autocomplete="off" 清除input輸入框的歷史記錄
:maxlength="4" 限制字符串
-->
<a-button type="primary" @click="showHnader">顯示</a-button>
<a-form
ref="formRef"
:model="formState.youForm"
:rules="rules"
:labelCol="{ style: 'width: 100px' }"
v-if="flag"
>
<a-form-item ref="youNaNe" label="姓名" name="youNaNe">
<a-input autocomplete="off" placeholder="請選擇"
v-model:value="formState.youForm.youNaNe"
style="width:270px"
:maxlength="4"
/>
</a-form-item>
<a-form-item label="學校" name="useSlectValue">
<!-- formState.youForm.useSlectValue就是你選擇該項的value對應的值 -->
<a-select placeholder="請選擇" style="width:270px" v-model:value="formState.youForm.useSlectValue">
<a-select-option :value="item.code"
v-for="(item,index) in formState.backDataSchool"
:key="index">
{{ item.name }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="日期" required name="date1">
<a-date-picker
style="width:270px"
v-model:value="formState.youForm.date1"
show-time
format="YYYY-MM-DD"
type="date"
valueFormat="YYYY-MM-DD"
placeholder="請選擇"
/>
</a-form-item>
<a-form-item label="愛好" name="type" >
<a-checkbox-group v-model:value="formState.youForm.type">
<a-checkbox :value="item.code" :name="item.name"
v-for="(item,index) in formState.likeBackArr"
:key="index"
>{{ item.name }}</a-checkbox>
</a-checkbox-group>
</a-form-item>
<a-form-item :wrapper-col="{ span: 14, offset: 1 }">
<a-button type="primary" @click="onSubmit">提交</a-button>
<a-button style="margin-left: 10px" @click="resetForm">清空驗證規則及數據</a-button>
<a-button style="margin-left: 10px" @click="removeResult">移除表單項的校驗結果</a-button>
</a-form-item>
</a-form>
</template>
<script lang="ts">
import { defineComponent, reactive, ref, toRaw, nextTick } from 'vue';
export default defineComponent({
setup() {
const formRef = ref();
const flag=ref(false)
const formState= reactive({
youForm:{
youNaNe:'',
//這個時候就會默認[第一小學],
//他是通過code去尋找對應的name值,然后展示在視圖上哈
// 需要注意的是,它選中的值是一個字符串;
// 而不是數組類型的 ['001']這樣是會出問題的 雖然可以回填,但是驗證規則會出問題的哈
useSlectValue: '001',
date1: undefined,
delivery: false,
type: [],
},
backDataSchool:[
{
name:'第一小學',code:'001'
},
{
name:'第二小學',code:'002'
},
],
likeBackArr:[
{name:'睡覺',code:'1'},
{name:'吃飯',code:'2'},
{name:'吃飯',code:'3'},
]
});
const rules = {
youNaNe: [
{ required: true, message: '請輸入姓名', trigger: 'blur' },
],
useSlectValue: [{ required: true, message: '請選擇學校', trigger: 'change' }],
date1: [{ required: true, message: '請選擇日期', trigger: 'change', }],
// date1: [{ required: true, message: '請選擇日期', trigger: 'change', type: 'object' }],
// 如果 type: 'object',需要注意的是你需要定義一個接口
type: [
{
type: 'array',
required: true,
message: '請選擇',
trigger: 'change',
},
],
};
const onSubmit = () => {
formRef.value
.validate()
.then(() => {
console.log('values', formState, toRaw(formState));
})
.catch((err:any) => {
console.log('err')
});
};
const resetForm = () => {
// 移除規則和重置data中的數據
formRef.value.resetFields();
};
const removeResult=()=>{
// 移除表單項的校驗結果。
formRef.value.clearValidate();
}
const showHnader=()=>{
flag.value=true;
nextTick(()=>{
formRef.value.clearValidate();
})
}
return {
formRef,
formState,
rules,
flag,
removeResult,
onSubmit,
resetForm,
showHnader
};
},
});
</script>
