element UI的form表單提供了強大的表單校驗功能
https://element.eleme.cn/#/zh-CN/component/form
validate是對整個表單進行校驗的方法
validateField第一個參數是數組或字符串,第二個參數是回調函數,回調函數有值則表示錯誤
使用示例
<section> <el-form ref="ruleForm" :model="ruleForm" :rules="rules" label-width="100px" class="demo-ruleForm"> <el-form-item label="昵稱" prop="name"> <el-input v-model="ruleForm.name" /> </el-form-item> <el-form-item label="郵箱" prop="email"> <el-input v-model="ruleForm.email" /> <el-button size="mini" round @click="sendMsg"> 發送驗證碼 </el-button> <span class="status">{{ statusMsg }}</span> </el-form-item> <el-form-item label="驗證碼" prop="code"> <el-input v-model="ruleForm.code" maxlength="4" /> </el-form-item> <el-form-item label="密碼" prop="pwd"> <el-input v-model="ruleForm.pwd" type="password" /> </el-form-item> <el-form-item label="確認密碼" prop="cpwd"> <el-input v-model="ruleForm.cpwd" type="password" /> </el-form-item> <el-form-item> <el-button type="primary" @click="register"> 同意以下協議並注冊 </el-button> <div class="error">{{ error }}</div> </el-form-item> <el-form-item> <a class="f1" href="http://www.meituan.com/about/terms" target="_blank"> 《用戶協議》 </a> </el-form-item> </el-form> </section>
//引入加密庫crypto-js,其中包括常用於密碼加密的md5 import CryptoJS from 'crypto-js'
data() { return { // 錯誤提醒內容 statusMsg: '', error: '', ruleForm: { name: '', code: '', pwd: '', cpwd: '', email: '' }, rules: { name: [{ required: true, type: 'string', message: '請輸入昵稱', trigger: 'blur' }], email: [{ required: true, type: 'email', message: '請輸入郵箱', trigger: 'blur' }], pwd: [{ required: true, message: '創建密碼', trigger: 'blur' }], cpwd: [{ required: true, message: '確認密碼', trigger: 'blur' }, { validator: (rule, value, callback) => { if (value === '') { callback(new Error('請再次輸入密碼')) } else if (value !== this.ruleForm.pwd) { callback(new Error('兩次輸入密碼不一致')) } else { callback() } }, trigger: 'blur' }] } } },
methods: { //發送驗證碼 sendMsg: function () { const self = this; let namePass let emailPass // 如果60秒的發送驗證碼CD還存在,停止后續操作 if (self.timerid) { return false } //校驗用戶名 (element UI的from表單中自定義校驗規則) //validateField第一個參數是數組或字符串,第二個參數是回調函數, // 回調函數有值則表示錯誤 this.$refs['ruleForm'].validateField('name', (valid) => { namePass = valid }) // 清空錯誤提醒內容 self.statusMsg = '' // 如果用戶名校驗沒有通過,即namePass存在 if (namePass) { return false } //校驗郵箱 (element UI的from表單中自定義校驗規則) this.$refs['ruleForm'].validateField('email', (valid) => { emailPass = valid }) //如果用戶名通過(namePass的值不存在),且郵箱通過(emailPass的值不存在) if (!namePass && !emailPass) { self.$axios.post('/users/verify', { // 中文需要編碼 username: encodeURIComponent(self.ruleForm.name), email: self.ruleForm.email }).then(( { status, data } ) => { // 后端定義,返回的code為0表示成功,-1表示異常錯誤 if (status === 200 && data && data.code === 0) { let count = 60; self.statusMsg = `驗證碼已發送,剩余${count--}秒` self.timerid = setInterval(function () { self.statusMsg = `驗證碼已發送,剩余${count--}秒` if (count === 0) { clearInterval(self.timerid) } }, 1000) } else { //錯誤提醒內容 self.statusMsg = data.msg } }) } }, //注冊 register: function () { let self = this; //validate對整個表單進行校驗的方法 this.$refs['ruleForm'].validate((valid) => { if (valid) { self.$axios.post('/users/signup', { //中文進行編碼 username: window.encodeURIComponent(self.ruleForm.name), // 使用crypto-js中的MD5對密碼進行加密,注意要轉為字符串 password: CryptoJS.MD5(self.ruleForm.pwd).toString(), email: self.ruleForm.email, code: self.ruleForm.code }).then(({ status, data }) => { if (status === 200) { if (data && data.code === 0) { location.href = '/login' } else { self.error = data.msg } } else { self.error = `服務器出錯,錯誤碼:${status}` } setTimeout(function () { self.error = '' }, 1500) }) } }) } }