uniapp uview-plus form表单验证

55 阅读1分钟

uniapp uview-plus form表单验证

最近在写表单验证这一块,包括时间,性别,图片上传,话不多说直接上代码

<template>
    <view class="register p24 bgf">
        <up-form :model="form" ref="uFormRef" :rules="rules" labelWidth="100" :borderBottom="true">
            <up-form-item label="姓名" prop="name">
                    <up-input v-model="form.name" placeholder="请输入" border="false" inputAlign="right" />
            </up-form-item>
            <up-line></up-line>
            <up-form-item label="健康证到期时间" @click="showTime = true" prop="expireTimeText" labelWidth="130">
                    <up-input v-model="form.expireTimeText" placeholder="请选择" border="false" inputAlign="right" disabled
                            disabledColor="#ffffff" />
            </up-form-item>
            <up-datetime-picker v-model="form.expireTime" :show="showTime" @confirm="timeConfirm"
                    @cancel="showTime=false" mode="date" format="YYYY-MM-DD" :formatter="formatter" ref="datetimePickerRef">
            </up-datetime-picker>
            <up-line></up-line>
            <up-form-item label="性别" prop="sex" labelWidth="130" @click="showSex = true">
                    <up-input v-model="form.sex" placeholder="请选择" border="false" inputAlign="right" disabled
                            disabledColor="#ffffff" />
            </up-form-item>
            <up-action-sheet :show="showSex" :actions="sexActions" title="请选择性别" @close="showSex = false"
                    @select="handleSexSelect">
            </up-action-sheet>
            
            
            <up-form-item label="身份证正面" prop="idCardFront">
                <view class="flex flex-end flex1">
                        <up-upload :fileList="uploadImg['IDImg']" @afterRead="handleUpload($event, 'IDImg')"
                                @delete="handleDelPic($event, 'IDImg')" :maxCount="1" width="76rpx" height="76rpx"
                                style="flex: initial;">
                        </up-upload>
                </view>
                </up-form-item>
        </up-form>
        <up-button @click="handleRegister" type="primary">注册</up-button>
	</view>
</template>
//写了一个hook,可以在uview-plus复制上传那块的代码
const { handleUpload, uploadImg, handleDelPic } = useOssUpload()

onReady(() => {
        // 微信小程序需要用此写法
        datetimePickerRef.value.setFormatter(formatter);
});

const uFormRef = ref(null)
const form = reactive({
        name: '',
        expireTime: Date.now(),
        expireTimeText: '',
        sex: '',
        idCardFront: ''

})
const rules = {
    name: [{ required: true, message: '请输入用户名', trigger: 'blur' }],
    expireTimeText: [{ required: true, message: '请选择到期时间', trigger: ['blur', 'change'] }],
    sex: [{ required: true, message: '请选择性别', trigger: ['blur', 'change'] }],
    idNumber: [{ required: true, message: '请输入身份证号', trigger: 'blur' }]

//图片上传后监听
watch(uploadImg.value, (newVal, oldVal) => {
    if (newVal.IDImg) {
        form.idCardFront = newVal.IDImg[0]
        uFormRef.value.clearValidate('idCardFront')//清除单个验证信息
    }
}
}
//选择性别
const showSex = ref(false)
const sexActions = [
    { name: '男' },
    { name: '女' },
    { name: '保密' }
]
const handleSexSelect = (e) => {
    form.sex = e.name;
    if (uFormRef.value) {
            uFormRef.value.validateField('sex');
    }
}
// 选择时间
const datetimePickerRef = ref(null)
const showTime = ref(false)
const formatter = (type, value) => {
    if (type === 'year') {
            return `${value}年`;
    }
    if (type === 'month') {
            return `${value}月`;
    }
    if (type === 'day') {
            return `${value}日`;
    }
    return value;
}
const timeConfirm = (e) => {
    form.expireTimeText = timeFormat(e.value, 'yyyy-mm-dd')
    form.expireTime = e.value
    showTime.value = false
    if (uFormRef.value) {
            uFormRef.value.validateField('expireTimeText');
    }
}
const handleRegister = async () => {
    uFormRef.value.validate().then(res => {
            // uni.$u.toast('校验通过')
            console.log(res, '成功');
            // return
    }).catch(err => {
            console.log(err, '校验失败');
            // return
    })

}

image.png

image.png