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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| <script setup> import { useForm, validators } from '@/composables/useForm'
const { values, errors, handleChange, handleBlur, handleSubmit, submitting } = useForm( { username: '', email: '', password: '', confirmPassword: '' }, { username: [ validators.required, validators.minLength(3), validators.maxLength(20) ], email: [ validators.required, validators.email ], password: [ validators.required, validators.minLength(8) ], confirmPassword: [ validators.required, (value) => value === values.password ? true : '两次密码不一致' ] } )
async function onSubmit(values) { await api.register(values) } </script>
<template> <form @submit.prevent="handleSubmit(onSubmit)"> <div> <label>用户名</label> <input :value="values.username" @input="e => handleChange('username', e.target.value)" @blur="() => handleBlur('username')" /> <span v-if="errors.username" class="error">{{ errors.username }}</span> </div> <div> <label>邮箱</label> <input type="email" :value="values.email" @input="e => handleChange('email', e.target.value)" @blur="() => handleBlur('email')" /> <span v-if="errors.email" class="error">{{ errors.email }}</span> </div> <div> <label>密码</label> <input type="password" :value="values.password" @input="e => handleChange('password', e.target.value)" @blur="() => handleBlur('password')" /> <span v-if="errors.password" class="error">{{ errors.password }}</span> </div> <div> <label>确认密码</label> <input type="password" :value="values.confirmPassword" @input="e => handleChange('confirmPassword', e.target.value)" @blur="() => handleBlur('confirmPassword')" /> <span v-if="errors.confirmPassword" class="error">{{ errors.confirmPassword }}</span> </div> <button type="submit" :disabled="submitting"> {{ submitting ? '提交中...' : '注册' }} </button> </form> </template>
|