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 相关文章推荐
在线游戏大家来找茬II
Sep 30 Javascript
JS应用之禁止抓屏、复制、打印
Feb 21 Javascript
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
Feb 14 Javascript
在次封装easyui-Dialog插件实现代码
Nov 14 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
May 15 Javascript
javascript类型转换示例
Apr 29 Javascript
JS HTML5实现拖拽移动列表效果
Aug 27 Javascript
功能强大的Bootstrap使用手册(一)
Aug 02 Javascript
详解angular2封装material2对话框组件
Mar 03 Javascript
angular指令笔记ng-options的使用方法
Sep 18 Javascript
原生JS实现获取及修改CSS样式的方法
Sep 04 Javascript
javascript Canvas动态粒子连线
Jan 01 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
PHPAnalysis中文分词类详解
2014/06/13 PHP
PHP生成plist数据的方法
2015/06/16 PHP
php实现的简易扫雷游戏实例
2015/07/09 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
PHP实现基于面向对象的mysqli扩展库增删改查操作工具类
2017/07/18 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
关于include标签导致js路径找不到的问题分析及解决
2013/07/09 Javascript
javascript避免数字计算精度误差的方法详解
2014/03/05 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
2015/10/16 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
vue利用v-for嵌套输出多层对象,分别输出到个表的方法
2018/09/07 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
Vue实现点击显示不同图片的效果
2019/08/10 Javascript
Javascript实现简易天数计算器
2020/05/18 Javascript
[02:18]《我与DAC》之工作人员:为了热爱DOTA2的玩家们
2018/03/28 DOTA
Python对数据库操作
2016/03/28 Python
小白如何入门Python? 制作一个网站为例
2018/03/06 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
python基于FTP实现文件传输相关功能代码实例
2019/09/28 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
2020/02/16 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
有关HTML5中背景音乐的自动播放功能
2017/10/16 HTML / CSS
经典c++面试题四
2015/05/14 面试题
2014年小学元旦活动方案
2014/02/12 职场文书
总经理任命书范本
2014/06/05 职场文书
运动会加油稿100字
2014/09/19 职场文书
个人查摆问题自查报告
2014/10/16 职场文书
十岁生日答谢词
2015/01/05 职场文书
Python生成九宫格图片的示例代码
2021/04/14 Python
浅谈PHP7中的一些小技巧
2021/05/29 PHP