vue input标签通用指令校验的实现


Posted in Javascript onNovember 05, 2019

移动端通常对于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);
    }
   },
  },
 }

小小的校验指令没想到里面还有那么多细节~~~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
$()JS小技巧
Jul 21 Javascript
一个关于javascript匿名函数的问题分析
Mar 30 Javascript
javascript学习笔记(十九) 节点的操作实现代码
Jun 20 Javascript
JS中使用sort结合localeCompare实现中文排序实例
Jul 23 Javascript
jquery验证手机号是否正确实例讲解
Nov 17 Javascript
逻辑表达式中与或非的用法详解
Jun 06 Javascript
简单模拟node.js中require的加载机制
Oct 27 Javascript
VUE 配置vue-devtools调试工具及安装方法
Sep 30 Javascript
element form 校验数组每一项实例代码
Oct 10 Javascript
在vue中实现echarts随窗体变化
Jul 27 Javascript
vue实现下载文件流完整前后端代码
Nov 17 Vue.js
mapboxgl实现带箭头轨迹线的代码
Jan 04 Javascript
vue子传父关于.sync与$emit的实现
Nov 05 #Javascript
vue 路由子组件created和mounted不起作用的解决方法
Nov 05 #Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
Nov 05 #Javascript
vue Tab切换以及缓存页面处理的几种方式
Nov 05 #Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
Nov 05 #Javascript
vue 解决路由只变化参数页面组件不更新问题
Nov 05 #Javascript
vue 实现路由跳转时更改页面title
Nov 05 #Javascript
You might like
无线电广播与收音机发展的历史回眸
2021/03/02 无线电
php实现图片文件与下载文件防盗链的方法
2014/11/03 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
2015/04/21 PHP
学习javascript面向对象 javascript实现继承的方式
2016/01/04 Javascript
bootstrap中使用google prettify让代码高亮的方法
2016/10/21 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
2016/12/17 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
浅谈javascript中的prototype和__proto__的理解
2019/04/07 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
详解ng-alain动态表单SF表单项设置必填和正则校验
2019/06/11 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
python和ruby,我选谁?
2017/09/13 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
python和go语言的区别是什么
2020/07/20 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
2020/12/17 Python
CSS3之背景尺寸Background-size使用介绍
2013/10/14 HTML / CSS
HTML5计时器小例子
2013/10/15 HTML / CSS
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
中国跨镜手机配件批发在线商店:TVC-Mall
2019/08/20 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
ktv总经理岗位职责
2014/02/17 职场文书
公益广告语集锦
2014/03/13 职场文书
转让协议书范本
2014/04/15 职场文书
低碳生活的宣传标语
2014/06/23 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书
高考升学宴答谢词
2015/01/20 职场文书
个人自荐书范文
2015/03/09 职场文书
2014年个人年终总结
2015/03/09 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
tensorflow学习笔记之tfrecord文件的生成与读取
2021/03/31 Python
pytorch中Schedule与warmup_steps的用法说明
2021/05/24 Python
python四种出行路线规划的实现
2021/06/23 Python