el-input自定义指令封装

本文介绍了如何在Vue中封装一个自定义指令,用于限制el-input组件的输入。该指令支持设置最大值(max)、最小值(min)、小数点位数(places,默认2位)和输入长度(step,默认16位)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义指令 - 输入框限制

  • 将以下代码复制到一个js文件中,然后在入口文件main.js中import引入即可;

  • 指令参数 max 限制最大输入(可选) min 限制最小输入(可选) places保留小数点位数(可选,默认为2位)step限制输入长度(可选,默认为16位长度)

/**
*@max {number}//最大值
*@min {number}//最小值
*@places {number}//小数位数(默认为2)
*@step {number}//步长(默认为16位)
*/
import Vue from 'vue';
Vue.directive('inpnum', {
 inserted(el, vDir, vNode) {
   // vDir.value 有指令的参数
   let content
   // 设置输入框的值,触发input事件,改变v-model绑定的值
   const setVal = (val) => {
     if (vNode.componentInstance) {
       // 如果是自定义组件就触发自定义组件的input事件
       vNode.componentInstance.$emit('input', val)
     } else {
       // 如果是原生组件就触发原生组件的input事件
       el.value = val
       el.dispatchEvent(new Event('input'))
     }
   }
   // 按键按下=>只允许输入 数字/小数点
   el.addEventListener('keypress', (event) => {
     let arg_toFixed = 2 // 默认保留至2位小数
     let arg_step = 16 // 默认保留至16位
     if (vDir.value) {//判断是否有参数
       if (vDir.value.places) {
         arg_toFixed = parseFloat(vDir.value.places)
       }
       if (vDir.value.step) {
         arg_step = vDir.value.step
       }
     }
     const e = event || window.event
     const inputKey = String.fromCharCode(
       typeof e.charCode === 'number' ? e.charCode : e.keyCode,
     )
     const re = /\d|\./
     content = e.target.value
     // 定义方法,阻止输入
     function preventInput() {
       if (e.preventDefault) {
         e.preventDefault()
       } else {
         e.returnValue = false
         // return false
       }
     }
     if (!re.test(inputKey) && !e.ctrlKey) {
       preventInput()
     } else if (content.indexOf('.') > 0 && inputKey === '.') {
       // 已有小数点,再次输入小数点
       preventInput()
     } else if (
       // 小数点后的位数超过不可输入
       content.indexOf('.') > 0 &&
       content.length - content.indexOf('.') > arg_toFixed
     ) {
       preventInput()
     } else if (content.toString().length >= arg_step) {
       preventInput()
     }
   })
   // 规范
   function standard(event) {
     const e = event || window.event
     content = parseFloat(e.target.value)
     if (!content) {
       // content = 0.00
       if (content == 0) {
         content = 0
       } else {
         content = ""
       }
     }
     e.target.value = content ? content : ''
     let arg_max = ''
     let arg_min = ''
     if (vDir.value) {
       arg_max = parseFloat(vDir.value.max) + '' // 这里特意转化成字符串形式 防止当最大或者最小只为0时,判断为false
       arg_min = parseFloat(vDir.value.min) + '' // 这里特意转化成字符串形式 防止当最大或者最小只为0时,判断为false
     }
     if (arg_max && +content > arg_max) {
       e.target.value = arg_max
       content = arg_max
     }
     if (arg_min && +content < arg_min) {
       e.target.value = arg_min
       content = arg_min
     }

     setVal(e.target.value)
   }
   // 输入中文的时候
   el.addEventListener('compositionend', (event) => {
     standard(event)
   })
   // 失去焦点=>保留指定位小数
   el.addEventListener('focusout', (event) => {
     // 此处会在 el-input 的 @change 后执行
     standard(event)
   })
 },
})

使用时:有两种情况

<el-input v-inpnum>
<el-input v-inpnum="{max: 100, min: 0, places: 2 ,step: 16}">
Element UI 中,`el-input-number` 组件默认允许用户输入正数、负数以及小数,但若希望限制其仅接受 **正数**(包括整数和浮点数),可以通过以下方式进行控制: ### 方法一:使用 `controls-position` 和 `min` 属性 Element UI 的 `el-input-number` 提供了 `min` 属性来设置最小值。通过将 `min` 设置为 `0` 并结合 `@change` 事件进行额外验证,可以有效防止用户输入负数。 ```html <template> <el-input-number v-model="numberValue" :min="0" @change="handleChange" /> </template> <script> export default { data() { return { numberValue: null }; }, methods: { handleChange(value) { if (value < 0) { this.numberValue = 0; } } } }; </script> ``` 此方法利用组件的内置属性与事件回调机制,在用户手动输入或通过上下箭头操作时确保数值始终不小于零。 ### 方法二:结合 `@input` 事件进行正则过滤 为了进一步增强控制,可以在输入过程中就对内容进行校验,避免非法字符的出现。 ```html <template> <el-input-number v-model="numberValue" @input="handleInput" :controls-position="'right'" /> </template> <script> export default { data() { return { numberValue: null }; }, methods: { handleInput(value) { // 使用正则保留数字和小数点,并去除前导负号 const cleaned = String(value).replace(/[^0-9.]/g, ''); this.numberValue = cleaned === '' ? null : parseFloat(cleaned); } } }; </script> ``` 该方式通过 `@input` 钩子实时清理输入内容,确保只包含合法的数字和小数点,同时移除了任何可能导致负数的 `-` 符号。 ### 方法三:自定义指令实现全局一致性 如果项目中有多个地方需要应用相同的限制逻辑,推荐使用 Vue 自定义指令以提升代码复用性。 ```javascript // main.js Vue.directive('positive-number', { bind(el, binding, vnode) { const inputEl = el.querySelector('input'); if (inputEl) { inputEl.addEventListener('input', () => { let val = inputEl.value; val = val.replace(/[^0-9.]/g, ''); inputEl.value = val; vnode.context.$set(binding.expression, parseFloat(val)); }); } } }); ``` 然后在模板中直接使用: ```html <el-input-number v-positive-number v-model="numberValue" /> ``` 这种方式将处理逻辑封装指令中,使得业务组件更简洁易维护。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值