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 相关文章推荐
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
Jan 11 Javascript
选择复选框按钮置灰否则按钮可用
May 22 Javascript
jquery实现聚光灯效果的方法
Feb 06 Javascript
学习JavaScript设计模式之代理模式
Jan 12 Javascript
使用JavaScript实现ajax的实例代码
May 11 Javascript
jQuery表单事件实例代码分享
Aug 18 Javascript
jQuery实现简单的回到顶部totop功能示例
Oct 16 jQuery
基于Bootstrap实现城市三级联动
Nov 23 Javascript
iview日期控件,双向绑定日期格式的方法
Mar 15 Javascript
Vue路由钩子之afterEach beforeEach的区别详解
Jul 15 Javascript
LayUI表格批量删除方法
Aug 15 Javascript
详解如何在webpack中做预渲染降低首屏空白时间
Aug 22 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 mkdir()定义和用法
2009/01/14 PHP
PHP生成唯一订单号
2015/07/05 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
HTML页面如何象ASP一样接受参数
2007/02/07 Javascript
firefox浏览器用jquery.uploadify插件上传时报HTTP 302错误
2015/03/01 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
理解JavaScript的变量的入门教程
2015/07/07 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
Javascrip实现文字跳动特效
2016/11/27 Javascript
JS获取日期的方法实例【昨天,今天,明天,前n天,后n天的日期】
2017/09/28 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
解决vue 格式化银行卡(信用卡)每4位一个符号隔断的问题
2018/09/14 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
2020/03/07 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
[01:56]林书豪DOTA2上海特级锦标赛励志短片
2016/03/05 DOTA
virtualenv实现多个版本Python共存
2017/08/21 Python
Python django框架应用中实现获取访问者ip地址示例
2019/05/17 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
python实现控制电脑鼠标和键盘,登录QQ的方法示例
2019/07/06 Python
python 矢量数据转栅格数据代码实例
2019/09/30 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
python的range和linspace使用详解
2019/11/27 Python
如何基于Python创建目录文件夹
2019/12/31 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
深入理解Python变量的数据类型和存储
2021/02/01 Python
linux面试题参考答案(10)
2016/10/26 面试题
人事任命书范文
2014/06/04 职场文书
旷工检讨书1000字
2015/01/01 职场文书
实习单位意见
2015/06/04 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
Ruby处理CSV数据方法详解
2022/04/18 Ruby