文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

vue怎么使用directive限制表单输入整数、小数

2023-07-05 20:36

关注

这篇文章主要介绍“vue怎么使用directive限制表单输入整数、小数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue怎么使用directive限制表单输入整数、小数”文章能帮助大家解决问题。

限制小数时可以输入整数

1.第一种方法:

const limitPositive = Vue.directive('limitPositive', {  update(el, {value = 0}, vnode) {  // 当被绑定的元素插入到 DOM 中时    let iscancel = false;    let num = value    const inputEvent = e => {      if (iscancel) {        return false;      }      let res = '/^\\\d*(\\\.?\\\d{0,'+num+'})/g'      if (num) {        e.target.value = (e.target.value.match(eval('(' + res + ')'))[0]) || null      }else {        e.target.value = (e.target.value.match(/^\d*/g)[0]) || null      }      let v = e.target.value;//为绑定的值      vnode.data.model.callback(v);//改变虚拟节点上v-model的值    };    el.oninput = inputEvent;    //解决输入中文的问题    el.addEventListener("compositionstart", e => {      iscancel = true;    });    el.addEventListener("compositionend", e => {      iscancel = false;      inputEvent(e);    });  }})export { limitPositive }

使用方法

import limitPositive from '@/utils/directives.js'v-limitPositive="1" //一位小数,数字可以改变v-limitPositive 整数

2.第二种方法:

先建立一个num.js文件

const setVal = (val, el, vNode) => {  if (vNode.componentInstance) {    // 如果是自定义组件就触发自定义组件的input事件    vNode.componentInstance.$emit('input', val)  } else {    // 如果是原生组件就触发原生组件的input事件    el.value = val    el.dispatchEvent(new Event('input'))  }}const optionCheck = (binding) => {  // 范围值是否为数值  if ((binding.value.max && typeof binding.value.max !== 'number') || (binding.value.min && typeof binding.value.min !== 'number')) {    throw new Error('范围参数必须是数字')  }  // 最大最小值存在的时候判断最大值与最小值是否相等  if (binding.value.max === binding.value.min && typeof binding.value.max !== 'undefined' && typeof binding.value.min !== 'undefined') {    throw new Error('最大值和最小值不能相等')  }}const isInvalidVal = (bindValue) => {  return bindValue === null || isNaN(Number(bindValue)) || bindValue.toString().indexOf('.') === bindValue.length - 1 || bindValue.toString().indexOf('e') !== -1}const dealRange = (inputValue, binding) => {  const bindMax = typeof binding.value.max === 'undefined' ? Infinity : binding.value.max  const bindMin = typeof binding.value.min === 'undefined' ? -Infinity : binding.value.min  let result = inputValue  if (inputValue < bindMin) {    result = bindMin  }  if (inputValue > bindMax) {    result = bindMax  }  return result}const preventInput = (event) => {  if (event.preventDefault) {    event.preventDefault()  } else {    event.returnValue = false  }}export default {  bind(el, binding, vNode) {    optionCheck(binding)    // 处理无效值    const bindValue = vNode.data.model.value    if (isInvalidVal(bindValue)) {      setVal(null, el, vNode)      return    }    // 处理数值范围    const inputVal = dealRange(bindValue, binding)    setVal(inputVal, el, vNode)  },  inserted(el, binding, vNode) {    let content    // 按键按下=>只允许按照一定规则输入 数字/小数点/减号    el.addEventListener('keypress', e => {      const inputKey = String.fromCharCode(typeof e.charCode === 'number' ? e.charCode : e.keyCode)      const inputReg = /\d|\.|-/      content = e.target.value            // todo:已有值的时候,选中输入框的所有值输入减号‘-',无法覆盖输入      if (!inputReg.test(inputKey)) {        preventInput(e)      } else if (((content === '' || content === '-') && inputKey === '.')) {        preventInput(e)      } else if ((content.indexOf('.') !== -1 && inputKey === '.')) {        preventInput(e)      } else if ((content !== '' && inputKey === '-')) {        preventInput(e)      } else if ((content.indexOf('-') !== -1 && inputKey === '-')) {        preventInput(e)      }    })    // 按键弹起=>并限制最大最小    el.addEventListener('keyup', e => {      if (e.keyCode === 8) {        return      }      // 处理无效值      const bindValue = e.target.value      if (bindValue === null) {        setVal(null, el, vNode)        return      }      // 处理数值范围      const inputVal = dealRange(bindValue, binding)      setVal(inputVal, el, vNode)    })    // 失去焦点=>保留指定位小数    el.addEventListener('focusout', e => { // 此处会在 el-input 的 @change 后执行      // 处理无效值      const bindValue = e.target.value      if (isInvalidVal(bindValue)) {        setVal(null, el, vNode)        return      }      content = parseFloat(e.target.value)      const contentStr = String(content)      if (contentStr.indexOf('.') >= 0 && contentStr.split('.')[1].length > binding.value.precision) {        let arg_precision = 0// 默认保留至整数        if (binding.value.precision) {          arg_precision = parseFloat(binding.value.precision)        }        content = content.toFixed(arg_precision)      }      setVal(content, el, vNode)    })  }}

在index.js文件引入

import onlyNumber from './num'const install = Vue => {  Vue.directive('onlyNumber', onlyNumber)}if (window.Vue) {  window['onlyNumber'] = onlyNumber  Vue.use(install); // eslint-disable-line}onlyNumber.install = installexport default onlyNumber// 使用  例子:v-only-number="{max:100,min:0,precision:2}"

使用例子:
// 在main.js全局注入
import onlyNumber from &lsquo;@/directive/num&rsquo;
Vue.use(onlyNumber)

v-only-number=“{max:100,min:0,precision:2}”
max:最大值
min:最小值
precision:保留小数

<el-input v-model="value" v-only-number="{max:1000,min:0}" placeholder="请输入"/>

关于“vue怎么使用directive限制表单输入整数、小数”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