货无忧
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

82 lines
1.8 KiB

<template>
<input :class="{inputNum: true, disabled: props.disabled}" type="number" :disabled="props.disabled" @blur="blurInput"
v-model="number" />
</template>
<script setup lang="ts">
import { ref } from "vue";
const number = ref<any>(10)
const props = defineProps({
// 输入框的值
modelValue: {
default: 0,
},
// 最大值
maxNum: {
type: Number,
default: Infinity
},
// 最小值
minNum: {
type: Number,
default: 0
},
disabled: {
type: Boolean,
default: false
}
})
number.value = props.modelValue
const $emit = defineEmits(['update:modelValue'])
let isInput = null
// 防抖函数
function inputNum() {
// 重置定时器
if (isInput) clearTimeout(isInput)
// 开启定时器
isInput = setTimeout(() => {
number.value = parseInt(number.value)
// 当值不是数字为NaN时, number.value为0
if (number.value !== number.value) number.value = 0
// 最大限制
if (number.value >= props.maxNum) number.value = props.maxNum
// 最小限制
if (number.value <= props.minNum) number.value = props.minNum
$emit('update:modelValue', number.value)
// 清除定时器
clearTimeout(isInput)
}, 300)
}
// 防抖函数
function blurInput() {
number.value = parseInt(number.value)
// 当值不是数字为NaN时, number.value为0
if (number.value !== number.value) number.value = 0
// 最大限制
if (number.value >= props.maxNum) number.value = props.maxNum
// 最小限制
if (number.value <= props.minNum) number.value = props.minNum
$emit('update:modelValue', number.value)
// 清除定时器
}
</script>
<style scoped lang="scss">
.inputNum {
border: 2upx solid #999;
padding: 5upx 20upx;
border-radius: 10upx;
&.disabled {
background-color: #e8e8e8;
}
}
</style>