摘要:一個(gè)驗(yàn)證的過程,一般便是分為這幾步,我們可以按照這個(gè)步驟設(shè)計(jì)出自己的驗(yàn)證函數(shù)。驗(yàn)證的方法,返回一個(gè)布爾值調(diào)用驗(yàn)證方法這里是調(diào)用驗(yàn)證函數(shù)的方法,和上面的定義結(jié)合起來。
1. 為什么要寫驗(yàn)證函數(shù)為什么要寫驗(yàn)證函數(shù)
將驗(yàn)證過程變成多個(gè)步驟
完成一個(gè)基本的驗(yàn)證函數(shù)
之前寫項(xiàng)目的時(shí)候,一般都是在登錄注冊,修改密碼的時(shí)候有需要些正則的需求,所以每次用到的時(shí)候都是直接從前面的代碼copy過去就好了,直到后臺開始寫后臺管理系統(tǒng)類的項(xiàng)目,復(fù)制粘貼已經(jīng)完全不可行了。怎么能做一個(gè)只會ctrl+c,ctrl+v的程序猿呢!簡直不能忍,于是就想到了自己寫一個(gè)驗(yàn)證函數(shù),每次需要做驗(yàn)證的時(shí)候只需要調(diào)用這個(gè)函數(shù),傳入?yún)?shù)就可以了,想想都美滋滋。
2. 將驗(yàn)證過程變成多個(gè)步驟做驗(yàn)證的時(shí)候我們要做的,定義驗(yàn)證失敗后的提示,編寫驗(yàn)證的方法,然后調(diào)用驗(yàn)證得到結(jié)果。
一個(gè)驗(yàn)證的過程,一般便是分為這幾步,我們可以按照這個(gè)步驟設(shè)計(jì)出自己的驗(yàn)證函數(shù)。
var validatorObj = { // 驗(yàn)證定義 validator: { // 驗(yàn)證失敗后的提示 messages: {}, // 驗(yàn)證的方法, 返回一個(gè)布爾值 methods: {} }, // 得到驗(yàn)證結(jié)果 checkResult: {} }定義一些驗(yàn)證失敗的提示
定義的錯(cuò)誤提示可以自定義,至于{0} {1}等則是用來做一個(gè)標(biāo)識符,在驗(yàn)證失敗后會將要驗(yàn)證的參數(shù)替換掉標(biāo)識符
// 驗(yàn)證失敗后的提示 messages: { notnull: "請輸入{0}", max: "長度最多為 {1} 個(gè)字符", min: "長度最小為 {1} 個(gè)字符", length: "{0}的長度在 {1} 到 {2} 個(gè)字符", number: "{0}必須是數(shù)字", string: "{0}必須是字母或者數(shù)字", moblie: "{0}必須是手機(jī)或者電話號碼格式", noChinese: "{0}不能為中文", lon: "{0}范圍為-180.0~+180.0(必須輸入1到10位小數(shù))", lat: "{0}范圍為-90.0~+90.0(必須輸入1到10位小數(shù))", url: "請輸入正確的{0}訪問地址", repeat: "兩次輸入的{0}不一致", email: "郵箱格式不正確", password: "請輸入由大小寫字母+數(shù)字組成的6-16位密碼", fixedNum: "請輸入{1}位數(shù)字" }定義對應(yīng)的驗(yàn)證方法
可以看到幾乎在每個(gè)驗(yàn)證前面都加了一個(gè)當(dāng)數(shù)據(jù)為空的時(shí)候,返回為true,這是因?yàn)橛械臅r(shí)候我們并不關(guān)心某一個(gè)數(shù)據(jù)是否填寫,但一旦填寫了,又要求符合某種規(guī)則。所以如果要驗(yàn)證非空的時(shí)候,需要使用兩個(gè)驗(yàn)證屬性。
// 驗(yàn)證的方法, 返回一個(gè)布爾值 methods: { notnull: obj => { return obj.value || obj.value === 0 }, max: obj => { if (!obj.value) return true return obj.conditions[0] >= obj.value.length }, min: obj => { if (!obj.value) return true return obj.value.length >= obj.conditions[0] }, length: obj => { if (!obj.value) return true return obj.conditions[0] <= obj.value.length && obj.value.length <= obj.conditions[1] }, number: obj => { if (!obj.value) return true reg = /^[0-9]+.?[0-9]*$/ return reg.test(obj.value) }, string: obj => { if (!obj.value) return true reg = /^[a-zA-Z0-9]+$/ return reg.test(obj.value) }, moblie: obj => { if (!obj.value) return true reg = /^(1[3,5,8,7]{1}[d]{9})|(((400)-(d{3})-(d{4}))|^((d{7,8})|(d{4}|d{3})-(d{7,8})|(d{4}|d{3})-(d{3,7,8})-(d{4}|d{3}|d{2}|d{1})|(d{7,8})-(d{4}|d{3}|d{2}|d{1}))$)$/ return reg.test(obj.value) }, noChinese: obj => { if (!obj.value) return true reg = /[u4e00-u9fa5]/ return !reg.test(obj.value) }, lon: obj => { if (!obj.value) return true reg = /^[-+]?(0?d{1,2}.d{1,5}|1[0-7]?d{1}.d{1,10}|180.0{1,10})$/ return reg.test(obj.value) }, lat: obj => { if (!obj.value) return true reg = /^[-+]?([0-8]?d{1}.d{1,10}|90.0{1,10})$/ return reg.test(obj.value) }, url: obj => { if (!obj.value) return true reg = /^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~/])+$/ return reg.test(obj.value) }, repeat: obj => { if (!obj.value) return true return obj.value === obj.value1 }, email: obj => { if (!obj.value) return true reg = /^([-_A-Za-z0-9.]+)@([_A-Za-z0-9]+.)+[A-Za-z0-9]{2,3}$/ return reg.test(obj.value) }, password: obj => { if (!obj.value) return true reg = /^(?=.*d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Zd]{6,16}$/ return reg.test(obj.value) }, fixedNum: obj => { if (!obj.value) return true return obj.value.length === obj.conditions[0] } }調(diào)用驗(yàn)證方法
**這里是調(diào)用驗(yàn)證函數(shù)的方法,和上面的定義結(jié)合起來。
傳入要驗(yàn)證的規(guī)則,驗(yàn)證的值,驗(yàn)證的字段名字,如果有條件則加上條件數(shù)組(條件數(shù)組是需要我們自己去設(shè)計(jì)的)**
/** 1. 傳入驗(yàn)證規(guī)則,得到驗(yàn)證結(jié)果 2. @param {Obj} { label, value, rules, conditions} 3. @param {String} label: 驗(yàn)證的字段名稱 4. @param {String} value: 驗(yàn)證的值 (驗(yàn)證重復(fù)的時(shí)候可以添加value1屬性) 5. @param {Array} rules: 驗(yàn)證的規(guī)則數(shù)組 例如: ["notnull", "length"] 如果參數(shù)必填,第一個(gè)參數(shù)為notnull 6. @param {Array} conditions: 條件字段 例如: ["2", "10"] ,則驗(yàn)證長度錯(cuò)誤會提示: 密碼的長度在2到10個(gè)字符,以傳入數(shù)組的條件去做驗(yàn)證, 驗(yàn)證的提示{1}開始將匹配的是當(dāng)前數(shù)組 7. @return {obj} { result, message } 驗(yàn)證結(jié)果對象 */ // 得到驗(yàn)證結(jié)果 checkResult: function (obj) { let result = true, checkType, message = "驗(yàn)證成功", validatorMethods = this.validator.methods, validatorMessage = this.validator.messages // 循環(huán)驗(yàn)證 for (let i = 0, len = obj.rules.length; i < len; i++) { // 當(dāng)驗(yàn)證的規(guī)則不存在,默認(rèn)跳過這個(gè)驗(yàn)證 if (!validatorMethods[obj.rules[i]]) { console.log(obj.rules[i] + "規(guī)則不存在") break } // 得到當(dāng)前驗(yàn)證失敗信息 if (!validatorMethods[obj.rules[i]](obj)) { checkType = obj.rules[i] result = false break } } // 如果驗(yàn)證失敗, 得到驗(yàn)證失敗的結(jié)果集 if (!result) { message = validatorMessage[checkType] if (obj.conditions) { obj.conditions.forEach((item, index) => { message = message.replace("{" + (index + 1) + "}", item) }) } message = message.replace("{0}", obj.label) return {result, message} } return {result, message} }3. 完整的驗(yàn)證函數(shù)
把上面的步驟拼在一起,就可以完成一個(gè)驗(yàn)證函數(shù)。具體的需求和使用,可以根據(jù)項(xiàng)目自定義,但思路大致是這樣的。
/** * 傳入驗(yàn)證規(guī)則,得到驗(yàn)證結(jié)果 * @param {Obj} { label, value, rules, conditions} * @param {String} label: 驗(yàn)證的字段名稱 * @param {String} value: 驗(yàn)證的值 (驗(yàn)證重復(fù)的時(shí)候可以添加value1屬性) * @param {Array} rules: 驗(yàn)證的規(guī)則數(shù)組 例如: ["notnull", "length"] 如果參數(shù)必填,第一個(gè)參數(shù)為notnull * @param {Array} conditions: 條件字段 例如: ["2", "10"] ,則驗(yàn)證長度錯(cuò)誤會提示: 密碼的長度在2到10個(gè)字符,以傳入數(shù)組的條件去做驗(yàn)證, 驗(yàn)證的提示{1}開始將匹配的是當(dāng)前數(shù)組 * @return {obj} { result, message } 驗(yàn)證結(jié)果對象 */ function validate (obj) { let reg const validatorObj = { // 驗(yàn)證定義 validator: { // 驗(yàn)證失敗后的提示 messages: { notnull: "請輸入{0}", max: "長度最多為 {1} 個(gè)字符", min: "長度最小為 {1} 個(gè)字符", length: "{0}的長度在 {1} 到 {2} 個(gè)字符", number: "{0}必須是數(shù)字", string: "{0}必須是字母或者數(shù)字", moblie: "{0}必須是手機(jī)或者電話號碼格式", noChinese: "{0}不能為中文", lon: "{0}范圍為-180.0~+180.0(必須輸入1到10位小數(shù))", lat: "{0}范圍為-90.0~+90.0(必須輸入1到10位小數(shù))", url: "請輸入正確的{0}訪問地址", repeat: "兩次輸入的{0}不一致", email: "郵箱格式不正確", password: "請輸入由大小寫字母+數(shù)字組成的6-16位密碼", fixedNum: "請輸入{1}位數(shù)字" }, // 驗(yàn)證的方法, 返回一個(gè)布爾值 methods: { notnull: obj => { return obj.value || obj.value === 0 }, max: obj => { if (!obj.value) return true return obj.conditions[0] >= obj.value.length }, min: obj => { if (!obj.value) return true return obj.value.length >= obj.conditions[0] }, length: obj => { if (!obj.value) return true return obj.conditions[0] <= obj.value.length && obj.value.length <= obj.conditions[1] }, number: obj => { if (!obj.value) return true reg = /^[0-9]+.?[0-9]*$/ return reg.test(obj.value) }, string: obj => { if (!obj.value) return true reg = /^[a-zA-Z0-9]+$/ return reg.test(obj.value) }, moblie: obj => { if (!obj.value) return true reg = /^(1[3,5,8,7]{1}[d]{9})|(((400)-(d{3})-(d{4}))|^((d{7,8})|(d{4}|d{3})-(d{7,8})|(d{4}|d{3})-(d{3,7,8})-(d{4}|d{3}|d{2}|d{1})|(d{7,8})-(d{4}|d{3}|d{2}|d{1}))$)$/ return reg.test(obj.value) }, noChinese: obj => { if (!obj.value) return true reg = /[u4e00-u9fa5]/ return !reg.test(obj.value) }, lon: obj => { if (!obj.value) return true reg = /^[-+]?(0?d{1,2}.d{1,5}|1[0-7]?d{1}.d{1,10}|180.0{1,10})$/ return reg.test(obj.value) }, lat: obj => { if (!obj.value) return true reg = /^[-+]?([0-8]?d{1}.d{1,10}|90.0{1,10})$/ return reg.test(obj.value) }, url: obj => { if (!obj.value) return true reg = /^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://)(([A-Za-z0-9-~]+).)+([A-Za-z0-9-~/])+$/ return reg.test(obj.value) }, repeat: obj => { if (!obj.value) return true return obj.value === obj.value1 }, email: obj => { if (!obj.value) return true reg = /^([-_A-Za-z0-9.]+)@([_A-Za-z0-9]+.)+[A-Za-z0-9]{2,3}$/ return reg.test(obj.value) }, password: obj => { if (!obj.value) return true reg = /^(?=.*d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Zd]{6,16}$/ return reg.test(obj.value) }, fixedNum: obj => { if (!obj.value) return true return obj.value.length === obj.conditions[0] } } }, // 得到驗(yàn)證結(jié)果 checkResult: function (obj) { let result = true, checkType, message = "驗(yàn)證成功", validatorMethods = this.validator.methods, validatorMessage = this.validator.messages // 循環(huán)驗(yàn)證 for (let i = 0, len = obj.rules.length; i < len; i++) { // 得到當(dāng)前驗(yàn)證失敗信息 if (!validatorMethods[obj.rules[i]](obj)) { checkType = obj.rules[i] result = false break } } // 如果驗(yàn)證失敗, 得到驗(yàn)證失敗的結(jié)果集 if (!result) { message = validatorMessage[checkType] if (obj.conditions) { obj.conditions.forEach((item, index) => { message = message.replace("{" + (index + 1) + "}", item) }) } message = message.replace("{0}", obj.label) return {result, message} } return {result, message} } } return validatorObj.checkResult(obj) } export default validate使用示例
validate({label: "username", value: "admin", rules: ["notnull", "length"], conditions: ["2", "10"]}) // 驗(yàn)證username不為空且長度在2-10之間 validate({label: "pawwword", value: "lllyh111", rules: ["notnull", "password"]}) // 驗(yàn)證password由大小寫字母+數(shù)字組成的6-16位密碼
驗(yàn)證返回結(jié)果大概長這樣:
{result: true, message: "驗(yàn)證成功"} {result: false, message: "驗(yàn)證失敗提示"}4.在頁面上的使用
把函數(shù)放在全局,需要做驗(yàn)證的地方直接調(diào)用這個(gè)函數(shù)就ojbk了。
在Elementui中的例子// 檢測號碼 const checkMobile = (rule, value, callback) => { let check = this.$validate({label: "號碼", value, rules: ["moblie"]}) if (!check.result) { callback(new Error(check.message)) } else { callback() } } // 檢測非中文 const checkWechat = (rule, value, callback) => { let check = this.$validate({label: "微信", value, rules: ["noChinese", "max"], conditions: [12]}) if (!check.result) { callback(new Error(check.message)) } else { callback() } }
源碼---如何使用
登錄-系統(tǒng)管理-用戶管理中可看到相關(guān)驗(yàn)證效果
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/100435.html
摘要:一個(gè)驗(yàn)證的過程,一般便是分為這幾步,我們可以按照這個(gè)步驟設(shè)計(jì)出自己的驗(yàn)證函數(shù)。驗(yàn)證的方法,返回一個(gè)布爾值調(diào)用驗(yàn)證方法這里是調(diào)用驗(yàn)證函數(shù)的方法,和上面的定義結(jié)合起來。 為什么要寫驗(yàn)證函數(shù) 將驗(yàn)證過程變成多個(gè)步驟 完成一個(gè)基本的驗(yàn)證函數(shù) 1. 為什么要寫驗(yàn)證函數(shù) 之前寫項(xiàng)目的時(shí)候,一般都是在登錄注冊,修改密碼的時(shí)候有需要些正則的需求,所以每次用到的時(shí)候都是直接從前面的代碼copy過去...
摘要:如果屬性名與名相同,則可以使用簡寫。其它一些語言則會發(fā)出警告或錯(cuò)誤。在中,介紹了一種名為的新數(shù)組函數(shù),可以實(shí)現(xiàn)循環(huán)的簡寫。總結(jié)上述是一些常用的簡寫技巧,如果有其它未提及的簡寫技巧,也歡迎大家補(bǔ)充。 showImg(https://segmentfault.com/img/bVXdza?w=653&h=367); 本文來源于多年的 JavaScript 編碼技術(shù)經(jīng)驗(yàn),適合所有正在使用 J...
原文收錄在我的 GitHub博客 (https://github.com/jawil/blog) ,喜歡的可以關(guān)注最新動態(tài),大家一起多交流學(xué)習(xí),共同進(jìn)步,以學(xué)習(xí)者的身份寫博客,記錄點(diǎn)滴。 在一個(gè)Web項(xiàng)目中,注冊,登錄,修改用戶信息,下訂單等功能的實(shí)現(xiàn)都離不開提交表單。這篇文章就闡述了如何編寫相對看著舒服的表單驗(yàn)證代碼。 假設(shè)我們正在編寫一個(gè)注冊的頁面,在點(diǎn)擊注冊按鈕之前,有如下幾條校驗(yàn)邏輯。 ...
閱讀 2878·2021-10-14 09:43
閱讀 1671·2021-09-29 09:34
閱讀 1755·2021-07-28 00:16
閱讀 2970·2019-08-30 15:53
閱讀 2914·2019-08-30 13:59
閱讀 2970·2019-08-30 13:57
閱讀 1100·2019-08-26 13:38
閱讀 1901·2019-08-26 13:25