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 表单规则集合对象
Jul 21 Javascript
JS 对象介绍
Jan 20 Javascript
开发插件的两个方法jquery.fn.extend与jquery.extend
Nov 21 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
Apr 30 Javascript
jQuery前端开发35个小技巧
May 24 Javascript
jQuery查找dom的几种方法效率详解
May 17 jQuery
JS组件系列之Gojs组件 前端图形化插件之利器
Nov 29 Javascript
p5.js入门教程和基本形状绘制
Mar 15 Javascript
在angular 6中使用 less 的实例代码
May 13 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
Mar 29 Javascript
python实现迭代法求方程组的根过程解析
Nov 25 Javascript
vue 动态给每个页面添加title、关键词和描述的方法
Aug 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中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
php递归法读取目录及文件的方法
2015/01/30 PHP
基于PHP给大家讲解防刷票的一些技巧
2015/11/18 PHP
学习ExtJS fit布局使用说明
2009/10/08 Javascript
js 中{},[]中括号,大括号使用详解
2011/05/12 Javascript
来自国外的30个基于jquery的Web下拉菜单
2012/06/22 Javascript
js渐变显示渐变消失示例代码
2013/08/01 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
jQuery EasyUI 菜单与按钮之创建简单的菜单和链接按钮
2015/11/18 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
Bootstrap风格的zTree右键菜单
2017/02/17 Javascript
基于vue实现分页效果
2017/11/06 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
一文了解vue-router之hash模式和history模式
2019/05/31 Javascript
uploadify插件实现多个图片上传并预览
2019/09/30 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
node.js获取参数的常用方法(总结)
2017/05/29 Python
python3爬取数据至mysql的方法
2018/06/26 Python
利用nohup来开启python文件的方法
2019/01/14 Python
Jupyter Notebook折叠输出的内容实例
2020/04/22 Python
利用python+request通过接口实现人员通行记录上传功能
2021/01/13 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
HTML5 实现图片上传预处理功能
2020/02/06 HTML / CSS
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
几个常见的软件测试问题
2016/09/07 面试题
轻化专业学生实习自我鉴定
2013/09/20 职场文书
即将毕业大学生自荐信
2014/01/24 职场文书
优秀的应届生自荐信
2014/05/23 职场文书
敬老院志愿者活动总结
2015/05/06 职场文书
校运会加油稿大全
2015/07/22 职场文书