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 相关文章推荐
制作特殊字的脚本
Jun 26 Javascript
Javascript操纵Cookie实现购物车程序
Nov 23 Javascript
检测是否已安装 .NET Framework 3.5的js脚本
Feb 14 Javascript
ie 调试javascript的工具
Apr 29 Javascript
javascript 进阶篇2 CSS XML学习
Mar 14 Javascript
Bootstrap风格的WPF样式
Dec 07 Javascript
利用node.js搭建简单web服务器的方法教程
Feb 20 Javascript
easyUI下拉列表点击事件使用方法
May 18 Javascript
前端页面文件拖拽上传模块js代码示例
May 19 Javascript
js通过循环多张图片实现动画效果
Dec 19 Javascript
vue2.x 对象劫持的原理实现
Apr 19 Javascript
ant design vue datepicker日期选择器中文化操作
Oct 28 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
PHP中Session和Cookie是如何操作的
2015/10/10 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
Yii2结合Workerman的websocket示例详解
2018/09/10 PHP
JavaScript学习笔记记录我的旅程
2012/05/23 Javascript
让浏览器DOM元素最后加载的js方法
2014/07/29 Javascript
Javascript让DEDECMS告别手写Tag
2014/09/01 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
Select下拉框模糊查询功能实现代码
2016/07/22 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
详解Javascript函数声明与递归调用
2016/10/22 Javascript
js+html5生成自动排列对话框实例
2017/10/09 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
深入分析element ScrollBar滚动组件源码
2019/01/22 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
云服务器部署Node.js项目的方法步骤(小白系列)
2020/03/23 Javascript
[02:01]大师之路——DOTA2完美大师赛11月论剑上海
2017/11/06 DOTA
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
Python实现文件按照日期命名的方法
2015/07/09 Python
python实现杨辉三角思路
2017/07/14 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
Python绘制动态水球图过程详解
2020/06/03 Python
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
西班牙最好的在线购买葡萄酒的商店:Vinoseleccion
2019/10/30 全球购物
继承公证书样本
2014/04/04 职场文书
初一学生期末评语
2014/04/24 职场文书
2014最新党员批评与自我批评材料
2014/09/24 职场文书
关于迟到的检讨书
2015/05/06 职场文书
刑事撤诉申请书
2015/05/18 职场文书
大学军训心得体会800字
2016/01/11 职场文书
Golang的继承模拟实例
2021/06/30 Golang