vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】


Posted in Javascript onJune 01, 2020

本文实例讲述了vue使用自定义事件的表单输入组件用法。分享给大家供大家参考,具体如下:

自定义事件可以用来创建自定义的表单输入组件,使用 v-model 来进行数据双向绑定。

v-model的实现原理 :

<input v-model="something">

这不过是以下示例的语法糖:

<input
v-bind:value="something"
v-on:input="something = $event.target.value">

在开发项目中,当遇到日期数据时,往往后台的日期数据都为long型,而前台显示成日期型,在使用v-model时,需要转换一下,为了简化转换过程,对此实现自定义日期输入组件,该组件接收long型日期数据,显示为date型,通过v-model实现双向绑定

自定义日期输入组件实现代码:

dates.vue组件

<template>
   <input ref='dateinput' type="date" class="form-control" v-bind:value="svalue(value)" v-on:input="uvalue($event.target.value)" />
</template>
<script type="text/javascript">
  export default{
    props:['value'],
    methods:{
      svalue(value){
        if(value) {
          return $api.dateFormat(value);
        }else{
          return '';
        }
      },
      uvalue(value){
        var _val = value.split('-');
        //大于1970时才触发事件,以防止用户手动输入年份时计算不正确
        if(value && _val[0]>=1970){
          this.$emit('input',$api.getLong(value));
        }
      }
    }
  }
  //dateFormat函数 long转date型
  var dateFormat=function(longTypeDate){ 
    var dateType = ""; 
    if(longTypeDate){
      longTypeDate = parseInt(longTypeDate);
      var date = new Date(longTypeDate); 
      dateType += date.getFullYear();  //年 
      dateType += "-" + getMonth(date); //月  
      dateType += "-" + getDay(date);  //日 
    }else{
      dateType = (new Date()).format("yyyy-MM-dd") ;
    }
    return dateType;
  } 
  //返回 01-12 的月份值  
  var getMonth=function (date){ 
    var month = ""; 
    month = date.getMonth() + 1; //getMonth()得到的月份是0-11 
    if(month<10){ 
      month = "0" + month; 
    } 
    return month; 
  } 
  //返回01-30的日期 
  var getDay=function (date){ 
    var day = ""; 
    day = date.getDate(); 
    if(day<10){ 
      day = "0" + day; 
    } 
    return day; 
  }
  //getLong函数 date转long型
  var getLong = function(date){
    date=Date.parse(date.replace(new RegExp("-","gm"),"/"));
    return date;
  }
</script>

使用方法

<template>
  <div>
    <dates name="guaranteeBeginDay" v-model="guaranteeBeginDay" />
  </div>
</template>
<script>
  import dates from '../dates/dates.vue'
  export default{
    data(){
      return {
        guaranteeBeginDay:1509697628823 //long型数据
      }
    }
  }
</script>

项目需求,在表单中货币组件,用户输入数字,为其自动添加逗号分隔符,且只能输入数字,限制小数点后最多两位,实现了自定义货币组件

自定义货币组件实现代码:

currency.vue组件

<template>
  <input refs="currencyinput" class="form-control" type="text" v-bind:value="showValue(value)" v-on:input="updateValue($event)" />
</template>

<script type="text/javascript">

  export default{
    props:['value'],
    methods:{
      showValue(value){
        if(!!!value){
         return '0';
        }
        return (value+'').replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,');
      },
      updateValue(el){
        var value = el.target.value ;
        value = value.replace(/[^\d.]/g,"")
             .replace(/\.{2,}/g,".")
             .replace(".","$#$").replace(/\./g,"").replace("$#$",".")
             .replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3');//只能输入两个小数 
        if(value.indexOf(".") < 0 && value !=""){//以上已经过滤,此处控制的是如果没有小数点,首位不能为类似于 01、02的金额 
          if(value.substr(0,1) == '0' && value.length == 2){ 
            value = value.substr(1,value.length);   
          } 
        }
        el.target.value = value.replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,');

        this.$emit('input', value);
      }
    }
  }
