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
87
88
89
90
91
92
93
94
95
96
97
98
import type {FormInstance, FormRules} from 'element-plus'
// 判断是否是移动端的函数
import {isMobileDevice} from "@/utils/commonMethod";

// 定义表单数据类型
interface RuleForm {
name: string
password: string
confirmPassword: string
email: string
code: string
}
// 获取表单实例,常量名对应ref属性
const ruleFormRef = ref<FormInstance>()
// 以下两个 validate* 函数,必须调用回调函数,否则最后提交会卡住
// 定义验证确认密码函数
const validatePass = (rule: object, value: string, callback: (error?: Error) => void) => {
if (value !== form.password) {
callback(new Error("两次密码不一致"))
} else {
callback()
}
}
// 定义验证邮箱函数
const validateEmail = (rule: object, value: string, callback: (error?: Error) => void) => {
const reg = /^[A-Za-z0-9_\-]+(\.[A-Za-z0-9_\-]+)*@[A-Za-z0-9\-]+\.[A-Za-z]{2,}$/
if (!reg.test(value)) {
callback(new Error("邮箱不合法"))
} else {
callback()
}
}
// 定义表单数据
const form = reactive<RuleForm>({
name: '',
password: '',
confirmPassword: '',
email: '',
code: ''
})
// 定义表单验证规则
const rules = reactive<FormRules<RuleForm>>({
name: [
{required: true, message: '请输入昵称', trigger: 'blur'},
{min: 1, max: 20, message: '长度应是1-20', trigger: 'blur'},
],
email: [
{required: true, message: '请输入邮箱', trigger: 'blur'},
{validator: validateEmail, trigger: 'blur'},
],
code: [
{required: true, message: '请输入邮箱验证码', trigger: 'blur'},
{min: 6, max: 6, message: '长度应是6', trigger: 'blur'},
],
password: [
{required: true, message: '请输入密码', trigger: 'blur'},
{min: 8, max: 16, message: '长度应是8-16', trigger: 'blur'},
],
confirmPassword: [
{required: true, message: '请确认密码', trigger: 'blur'},
{validator: validatePass, trigger: 'blur'}
]
})
// 提交表单
const submitForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
// 如果上面的两个 validate* 函数没有调用回调函数,则这里会卡住
formEl.validate((valid) => {
console.log(valid)
})
}
// 重置表单
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
}
const timer = ref(0)
const show = ref(true)
const count = ref(0)
const time = 120
const getCode = () => {
//axios请求
console.log(form.email);
// 验证码倒计时
if (timer.value === 0) {
count.value = time;
show.value = false;
timer.value = setInterval(() => {
if (count.value > 0 && count.value <= time) {
count.value--;
} else {
show.value = true;
clearInterval(timer.value);
timer.value = 0;
}
}, 1000);
}
}
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
<template>
<div class="registry" :style="{width: isMobileDevice() ? '90%' : '50%'}">
<span>注册</span>
<el-form
:ref="ruleFormRef"
:model="form"
:rules="rules"
label-width="auto"
class="demo-ruleForm"
size="default"
status-icon>
<el-form-item label="昵称" prop="name">
<el-input v-model="form.name"/>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="form.email"/>
</el-form-item>
<el-form-item label="验证码" prop="code">
<el-input v-model="form.code" style="flex:10;"/>
<el-button type="success" @click="getCode" round style="flex: 1;margin: 0 0 0 1rem">
<span v-show="show">发送验证码</span>
<span v-show="!show">{{ count }}</span>
</el-button>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input type="password" v-model="form.password"/>
</el-form-item>
<el-form-item label="确认密码" prop="confirmPassword">
<el-input type="password" v-model="form.confirmPassword"/>
</el-form-item>
<el-form-item>
<el-button type="success" @click="submitForm(ruleFormRef)">Submit</el-button>
<el-button @click="resetForm(ruleFormRef)">Reset</el-button>
</el-form-item>
</el-form>
</div>
</template>