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 相关文章推荐
解决Extjs4中form表单提交后无法进入success函数问题
Nov 26 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
Jan 15 Javascript
JavaScript中使用指数方法Math.exp()的简介
Jun 15 Javascript
实例解析Array和String方法
Dec 14 Javascript
JavaScript实现三级联动效果
Jul 15 Javascript
bootstrap Table的一些小操作
Nov 01 Javascript
Vue2仿淘宝实现省市区三级联动
Apr 15 Javascript
JS严格模式知识点总结
Feb 27 Javascript
微信小程序上线发布流程图文详解
May 06 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
May 30 jQuery
详解微信小程序图片地扯转base64解决方案
Aug 18 Javascript
基于Element封装一个表格组件tableList的使用方法
Jun 29 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 定界符 使用技巧
2009/06/14 PHP
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
javascript 数组排序函数
2009/08/20 Javascript
初识javascript 文档碎片
2010/07/13 Javascript
用方法封装javascript的new操作符(一)
2010/12/25 Javascript
js 3秒后跳转页面的实现代码
2014/03/10 Javascript
js重写alert控件(适合学习js的新手朋友)
2014/08/24 Javascript
js闭包的用途详解
2014/11/09 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
Jquery动态替换div内容及动态展示的方法
2015/01/23 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
2016/09/05 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
ES6新特性三: Generator(生成器)函数详解
2017/04/21 Javascript
详解React-Native全球化多语言切换工具库react-native-i18n
2017/11/03 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
使用vuepress搭建静态博客的示例代码
2019/02/14 Javascript
跟老齐学Python之dict()的操作方法
2014/09/24 Python
利用Python命令行传递实例化对象的方法
2016/11/02 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
Python如何实现强制数据类型转换
2019/11/22 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
日本著名化妆品零售网站:Cosme Land
2019/03/01 全球购物
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
Android笔试题总结
2014/11/29 面试题
J2EE中的容器都包括哪些
2013/08/21 面试题
工程招投标邀请书
2014/01/30 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
村级干部党员公开承诺事项
2015/05/04 职场文书
消防演习感想
2015/08/10 职场文书
mysql如何配置白名单访问
2021/06/30 MySQL