基于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 相关文章推荐
Ext.MessageBox工具类简介
Dec 10 Javascript
JavaScript prototype 使用介绍
Aug 29 Javascript
利用毫秒减值计算时长的js代码
Sep 22 Javascript
js 去除字符串第一位逗号的方法
Jun 07 Javascript
基于jQuery.Hz2Py.js插件实现的汉字转拼音特效
May 07 Javascript
JS中的进制转换以及作用
Jun 26 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
Aug 14 jQuery
React Native 截屏组件的示例代码
Dec 06 Javascript
vue组件命名和props命名代码详解
Sep 01 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
Nov 06 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
Nov 09 Javascript
解决vue侦听器watch,调用this时出现undefined的问题
Oct 30 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
福利彩票幸运号码自动生成器
2006/10/09 PHP
PHP连接局域网MYSQL数据库的简单实例
2013/08/26 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
jQuery代码优化 事件委托篇
2011/11/01 Javascript
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
如何将一个String和多个String值进行比较思路分析
2013/04/22 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
正则表达式基本语法及表单验证操作详解【基于JS】
2017/04/07 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
js+html5实现侧滑页面效果
2017/07/15 Javascript
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
2018/04/23 Javascript
4 种滚动吸顶实现方式的比较
2019/04/09 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
Vue2.x-使用防抖以及节流的示例
2021/03/02 Vue.js
常用python数据类型转换函数总结
2014/03/11 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
django中的图片验证码功能
2019/09/18 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
大四毕业生学习总结的自我评价
2013/10/31 职场文书
大学生作弊检讨书
2014/02/19 职场文书
大学生村官考核材料
2014/05/23 职场文书
党员民主评议个人总结
2014/10/20 职场文书
考勤制度通知
2015/04/25 职场文书
教师节表彰会主持词
2015/07/06 职场文书
关于军训的感想
2015/08/07 职场文书
Java集成swagger文档组件
2021/06/28 Java/Android