基于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 相关文章推荐
JS window.opener返回父页面的应用
Oct 24 Javascript
用jquery实现等比例缩放图片效果插件
Jul 24 Javascript
jquery js 重置表单 reset()具体实现代码
Aug 05 Javascript
使用Node.js配合Nginx实现高负载网络
Jun 28 Javascript
jquery仅用6行代码实现滑动门效果
Sep 07 Javascript
表单验证正则表达式实例代码详解
Nov 09 Javascript
基于javascript实现图片预加载
Jan 05 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
Sep 06 Javascript
js变量提升深入理解
Sep 16 Javascript
全面解析node 表单的图片上传
Nov 21 Javascript
基于Bootstrap框架实现图片切换
Mar 10 Javascript
在Vue组件中获取全局的点击事件方法
Sep 06 Javascript
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
PHILIPS AE3805收音机的分析打磨
2021/03/02 无线电
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
深入理解php的MySQL连接类
2013/06/07 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
php计划任务之ignore_user_abort函数实现方法
2015/01/08 PHP
apache和PHP如何整合在一起
2015/10/12 PHP
Yii2汉字转拼音类的实例代码
2017/04/18 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
laravel框架实现敏感词汇过滤功能示例
2020/02/15 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
jQuery学习笔记之DOM对象和jQuery对象
2010/12/22 Javascript
jQuery判断密码强度实现思路及代码
2013/04/24 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
以Python代码实例展示kNN算法的实际运用
2015/10/26 Javascript
基于datepicker定义自己的angular时间组件的示例
2018/03/14 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
2020/04/30 Javascript
[06:57]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD 选手采访
2021/03/11 DOTA
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
创建Django项目图文实例详解
2019/06/06 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
Gap英国官网:Gap UK
2018/07/18 全球购物
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
毕业生简历自我评价范文
2014/04/09 职场文书
企业法人代表证明书
2014/09/27 职场文书
校园学雷锋广播稿
2014/10/08 职场文书