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 相关文章推荐
jQuery在IE下使用未闭合的xml代码创建元素时的Bug介绍
Jan 10 Javascript
js实现拖拽 闭包函数详细介绍
Nov 25 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
Jun 29 Javascript
innerHTML中标签可以换行的方法汇总
Aug 14 Javascript
jQuery插件之jQuery.Form.js用法实例分析(附demo示例源码)
Jan 04 Javascript
jqGrid 学习笔记整理——进阶篇(一 )
Apr 17 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
May 17 Javascript
Vue中fragment.js使用方法详解
Mar 09 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
Apr 07 jQuery
微信小程序网络请求封装示例
Jul 24 Javascript
基于Vue+ElementUI的省市区地址选择通用组件
Nov 20 Javascript
cypress测试本地web应用
Jun 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
php使用百度天气接口示例
2014/04/22 PHP
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
Yii入门教程之目录结构、入口文件及路由设置
2014/11/25 PHP
简单谈谈favicon
2015/06/10 PHP
php判断linux下程序问题实例
2015/07/09 PHP
php两点地理坐标距离的计算方法
2018/12/29 PHP
javascript ajax的5种状态介绍
2014/08/18 Javascript
jquery实现textarea 高度自适应
2015/03/11 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
实例解析jQuery工具函数
2016/12/01 Javascript
Bootstrap 模态框实例插件案例分析
2016/12/28 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
Vue.js 中的 v-cloak 指令及使用详解
2018/11/19 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
Python通过select实现异步IO的方法
2015/06/04 Python
微信跳一跳python辅助脚本(总结)
2018/01/11 Python
python pandas 如何替换某列的一个值
2018/06/09 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
详解HTML5通讯录获取指定多个人的信息
2016/12/20 HTML / CSS
泰国网上购物:Shopee泰国
2018/09/14 全球购物
青年创业培训欢迎词
2014/01/08 职场文书
校园文化建设方案
2014/02/03 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
自我工作评价范文
2015/03/06 职场文书
oracle delete误删除表数据后如何恢复
2022/06/28 Oracle