很多知識(shí)都是需要提早知道,才可以規(guī)避很多錯(cuò)誤。
Element中Form (表單)組件提供了表單驗(yàn)證的功能,只需要通過(guò) rules 屬性傳入約定的驗(yàn)證規(guī)則,并將 Form-Item 的 prop 屬性設(shè)置為需校驗(yàn)的字段名即可。
注意:prop對(duì)應(yīng)表單域 model 字段,使用 validate方法時(shí),該屬性是必填的。
表單驗(yàn)證rules
以官網(wǎng)給出的例子分析來(lái)看
將prop屬性設(shè)置為需校驗(yàn)的字段名。
在data里配置要校驗(yàn)字段和校驗(yàn)規(guī)則:
required:true表示為必須輸入;
message:""設(shè)置不符合校驗(yàn)規(guī)則時(shí)的提示信息;
trigger:""設(shè)置校驗(yàn)的觸發(fā)方式:
‘change’:數(shù)據(jù)改變時(shí)觸發(fā);
‘blur’:失去焦點(diǎn)時(shí)觸發(fā);
沒(méi)有進(jìn)行任何輸入時(shí),不會(huì)觸發(fā)change,但一定會(huì)觸發(fā)blur事件。
設(shè)置校驗(yàn)規(guī)則后,表頭會(huì)出現(xiàn)紅色*樣式
該示例完整代碼:
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> <el-form-item label="活動(dòng)名稱(chēng)" prop="name"> <el-input v-model="ruleForm.name"></el-input> </el-form-item> <el-form-item label="活動(dòng)區(qū)域" prop="region"> <el-select v-model="ruleForm.region" placeholder="請(qǐng)選擇活動(dòng)區(qū)域"> <el-option label="區(qū)域一" value="shanghai"></el-option> <el-option label="區(qū)域二" value="beijing"></el-option> </el-select> </el-form-item> <el-form-item label="活動(dòng)時(shí)間" required> <el-col :span="11"> <el-form-item prop="date1"> <el-date-picker type="date" placeholder="選擇日期" v-model="ruleForm.date1" style="width: 100%;"></el-date-picker> </el-form-item> </el-col> <el-col class="line" :span="2">-</el-col> <el-col :span="11"> <el-form-item prop="date2"> <el-time-picker placeholder="選擇時(shí)間" v-model="ruleForm.date2" style="width: 100%;"></el-time-picker> </el-form-item> </el-col> </el-form-item> <el-form-item label="即時(shí)配送" prop="delivery"> <el-switch v-model="ruleForm.delivery"></el-switch> </el-form-item> <el-form-item label="活動(dòng)性質(zhì)" prop="type"> <el-checkbox-group v-model="ruleForm.type"> <el-checkbox label="美食/餐廳線上活動(dòng)" name="type"></el-checkbox> <el-checkbox label="地推活動(dòng)" name="type"></el-checkbox> <el-checkbox label="線下主題活動(dòng)" name="type"></el-checkbox> <el-checkbox label="單純品牌曝光" name="type"></el-checkbox> </el-checkbox-group> </el-form-item> <el-form-item label="特殊資源" prop="resource"> <el-radio-group v-model="ruleForm.resource"> <el-radio label="線上品牌商贊助"></el-radio> <el-radio label="線下場(chǎng)地免費(fèi)"></el-radio> </el-radio-group> </el-form-item> <el-form-item label="活動(dòng)形式" prop="desc"> <el-input type="textarea" v-model="ruleForm.desc"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm('ruleForm')">立即創(chuàng)建</el-button> <el-button @click="resetForm('ruleForm')">重置</el-button> </el-form-item> </el-form> <script> export default { data() { return { ruleForm: { name: '', region: '', date1: '', date2: '', delivery: false, type: [], resource: '', desc: '' }, rules: { name: [ { required: true, message: '請(qǐng)輸入活動(dòng)名稱(chēng)', trigger: 'blur' }, { min: 3, max: 5, message: '長(zhǎng)度在 3 到 5 個(gè)字符', trigger: 'blur' } ], region: [ { required: true, message: '請(qǐng)選擇活動(dòng)區(qū)域', trigger: 'change' } ], date1: [ { type: 'date', required: true, message: '請(qǐng)選擇日期', trigger: 'change' } ], date2: [ { type: 'date', required: true, message: '請(qǐng)選擇時(shí)間', trigger: 'change' } ], type: [ { type: 'array', required: true, message: '請(qǐng)至少選擇一個(gè)活動(dòng)性質(zhì)', trigger: 'change' } ], resource: [ { required: true, message: '請(qǐng)選擇活動(dòng)資源', trigger: 'change' } ], desc: [ { required: true, message: '請(qǐng)?zhí)顚?xiě)活動(dòng)形式', trigger: 'blur' } ] } }; }, methods: { submitForm(formName) { this.$refs[formName].validate((valid) => { if (valid) { alert('submit!'); } else { console.log('error submit!!'); return false; } }); }, resetForm(formName) { this.$refs[formName].resetFields(); } } } </script>
自定義校驗(yàn)規(guī)則
除此之外,還可以使用validator驗(yàn)證器來(lái)自定義校驗(yàn)規(guī)則,
舉一個(gè)使用自定義驗(yàn)證規(guī)則來(lái)完成密碼的二次驗(yàn)證的例子。
還是和之前一樣,設(shè)置prop需校驗(yàn)的字段名和v-model綁定值
但這時(shí),我們需要在data中自己定義校驗(yàn)規(guī)則,需要注意的是,設(shè)置的規(guī)則與return同級(jí)。
在rules中配置要校驗(yàn)的字段和用到的規(guī)則
完整代碼如下:
<el-form :model="ruleForm" status-icon :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm"> <el-form-item label="密碼" prop="pass"> <el-input type="password" v-model="ruleForm.pass" autocomplete="off"></el-input> </el-form-item> <el-form-item label="確認(rèn)密碼" prop="checkPass"> <el-input type="password" v-model="ruleForm.checkPass" autocomplete="off"></el-input> </el-form-item> <el-form-item label="年齡" prop="age"> <el-input v-model.number="ruleForm.age"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm('ruleForm')">提交</el-button> <el-button @click="resetForm('ruleForm')">重置</el-button> </el-form-item> </el-form> <script> export default { data() { var checkAge = (rule, value, callback) => { if (!value) { return callback(new Error('年齡不能為空')); } setTimeout(() => { if (!Number.isInteger(value)) { callback(new Error('請(qǐng)輸入數(shù)字值')); } else { if (value < 18) { callback(new Error('必須年滿18歲')); } else { callback(); } } }, 1000); }; var validatePass = (rule, value, callback) => { if (value === '') { callback(new Error('請(qǐng)輸入密碼')); } else { if (this.ruleForm.checkPass !== '') { this.$refs.ruleForm.validateField('checkPass'); } callback(); } }; var validatePass2 = (rule, value, callback) => { if (value === '') { callback(new Error('請(qǐng)?jiān)俅屋斎朊艽a')); } else if (value !== this.ruleForm.pass) { callback(new Error('兩次輸入密碼不一致!')); } else { callback(); } }; return { ruleForm: { pass: '', checkPass: '', age: '' }, rules: { pass: [ { validator: validatePass, trigger: 'blur' } ], checkPass: [ { validator: validatePass2, trigger: 'blur' } ], age: [ { validator: checkAge, trigger: 'blur' } ] } }; }, methods: { submitForm(formName) { this.$refs[formName].validate((valid) => { if (valid) { alert('submit!'); } else { console.log('error submit!!'); return false; } }); }, resetForm(formName) { this.$refs[formName].resetFields(); } } } </script>
本篇內(nèi)容已結(jié)束,歡迎大家更多精彩內(nèi)容。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/128382.html
摘要:一表單驗(yàn)證模塊的構(gòu)成任何表單驗(yàn)證模塊都是由配置校驗(yàn)報(bào)錯(cuò)取值這幾部分構(gòu)成的。其實(shí)我是想寫(xiě)個(gè)指令來(lái)完成表單驗(yàn)證的事的。當(dāng)然表單驗(yàn)證這種是高度定制化的。 前言 前段時(shí)間,老大搭好了Vue的開(kāi)發(fā)環(huán)境,于是我們愉快地從JQ來(lái)到了Vue。這中間做的時(shí)候,在表單驗(yàn)證上做的不開(kāi)心,看到vue的插件章節(jié),感覺(jué)自己也能寫(xiě)一個(gè),因此就自己開(kāi)始寫(xiě)了一個(gè)表單驗(yàn)證插件va.js。 當(dāng)然為什么不找個(gè)插件呢? vu...
摘要:根據(jù)組件單向數(shù)據(jù)流和和事件通信機(jī)制,需要由子組件通過(guò)事件通知父組件,并在父組件中修改原始的數(shù)據(jù),完成狀態(tài)的更新。 本文同步在個(gè)人博客shymean.com上,歡迎關(guān)注 寫(xiě)Vue有很長(zhǎng)一段時(shí)間了,除了常規(guī)的業(yè)務(wù)開(kāi)發(fā)之外,也應(yīng)該思考和反思一下封裝組件的正確方式。以彈窗組件為例,一種實(shí)現(xiàn)是在需要模板中引入需要彈窗展示的組件,然后通過(guò)一個(gè)flag變量來(lái)控制彈窗的組件,在業(yè)務(wù)代碼里面會(huì)充斥著冗余的彈...
摘要:今天就來(lái)介紹一下如何利用的自定義指令來(lái)開(kāi)發(fā)一個(gè)表單驗(yàn)證插件的過(guò)程。按照這種方式就能夠使用自己開(kāi)發(fā)的這個(gè)表單校驗(yàn)插件。這段時(shí)間在進(jìn)行一個(gè)新項(xiàng)目的前期搭建,新項(xiàng)目框架采用vue-cli3和typescirpt搭建。因?yàn)轫?xiàng)目比較輕量,所以基本沒(méi)有使用額外的ui組件,有時(shí)候我們需要的一些基礎(chǔ)組件我就直接自己開(kāi)發(fā)了。今天就來(lái)介紹一下如何利用vue的自定義指令directive來(lái)開(kāi)發(fā)一個(gè)表單驗(yàn)證插件的過(guò)...
摘要:示例輸出第一步先不考慮插件,在已有的中是沒(méi)有這個(gè)公共方法的,如果要簡(jiǎn)單實(shí)現(xiàn)的話可以通過(guò)鉤子函數(shù)來(lái),即在里面驗(yàn)證邏輯。按照插件的開(kāi)發(fā)流程,應(yīng)該有一個(gè)公開(kāi)方法,在里面使用全局的方法添加一些組件選項(xiàng),方法包含一個(gè)鉤子函數(shù),在鉤子函數(shù)中驗(yàn)證。 (關(guān)注福利,關(guān)注本公眾號(hào)回復(fù)[資料]領(lǐng)取優(yōu)質(zhì)前端視頻,包括Vue、React、Node源碼和實(shí)戰(zhàn)、面試指導(dǎo))showImg(https://segmen...
閱讀 687·2023-03-27 18:33
閱讀 888·2023-03-26 17:27
閱讀 755·2023-03-26 17:14
閱讀 738·2023-03-17 21:13
閱讀 666·2023-03-17 08:28
閱讀 2092·2023-02-27 22:32
閱讀 1520·2023-02-27 22:27
閱讀 2432·2023-01-20 08:28