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 相关文章推荐
禁用Tab键JS代码兼容Firefox和IE
Apr 18 Javascript
JavaScript中的console.dir()函数介绍
Dec 29 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
Mar 02 Javascript
jquery利用json实现页面之间传值的实例解析
Dec 12 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
Aug 25 Javascript
node 使用 async 控制并发的方法
May 07 Javascript
vue左右侧联动滚动的实现代码
Jun 06 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
Aug 29 Javascript
vue项目中极验验证的使用代码示例
Dec 03 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
Sep 07 Javascript
js+canvas实现画板功能
Sep 13 Javascript
解决vue页面刷新,数据丢失的问题
Nov 24 Vue.js
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
PHP安装攻略:常见问题解答(三)
2006/10/09 PHP
?繁体转换的class
2006/10/09 PHP
MySQL修改密码方法总结
2008/03/25 PHP
Smarty中常用变量操作符汇总
2014/10/27 PHP
php简单获取目录列表的方法
2015/03/24 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
PHP自定义函数获取URL中一级域名的方法
2016/08/23 PHP
PHP基于imagick扩展实现合成图片的两种方法【附imagick扩展下载】
2017/11/14 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
处理及遍历XML文档DOM元素属性及方法整理
2013/08/23 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
简单实现异步编程promise模式
2015/07/31 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
2016/05/17 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
nodejs中使用HTTP分块响应和定时器示例代码
2017/03/19 NodeJs
微信小程序 聊天室简单实现
2017/04/19 Javascript
微信小程序开发之toast提示插件使用示例
2017/06/08 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
Angular5升级RxJS到5.5.3报错:EmptyError: no elements in sequence的解决方法
2018/04/09 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
React如何实现浏览器打印部分内容详析
2019/05/19 Javascript
vue+element UI实现树形表格
2020/12/29 Vue.js
Django如何防止定时任务并发浅析
2019/05/14 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
2020/03/24 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
python使用numpy中的size()函数实例用法详解
2021/01/29 Python
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
上班迟到检讨书
2014/01/10 职场文书
求职信的七个关键技巧
2014/02/05 职场文书
关于运动会的口号
2014/06/07 职场文书
领导干部整治奢华浪费之风思想汇报
2014/10/07 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
配置nginx 重定向到系统维护页面
2021/06/08 Servers