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

其他教程   发布日期:2024年11月20日   浏览次数:228

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

限制小数时可以输入整数

1.第一种方法:

  1. const limitPositive = Vue.directive('limitPositive', {
  2. update(el, {value = 0}, vnode) { // 当被绑定的元素插入到 DOM 中时
  3. let iscancel = false;
  4. let num = value
  5. const inputEvent = e => {
  6. if (iscancel) {
  7. return false;
  8. }
  9. let res = '/^d*(.?d{0,'+num+'})/g'
  10. if (num) {
  11. e.target.value = (e.target.value.match(eval('(' + res + ')'))[0]) || null
  12. }else {
  13. e.target.value = (e.target.value.match(/^d*/g)[0]) || null
  14. }
  15. let v = e.target.value;//为绑定的值
  16. vnode.data.model.callback(v);//改变虚拟节点上v-model的值
  17. };
  18. el.oninput = inputEvent;
  19. //解决输入中文的问题
  20. el.addEventListener("compositionstart", e => {
  21. iscancel = true;
  22. });
  23. el.addEventListener("compositionend", e => {
  24. iscancel = false;
  25. inputEvent(e);
  26. });
  27. }
  28. })
  29. export { limitPositive }

使用方法

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

2.第二种方法:

先建立一个num.js文件

  1. /**
  2. * 设置输入框的值,触发input事件,改变v-model绑定的值
  3. * */
  4. const setVal = (val, el, vNode) => {
  5. if (vNode.componentInstance) {
  6. // 如果是自定义组件就触发自定义组件的input事件
  7. vNode.componentInstance.$emit('input', val)
  8. } else {
  9. // 如果是原生组件就触发原生组件的input事件
  10. el.value = val
  11. el.dispatchEvent(new Event('input'))
  12. }
  13. }
  14. /**
  15. * 参数检查
  16. * */
  17. const optionCheck = (binding) => {
  18. // 范围值是否为数值
  19. if ((binding.value.max && typeof binding.value.max !== 'number') || (binding.value.min && typeof binding.value.min !== 'number')) {
  20. throw new Error('范围参数必须是数字')
  21. }
  22. // 最大最小值存在的时候判断最大值与最小值是否相等
  23. if (binding.value.max === binding.value.min && typeof binding.value.max !== 'undefined' && typeof binding.value.min !== 'undefined') {
  24. throw new Error('最大值和最小值不能相等')
  25. }
  26. }
  27. /**
  28. * 判断是否为无效值
  29. * */
  30. const isInvalidVal = (bindValue) => {
  31. return bindValue === null || isNaN(Number(bindValue)) || bindValue.toString().indexOf('.') === bindValue.length - 1 || bindValue.toString().indexOf('e') !== -1
  32. }
  33. /**
  34. * 处理数值范围,如果输入值超过最大值或最小值,将会被自动设置为边界值
  35. * */
  36. const dealRange = (inputValue, binding) => {
  37. const bindMax = typeof binding.value.max === 'undefined' ? Infinity : binding.value.max
  38. const bindMin = typeof binding.value.min === 'undefined' ? -Infinity : binding.value.min
  39. let result = inputValue
  40. if (inputValue < bindMin) {
  41. result = bindMin
  42. }
  43. if (inputValue > bindMax) {
  44. result = bindMax
  45. }
  46. return result
  47. }
  48. /**
  49. * 阻止输入
  50. * */
  51. const preventInput = (event) => {
  52. if (event.preventDefault) {
  53. event.preventDefault()
  54. } else {
  55. event.returnValue = false
  56. }
  57. }
  58. export default {
  59. bind(el, binding, vNode) {
  60. optionCheck(binding)
  61. // 处理无效值
  62. const bindValue = vNode.data.model.value
  63. if (isInvalidVal(bindValue)) {
  64. setVal(null, el, vNode)
  65. return
  66. }
  67. // 处理数值范围
  68. const inputVal = dealRange(bindValue, binding)
  69. setVal(inputVal, el, vNode)
  70. },
  71. inserted(el, binding, vNode) {
  72. let content
  73. // 按键按下=>只允许按照一定规则输入 数字/小数点/减号
  74. el.addEventListener('keypress', e => {
  75. const inputKey = String.fromCharCode(typeof e.charCode === 'number' ? e.charCode : e.keyCode)
  76. const inputReg = /d|.|-/
  77. content = e.target.value
  78. /**
  79. * 1.输入值不是数字、小数点、减号
  80. * 2.输入框为空或只有减号,不能输入小数点
  81. * 3.重复输入小数点
  82. * 4.输入框已有值,不能输入减号
  83. * 5.重复输入减号
  84. */
  85. // todo:已有值的时候,选中输入框的所有值输入减号‘-',无法覆盖输入
  86. if (!inputReg.test(inputKey)) {
  87. preventInput(e)
  88. } else if (((content === '' || content === '-') && inputKey === '.')) {
  89. preventInput(e)
  90. } else if ((content.indexOf('.') !== -1 && inputKey === '.')) {
  91. preventInput(e)
  92. } else if ((content !== '' && inputKey === '-')) {
  93. preventInput(e)
  94. } else if ((content.indexOf('-') !== -1 && inputKey === '-')) {
  95. preventInput(e)
  96. }
  97. })
  98. // 按键弹起=>并限制最大最小
  99. el.addEventListener('keyup', e => {
  100. if (e.keyCode === 8) {
  101. return
  102. }
  103. // 处理无效值
  104. const bindValue = e.target.value
  105. if (bindValue === null) {
  106. setVal(null, el, vNode)
  107. return
  108. }
  109. // 处理数值范围
  110. const inputVal = dealRange(bindValue, binding)
  111. setVal(inputVal, el, vNode)
  112. })
  113. // 失去焦点=>保留指定位小数
  114. el.addEventListener('focusout', e => { // 此处会在 el-input 的 @change 后执行
  115. // 处理无效值
  116. const bindValue = e.target.value
  117. if (isInvalidVal(bindValue)) {
  118. setVal(null, el, vNode)
  119. return
  120. }
  121. content = parseFloat(e.target.value)
  122. const contentStr = String(content)
  123. if (contentStr.indexOf('.') >= 0 && contentStr.split('.')[1].length > binding.value.precision) {
  124. let arg_precision = 0// 默认保留至整数
  125. if (binding.value.precision) {
  126. arg_precision = parseFloat(binding.value.precision)
  127. }
  128. content = content.toFixed(arg_precision)
  129. }
  130. setVal(content, el, vNode)
  131. })
  132. }
  133. }

在index.js文件引入

  1. import onlyNumber from './num'
  2. const install = Vue => {
  3. Vue.directive('onlyNumber', onlyNumber)
  4. }
  5. /*
  6. Vue.use( plugin )
  7. 安装 Vue.js 插件。如果插件是一个对象,必须提供 install 方法。
  8. 如果插件是一个函数,它会被作为 install 方法。install 方法调用时,会将 Vue 作为参数传入。
  9. 该方法需要在调用 new Vue() 之前被调用。
  10. 当 install 方法被同一个插件多次调用,插件将只会被安装一次。
  11. */
  12. if (window.Vue) {
  13. window['onlyNumber'] = onlyNumber
  14. Vue.use(install); // eslint-disable-line
  15. }
  16. onlyNumber.install = install
  17. export default onlyNumber
  18. // 使用 例子: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:保留小数

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

以上就是vue怎么使用directive限制表单输入整数、小数的详细内容,更多关于vue怎么使用directive限制表单输入整数、小数的资料请关注九品源码其它相关文章!