基于element-ui封装表单金额输入框的方法示例


Posted in Javascript onJanuary 06, 2021

在日常的迭代开发中通常我们会遇到这样的场景:在一个表单中需要用户输入金额,并校验金额的格式。这个需求你一定遇到过,但是现在,我们还需要做到:当用户离开输入框(失去焦点)时,输入的内容变成了用逗号每隔 3 位分隔的数字,并展示给用户。且最后提交金额时,参数的值仍然是正常数字,不包含逗号。

基于element-ui封装表单金额输入框的方法示例

遇到这种需求,我们首先要想到「表单中的金额输入框」是常见到的功能。既然是常见的功能,我们要将它抽象封装起来,做到随时可用于任何表单中,用一行代码代替重复作业。

基于element-ui封装表单金额输入框的方法示例

像表单项一样,我们需要给组件传递 label,绑定值的 keyplaceholder 用于展示在表单中;还需要传递整个 form 对象,表单的 rules 进来。另外,考虑到需要给一个遮罩层展示格式化后的金额,我们还需要传递 width 决定遮罩层宽度。

基于element-ui封装表单金额输入框的方法示例

注意我们上面的需求,当 input 框触发 blur 事件时,我们首先需要校验用户输入的内容是否为正数且可保留两位小数。这时就用到了传递进来的 rules,拿它来校验。若通过校验则展开格式化后的金额,不通过就触发 element-ui 本身的校验规则提示。注意看 @blur 触发的 blurInput 方法,用于去掉输入内容前面的 0,是否符合校验条件,最后决定是否展开格式化后的金额。

基于element-ui封装表单金额输入框的方法示例

如果没问题,通过了校验,就需要根据输入内容格式化金额。利用 computed 计算得到。

组件的设计思想大致如下:

基于element-ui封装表单金额输入框的方法示例

完整的组件代码如下:

},
  rules: {
   type: Object,
   default: () => { },
  },
 },
 data () {
  return {
   showFormatPrice: false, // 是否显示遮罩
  }
 },
 computed: {
  formaterPrice () {
   if (
    this.form.deceivedAmount !== '' &&
    this.form.deceivedAmount !== null
   ) {
    // 去掉前面的0
    const integer = this.form.deceivedAmount.split('.')[0]
    const decimal = this.form.deceivedAmount.split('.')[1]
     ? `.${this.form.deceivedAmount.split('.')[1]}`
     : ''
    return `${integer
     .toString()
     .replace(/(?=(?!^)(\d{3})+$)/g, ',')}${decimal}`
   } else {
    return ''
   }
  },
 },
 methods: {
  // 聚焦金额输入框
  focusInput () {
   this.showFormatPrice = false
   this.$refs.input.focus()
  },
  // 失焦金额输入框
  blurInput () {
   if (this.form.deceivedAmount !== '') {
    // 去掉前面的0
    const integer = Number(this.form.deceivedAmount.split('.')[0])
    const decimal = this.form.deceivedAmount.split('.')[1]
     ? `.${this.form.deceivedAmount.split('.')[1]}`
     : ''
    this.form.deceivedAmount = isNaN(`${integer}${decimal}`)
     ? this.form.deceivedAmount
     : `${integer}${decimal}`
    if (typeof this.rules[this.prop][0].pattern !== 'object') {
     throw `请确保 rules[${this.prop}][0].pattern 为正则表达式`
     return
    }
    this.showFormatPrice = this.rules[this.prop][0].pattern.test(
     this.form.deceivedAmount,
    )
   }
  },
 },
}
</script>

<style lang="less" scoped>
.price-mask {
 position: absolute;
 z-index: 2;
 top: 1px;
 left: 125px;
 background: white;
 width: 110px;
 overflow: auto;
 font-size: 13px;
}
</style>

在表单中的使用方法其实和你直接写一个 el-form-item 的效果是一样的,直接引入即可。

// 使用方法:
<template lang="pug">
el-form(:model="form" ref="form" label="180px" :label-suffix="':'" :rules="rules")
  priceInput(:form.sync = "form" :width = "150" label = "金额" prop = "deceivedAmount" :rules = "rules")
</template>

<script>
import priceInput from '@self/components/priceInput'
data() {
 return {
  form: {
   deceivedAmount: null,
  },
  rules: {
   deceivedAmount: [
    {
     pattern: /^1000000000$|^1000000000.0$|^1000000000.00$|^[+]{0,1}(\d{0,9})$|^[+]{0,1}(\d{0,9}\.\d{1,2})$/,
     message: ' 请输入 0-10亿 的正数,可保留两位小数',
     trigger: 'blur',
    },
   ],
  },
 }
}
components: {
 priceInput,
}
</script>

到此这篇关于基于element-ui封装表单金额输入框的方法示例的文章就介绍到这了,更多相关element-ui 表单金额输入框内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
父节点获取子节点的字符串示例代码
Feb 26 Javascript
JavaScript函数详解
Feb 27 Javascript
JS组件Bootstrap Table表格行拖拽效果实现代码
Aug 27 Javascript
JavaScript仿商城实现图片广告轮播实例代码
Feb 06 Javascript
详解JavaScript的另类写法
Apr 11 Javascript
javascript中Date对象应用之简易日历实现
Jul 12 Javascript
BootStrap 动态表单效果
Jun 02 Javascript
Vue中保存用户登录状态实例代码
Jun 07 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
Jan 30 Javascript
微信小程序实现横向增长表格的方法
Jul 24 Javascript
Vue 实现复制功能,不需要任何结构内容直接复制方式
Nov 09 Javascript
jQuery实现B2B网站后台管理系统侧导航
Jul 08 jQuery
JS中多层次排序算法的实现代码
Jan 06 #Javascript
如何使用原生Js实现随机点名详解
Jan 06 #Javascript
详解微信小程序「渲染层网络层错误」的解决方法
Jan 06 #Javascript
JavaScript 中的六种循环方法
Jan 06 #Javascript
JavaScript的一些小技巧分享
Jan 06 #Javascript
详解Vue2的diff算法
Jan 06 #Vue.js
如何利用JavaScript编写一个格斗小游戏
Jan 06 #Javascript
You might like
php 破解防盗链图片函数
2008/12/09 PHP
编写php应用程序实现摘要式身份验证的方法详解
2013/06/08 PHP
php输出金字塔的2种实现方法
2014/12/16 PHP
php实现session自定义会话处理器的方法
2015/01/27 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
extjs实现选择多表自定义查询功能 前台部分(ext源码)
2011/12/20 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
2013/11/05 Javascript
jquery 实现input输入什么div图层显示什么
2014/06/15 Javascript
javascript引擎长时间独占线程造成卡顿的解决方案
2014/12/03 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
Vue如何实现组件的源码解析
2017/06/08 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
微信小程序云开发(数据库)详解
2019/05/17 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
python range实例用法分享
2020/02/06 Python
CSS3教程(5):网页背景图片
2009/04/02 HTML / CSS
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
Feelunique美国:欧洲大型的在线美妆零售电商
2018/11/04 全球购物
六一儿童节活动策划方案
2014/01/27 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
计算机系本科生求职信
2014/05/31 职场文书
多媒体编辑专业毕业生求职信
2014/06/13 职场文书
关于安全的广播稿
2014/10/23 职场文书
放射科岗位职责
2015/02/14 职场文书
房产电话营销开场白
2015/05/29 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript
Java中的继承、多态以及封装
2022/04/11 Java/Android