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 相关文章推荐
在网页中控制wmplayer播放器
Jul 01 Javascript
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
May 13 Javascript
优化Jquery,提升网页加载速度
Nov 14 Javascript
一个字符串反转函数可实现字符串倒序
Sep 15 Javascript
基于JavaScript如何实现ajax调用后台定义的方法
Dec 29 Javascript
jQuery中inArray方法注意事项分析
Jan 25 Javascript
JQuery日期插件datepicker的使用方法
Mar 03 Javascript
Vue.js实现简单ToDoList 前期准备(一)
Dec 01 Javascript
vue slot 在子组件中显示父组件传递的模板
Mar 02 Javascript
vue2.0的虚拟DOM渲染思路分析
Aug 09 Javascript
小程序server请求微信服务器超时的解决方法
May 21 Javascript
vue内置组件component--通过is属性动态渲染组件操作
Jul 28 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生成静态页面详解
2006/11/19 PHP
在MongoDB中模拟Auto Increment的php代码
2011/03/06 PHP
php ZipArchive压缩函数详解实例
2013/11/06 PHP
ThinkPHP之N方法实例详解
2014/06/20 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
深入理解PHP原理之执行周期分析
2016/06/01 PHP
浅析PHP7新功能及语法变化总结
2016/06/17 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
jQuery学习笔记之 Ajax操作篇(一) - 数据加载
2014/06/23 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
JavaScript获取指定元素位置的方法
2015/04/08 Javascript
BootStrap的JS插件之轮播效果案例详解
2016/05/16 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
JavaScript模块模式实例详解
2017/10/25 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
springMvc 前端用json的方式向后台传递对象数组方法
2018/08/07 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
[44:51]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第二场
2018/04/05 DOTA
[01:06:30]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第二场 1月9日
2021/03/11 DOTA
python函数装饰器用法实例详解
2015/06/04 Python
Python 实现文件的全备份和差异备份详解
2016/12/27 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
python退出循环的方法
2020/06/18 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
业务员岗位职责范本
2013/12/15 职场文书
致短跑运动员广播稿
2014/01/09 职场文书
索桥的故事教学反思
2014/02/06 职场文书
《雷雨》教学反思
2014/02/20 职场文书
小学少先队辅导员述职报告
2015/01/10 职场文书
幼儿园见习总结
2015/06/23 职场文书
Java中try catch处理异常示例
2021/12/06 Java/Android