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 相关文章推荐
javascript动态添加、修改、删除对象的属性与方法详解
Jan 27 Javascript
返回上一页并自动刷新的JavaScript代码
Feb 19 Javascript
浅谈 javascript 事件处理
Jan 04 Javascript
使用pjax实现无刷新更改页面url
Feb 05 Javascript
PageSwitch插件实现100种不同图片切换效果
Jul 28 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
Aug 24 Javascript
Bootstrap 附加导航(Affix)插件实例详解
Jun 01 Javascript
vue.js实现仿原生ios时间选择组件实例代码
Dec 21 Javascript
vue导出html、word和pdf的实现代码
Jul 31 Javascript
微信小程序HTTP接口请求封装的实现
Feb 21 Javascript
react native 原生模块桥接的简单说明小结
Feb 26 Javascript
jQuery表单选择器用法详解
Aug 22 jQuery
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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
php用户注册页面利用js进行表单验证具体实例
2013/10/17 PHP
Windows下的PHP安装文件线程安全和非线程安全的区别
2014/04/23 PHP
3款值得推荐的微信开发开源框架
2014/10/28 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
PHP实现页面静态化的超简单方法
2016/09/06 PHP
PHP手机号中间四位用星号*代替显示的实例
2017/06/02 PHP
JS异常处理的一个想法(sofish)
2013/03/14 Javascript
jquery 倒计时效果实现秒杀思路
2013/09/11 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
vue中使用cookies和crypto-js实现记住密码和加密的方法
2018/10/18 Javascript
解决layui动态添加的元素click等事件触发不了的问题
2019/09/20 Javascript
vue下axios拦截器token刷新机制的实例代码
2020/01/17 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
Python之Class&amp;Object用法详解
2019/12/25 Python
15行Python代码实现免费发送手机短信推送消息功能
2020/02/27 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
快速创建python 虚拟环境
2020/11/28 Python
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
指针和引用有什么区别
2013/01/13 面试题
运动会演讲稿
2014/05/07 职场文书
优秀党务工作者先进事迹材料
2014/12/25 职场文书
会议开幕词
2015/01/28 职场文书
公司清洁工岗位职责
2015/04/15 职场文书
运动会通讯稿200字
2015/07/20 职场文书