</script>

使用方法

<template>
  <div>
    <currency name="money" v-model="money" />
  </div>
</template>
<script>
  import dates from '../currency/currency.vue'
  export default{
    data(){
      return {
        money:12934350.34 
      }
    }
  }
</script>

实例图片

vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】

一开始不明白

自定义组件中绑定的input事件中

this.$emit('input',$api.getLong(value)); || this.$emit('input', value);

的含义

为什么input事件中还要触发input事件,这样不就造成循环调用了吗,后来深入研究,

才明白,$emit是用于子组件触发父组件的事件函数,所以此处的input事件为调用该组件的父组件的input事件

<dates name="guaranteeBeginDay"
v-model="guaranteeBeginDay" /> || <currency 
name="money" v-model="money" />

而父组件的input事件则是v-model的实现原理

<input
v-bind:value="something"
v-on:input="something = $event.target.value">

所以子组件的input事件会触发父组件的input事件,进而改变vue data数据,data数据变化触发v-bind:value来更新页面数据显示。

希望本文所述对大家vue.js程序设计有所帮助。

Javascript 相关文章推荐
Jquery easyUI 更新行示例
Mar 06 Javascript
Javascript常用字符串判断函数代码分享
Dec 08 Javascript
JavaScript自定义数组排序方法
Feb 12 Javascript
js判断登陆用户名及密码是否为空的简单实例
May 16 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
Jun 17 Javascript
Bootstrap中的Dropdown下拉菜单更改为悬停(hover)触发
Aug 31 Javascript
使用AngularJS2中的指令实现按钮的切换效果
Mar 27 Javascript
jquery 校验中国身份证号码实例详解
Apr 11 jQuery
javascript  数组排序与对象排序的实例
Jul 17 Javascript
浅谈Javascript中的对象和继承
Apr 19 Javascript
JS开发自己的类库实例分析
Aug 28 Javascript
js实现简单页面全屏
Sep 17 Javascript
Bootstrap table 服务器端分页功能实现方法示例
Jun 01 #Javascript
easyUI 实现的后台分页与前台显示功能示例
Jun 01 #Javascript
JS如何寻找数组中心索引过程解析
Jun 01 #Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
Jun 01 #Javascript
bootstrap-table后端分页功能完整实例
Jun 01 #Javascript
jQuery实现倒计时功能完整示例
Jun 01 #jQuery
微信小程序订阅消息(java后端实现)开发
Jun 01 #Javascript
You might like
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
PHP实现数据四舍五入的方法小结【4种方法】
2019/03/27 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
Javascript中的作用域和上下文深入理解
2015/07/03 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
2016/01/29 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
使用JSON作为函数的参数的优缺点
2016/10/27 Javascript
百度搜索框智能提示案例jsonp
2016/11/28 Javascript
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
vue.js整合mint-ui里的轮播图实例代码
2017/12/27 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
解决layui-open关闭自身窗口的问题
2019/09/10 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
Vue中通过属性绑定为元素绑定style行内样式的实例代码
2020/04/30 Javascript
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
Python 常用string函数详解
2016/05/30 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
Python OpenCV实现视频分帧
2019/06/01 Python
Python根据服务获取端口号的方法
2019/09/25 Python
Python docutils文档编译过程方法解析
2020/06/23 Python
python输入中文的实例方法
2020/09/14 Python
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
Viking比利时:购买办公用品
2019/10/30 全球购物
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
优秀班主任经验交流材料
2014/06/02 职场文书
岗位说明书标准范本
2014/07/30 职场文书
邹越演讲观后感
2015/06/15 职场文书
2016年秋季运动会通讯稿
2015/11/25 职场文书
参观监狱警示教育心得体会
2016/01/15 职场文书
tensorflow中的梯度求解及梯度裁剪操作
2021/05/26 Python
Redis Lua脚本实现ip限流示例
2022/07/15 Redis