基于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代码
Mar 05 Javascript
jquery实现拖动效果
Aug 10 Javascript
jQueryUI Datepicker组件设置日期高亮
Oct 13 Javascript
浅谈js控制li标签排序问题 js调用php函数的方法
Oct 16 Javascript
微信小程序开发之相册选择和拍照详解及实例代码
Feb 22 Javascript
react-native DatePicker日期选择组件的实现代码
Sep 12 Javascript
vue基于Element构建自定义树的示例代码
Sep 19 Javascript
JS路由跳转的简单实现代码
Sep 21 Javascript
微信小程序人脸识别功能代码实例
May 07 Javascript
ES6中Symbol、Set和Map用法详解
Aug 20 Javascript
vue实现axios图片上传功能
Aug 20 Javascript
vue element 关闭当前tab 跳转到上一路由操作
Jul 22 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
PHP遍历某个目录下的所有文件和子文件夹的实现代码
2013/06/28 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
Laravel如何实现适合Api的异常处理响应格式
2020/06/14 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
YUI的Tab切换实现代码
2010/04/11 Javascript
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
jQuery中ajax和post处理json的不同示例对比
2014/11/02 Javascript
js控制输入框获得和失去焦点时状态显示的方法
2015/01/30 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
前端插件之Bootstrap Dual Listbox使用教程
2019/07/23 Javascript
Vue开发环境中修改端口号的实现方法
2019/08/15 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
分享Python开发中要注意的十个小贴士
2016/08/30 Python
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
Python中字典与恒等运算符的用法分析
2019/08/22 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
在win64上使用bypy进行百度网盘文件上传功能
2020/01/02 Python
python文件处理fileinput使用方法详解
2020/01/02 Python
python批量生成条形码的示例
2020/10/10 Python
编译 pycaffe时报错:fatal error: numpy/arrayobject.h没有那个文件或目录
2020/11/29 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
BudgetAir印度:预订航班、酒店和汽车租赁
2019/07/07 全球购物
主要的Ajax框架都有什么
2013/11/14 面试题
公司的门卫岗位职责
2014/09/09 职场文书
工地食品安全责任书
2015/05/09 职场文书
创业计划书之健康营养产业
2019/10/15 职场文书
Django给表单添加honeypot验证增加安全性
2021/05/06 Python
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers