怎么在vue中实现input标签通用指令校验?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
移动端通常对于input标签要求输入有一些校验,vue的指令可达到完美校验的作用
预期效果
<input v-model="times" :data-last_value="lastTimes" v-int v-max="8" v-min="2" />
属性data-last_value的值用来缓存用户输入框上一次失去焦点后输入的值,lastTimes是初始化的变量,后续不会再随意更改此值, v-model一定不要和data-last_value绑定同一个变量, 因为这样就起不到记住用户上一次输入值,并利用该值在校验不通过的情况下使用它
指令实现
以下3个指令可完全独立使用
校验整数
const util = {
isNumber(str) {
const num = Number(str);
return Math.floor(num) === num;
}
};
directives: {
int: {
inserted: (el) => {
let oldListener = el.onblur;
el.onblur = (e) => {
if (oldListener) {
oldListener(e);
}
const blurValue = Number(el.value);
// 用data-last_value属性值缓存上一次的值,以便恢复
const lastValue = el.getAttribute('data-last_value');
if (!util.isNumber(blurValue)) {
util.toast('请输入数字');
el.value = lastValue;
el.dispatchEvent(new Event('input'));
}
if (el.value === lastValue) return;
// 更新上一次的值
el.setAttribute('data-last_value', el.value);
}
},
},
}
校验最小值
directives: {
min: {
inserted: (el, binding) => {
const oldListener = el.onblur;
el.onblur = (e) => {
if (oldListener) {
oldListener(e);
}
const blurValue = Number(el.value);
const min = binding.value;
if (blurValue < min) {
// util.toast替换成自己业务的toast提示弹窗
util.toast(`最小值不能小于${min}`);
el.value = min;
el.dispatchEvent(new Event('input'));
}
const lastValue = el.getAttribute('data-last_value');
if (el.value === lastValue) return;
// 更新上一次的值
el.setAttribute('data-last_value', el.value);
}
},
},
}
校验最大值
directives: {
max: {
// 指令的定义
inserted: (el, binding) => {
const oldListener = el.onblur;
el.onblur = (e) => {
if (oldListener) {
oldListener(e);
}
const blurValue = Number(el.value);
const max = binding.value;
if (blurValue > max) {
util.toast(`最大值不能大于${max}`);
el.value = max;
el.dispatchEvent(new Event('input'));
}
const lastValue = el.getAttribute('data-last_value');
if (el.value === lastValue) return;
// 更新上一次的值
el.setAttribute('data-last_value', el.value);
}
},
},
}
关于怎么在vue中实现input标签通用指令校验问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。