基于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 相关文章推荐
在javascript中如何得到中英文混合字符串的长度
Jan 17 Javascript
调用innerHTML之后onclick失效问题的解决方法
Jan 28 Javascript
JS执行删除前的判断代码
Feb 18 Javascript
JS获取select的value和text值的简单实例
Feb 26 Javascript
写出高效jquery代码的19条指南
Mar 19 Javascript
Bootstrap布局组件应用实例讲解
Feb 17 Javascript
bootstrap使用validate实现简单校验功能
Dec 02 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
Dec 13 Javascript
详解angular 中的自定义指令之详解API
Jun 20 Javascript
Angular2实现的秒表及改良版示例
May 10 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
Jan 08 Javascript
如何在现代JavaScript中编写异步任务
Jan 31 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使用json_encode对变量json编码
2014/04/07 PHP
php 使用file_get_contents读取大文件的方法
2014/11/13 PHP
SAE实时日志接口SDK用法示例
2016/10/09 PHP
起点页面传值js,有空研究学习下
2010/01/25 Javascript
jQuery实现的Div窗口震动特效
2014/06/09 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
JavaScript实现给定时间相加天数的方法
2016/01/25 Javascript
javascript+css3 实现动态按钮菜单特效
2016/02/06 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
解决vue-cli3 使用子目录部署问题
2018/07/19 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
Webpack按需加载打包chunk命名的方法
2019/09/22 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
python动态加载变量示例分享
2014/02/17 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
Html5无刷新修改browser Url的方法
2014/01/15 HTML / CSS
html5绘制时钟动画
2014/12/15 HTML / CSS
吉尔德利巧克力公司:Ghirardelli Chocolate Company
2019/03/27 全球购物
中专毕业个人的自荐信格式
2013/09/21 职场文书
行政专员工作职责
2013/12/22 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
升国旗演讲稿
2014/09/05 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
2014年敬老院工作总结
2014/12/08 职场文书
2014年监理个人工作总结
2014/12/11 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
小学教学工作总结2015
2015/05/13 职场文书
导游词之桂林
2019/08/20 职场文书