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 相关文章推荐
将字符串转换成gb2312或者utf-8编码的参数(js版)
Apr 10 Javascript
基于JavaScript 类的使用详解
May 07 Javascript
ajax请求乱码的解决方法(中文乱码)
Apr 10 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
May 08 Javascript
JavaScript实现的in_array函数
Aug 27 Javascript
浅谈String.valueOf()方法的使用
Jun 06 Javascript
Bootstrap编写一个兼容主流浏览器的受众门户式风格页面
Jul 01 Javascript
js入门之Function函数的使用方法【新手必看】
Nov 22 Javascript
node.js文件上传重命名以及移动位置的示例代码
Jan 19 Javascript
讲解vue-router之什么是嵌套路由
May 28 Javascript
在vue中使用SockJS实现webSocket通信的过程
Aug 29 Javascript
JavaScript实现联动菜单特效
Jan 07 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
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
ThinkPHP做文字水印时提示call an undefined function exif_imagetype()解决方法
2014/10/30 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
PHP设计模式之模板模式定义与用法详解
2018/12/20 PHP
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
JavaScript设计模式经典之工厂模式
2016/02/24 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
vue2.0 下拉框默认标题设置方法
2018/08/22 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
Python写的Discuz7.2版faq.php注入漏洞工具
2014/08/06 Python
在Linux中通过Python脚本访问mdb数据库的方法
2015/05/06 Python
python八大排序算法速度实例对比
2017/12/06 Python
100行Python代码实现自动抢火车票(附源码)
2018/01/11 Python
使用Python AIML搭建聊天机器人的方法示例
2018/07/09 Python
利用python循环创建多个文件的方法
2018/10/25 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
深入浅析Python中的迭代器
2019/06/04 Python
pytorch 输出中间层特征的实例
2019/08/17 Python
python numpy数组中的复制知识解析
2020/02/03 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
HTML5通用接口详解
2016/06/12 HTML / CSS
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
超市理货员岗位职责
2014/07/04 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
干部作风建设工作总结
2014/10/29 职场文书
2014年老干部工作总结
2014/11/21 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
使用MybatisPlus打印sql语句
2022/04/22 SQL Server