自定义指令
创建regular.js文件
import regular from "./regular"; // 引入的正则
let timer = null; // 监听input框,会一直触发,所以做个防抖
export default {
install(Vue) { // install开发新的插件及全局注册组件等
Vue.directive("custom", {
// custom:v-custom,也可以用驼峰来使用
// 驼峰使用方法 uCustom 相当于 v-u-custom
update: (el)=> { // update更新时操作
el.handler = () => {
clearTimeout(timer); // 清空定时器
let val = el.getElementsByTagName("input")[0];
// el-input,有层div,我们要去取其子级
timer = setTimeout(() => { // 定时器
for (let key in regular) { // 循环导入规则对象
if (key === binding.value.regular) {
// binding.value.regular从vue页面传过来参数
// 判断传过来参数是否跟导入规则对象某个属性名相同
if (regular[key].test(val.value)) { // 进行判断
return console.log("成功");
} else {
return (val.value = ""); // 判断失败清空数据
}
}
}
}, 1000);
};
el.addEventListener("keyup", el.handler); // 事件监听-按键触发
}
},
unbind: (el) => { // 只调用一次, 指令与元素解绑时调用
el.removeEventListener("keyup", el.handler); // 移除监听
},
})
}
}
在main.js中全局引入
import regular from "./utils/regular";
Vue.use(regular);
在页面中使用
<el-input v-model="data.name" v-custom="{
regular: '规则对象的属性名'
}"></el-input>
自定义表单校验
创建check.js文件
import regular from "./regular"; // 引入的正则
export const formRule = (rule, value, callback, regularRule, Tips,secondTips, secondRule) => {
// rule, value, callback 原生参数, regularRule(要使用的正则), Tips(提示语), secondRule(第二个要使用的正则),secondTips(第二个提示语)
if (rule.required) {
if (!value) { // 判断是否为空
callback(new Error(Tips)); // 为空提示第一个提示语
} else {
formCheck(rule, value, callback, regularRule, Tips,secondTips, secondRule); // 进行正则校验
}
} else {
callback();
}
};
export const formCheck = (
rule,
value,
callback,
regularRule,
Tips,
secondTips,
secondRule
) => {
if (!value) {
callback();
} else {
for (let key in regular) { // 循环导入正则对象
if (key === regularRule || key === secondRule) { // 判断传入是否与导入的匹配
// (secondRule && regular[secondRule].test(value)) 判断是不是有这个参数
if (
regular[regularRule].test(value) ||
(secondRule && regular[secondRule].test(value))
) {
callback();
} else {
// 判断是否有第二个提示语 有的就显示第二个没有就显示第一个
callback(new Error(secondTips || Tips));
}
}
}
}
};
引入check.js文件
import { formRule } from "@/utils/check";
export default {
data() {
return {
rules:{
user:[{
validator: (rule, value, callback) =>
formRule(rule, value, callback, "a", "请输入正确用户名", "请输入中文或正确手机号",'e'),
required: true,
trigger: "blur",
}]
}
}
}
}
/* rule,value,callback(原本参数),a我们设置校验的第一个规则,第二个参数是我们要提示的语句,第三个是参数是第二个提示语,第四个参数进行两个正则的判断 */
正则规则(均来自网上目前只验证到f,如有错误自行更改)
regular.js文件名
const regular = {
a: /^13[\d]{9}$|^14[7,8]{1}\d{8}$|^15[^4]{1}\d{8}$|^17[3,5,6,7,8]{1}\d{8}$|^18[\d]{9}$|^19[9]{1}\d{8}$/, // 手机号
b: /^[+]{0,1}(\d+)$/, // 正整数
c: /^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+)$/, // 有小数不能为负数
d: /^[\u4e00-\u9fa5-Za-z]{0,30}$/, // 中文或者英文
e: /^[\u4e00-\u9fa5]{0,30}$/, // 只能中文
f: /^\d+(\.\d{1,2})?$/, // 小数后两位
g: /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/, // 身份证十八位
h: /^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$/, // 身份证十五位
i: /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/, // 邮箱
j: /^(0|[1-9][0-9]*)$/, // 零和非零开头的数字
k: /^([1-9][0-9]*)+(.[0-9]{1,2})?$/, // 非零开头的最多带两位小数的数字
l: /^(\-)?\d+(\.\d{1,2})?$/, // 带1-2位小数的正数或负数
m: /^(\-|\+)?\d+(\.\d+)?$/, // 正数、负数、和小数
n: /^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$/, //非零的正整数
o: /^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$/, // 非零的负整数
p: /^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$/, //英文和数字
q: /^[A-Za-z]+$/, //由26个大写英文字母组成的字符串
r: /^[a-zA-Z][a-zA-Z0-9_]{4,15}$/, //帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线)
s: /^[a-zA-Z]\w{5,17}$/, //密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线)
t: /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$/, //强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间)
u: /[1-9][0-9]{4,}/, // QQ号
v: /[1-9]\d{5}(?!\d) /, // 邮编
// w: 12, // 自行添加
// x: 13, // 自行添加
// y: 14, // 自行添加
// z: 15, // 自行添加
};
export default regular;