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 cookie插件代码类
May 26 Javascript
JavaScript中null与undefined分析
Jul 25 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
Nov 05 Javascript
JQ获取动态加载的图片大小的正确方法分享
Nov 08 Javascript
javascript实现全局匹配并替换的方法
Apr 27 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
Jun 16 Javascript
Javascript 一些需要注意的细节(必看篇)
Jul 08 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
Sep 18 Javascript
jQuery实现的上传图片本地预览效果简单示例
Mar 29 jQuery
解决jquery的ajax调取后端数据成功却渲染失败的问题
Aug 08 jQuery
js实现unicode码字符串与utf8字节数据互转详解
Mar 21 Javascript
vue 移动端记录页面浏览位置的方法
Mar 11 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
destoon实现资讯信息前面调用它所属分类的方法
2014/07/15 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
PHP判断字符串长度的两种方法很实用
2015/09/22 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
XHTML下,JS浮动代码失效的问题
2009/11/12 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
js格式化时间的方法
2015/12/18 Javascript
bootstrap手风琴制作方法详解
2017/01/11 Javascript
无循环 JavaScript(map、reduce、filter和find)
2017/04/08 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
js核心基础之闭包的应用实例分析
2019/05/11 Javascript
微信小程序引入Vant组件库过程解析
2019/08/06 Javascript
vue项目引入ts步骤(小结)
2019/10/31 Javascript
基于JavaScript判断两个对象内容是否相等
2020/01/10 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
Vue 中获取当前时间并实时刷新的实现代码
2020/05/12 Javascript
vue实现输入框自动跳转功能
2020/05/20 Javascript
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
2020/06/05 Javascript
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
2020/03/24 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
利用python对mysql表做全局模糊搜索并分页实例
2020/07/12 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
4款Python 类型检查工具,你选择哪个呢?
2020/10/30 Python
Django中使用Celery的方法步骤
2020/12/07 Python
酒店总经理欢迎词
2014/01/15 职场文书
质量承诺书范文
2014/03/27 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
拾金不昧锦旗标语
2014/06/27 职场文书
乡镇平安建设汇报材料
2014/08/25 职场文书
军训通讯稿范文
2015/07/18 职场文书
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技