mrr.sj.front/components/number-box/number-box.vue

146 lines
2.8 KiB
Vue
Raw Permalink Normal View History

2026-03-24 11:45:13 +08:00
<template>
<view class="numberValue">
<view class="fuHao" @click="calculate(-1)">-</view>
<view class="numberValue-card">
<input type="number" :value="value" @input="changeInput" class="numberValue-input" placeholder="请输入比例" />
<text class="percentage">%</text>
</view>
<view class="fuHao" @click="calculate(1)">+</view>
</view>
</template>
<script>
export default {
name: "NumberBox",
props: {
value: {
type: [Number, String],
},
maxValue:{
type: Number,
default: 30,
}
},
watch: {
},
data() {
return {};
},
methods: {
calculate(value) {
let num = Number(this.value) + value;
if (num > this.maxValue) {
if(num<this.maxValue +1){
this.$nextTick(() => {
this.$emit('input', this.maxValue);
});
return
}
uni.showToast({
title: `不能大于${this.maxValue}%`,
icon: "none",
});
} else if (num < 0) {
if(num>-1){
this.$nextTick(() => {
this.$emit('input', 0);
});
return
}
uni.showToast({
title: `不能小于0%`,
icon: "none",
});
}else{
this.$nextTick(() => {
this.$emit('input', num);
});
}
},
changeInput(event) {
let value = event.detail.value;
this.$emit('input', value);
// 将输入值转为数字(处理可能的字符串输入)
let num = Number(value);
// 处理非数字的情况如输入非数字字符时默认设为0
if (isNaN(num)) {
num = 0;
}
// 边界值处理
if (num > this.maxValue) {
num = this.maxValue;
this.$nextTick(() => {
this.$emit('input', num);
});
} else if (num < 0) {
num = 0;
this.$nextTick(() => {
this.$emit('input', num);
});
}
}
}
};
</script>
<style scoped lang="less">
.numberValue {
display: flex;
gap: 12rpx;
.numberValue-card {
position: relative;
width: 140rpx;
padding-right: 40rpx;
height: 46rpx;
background: #F6F6F6;
.numberValue-input {
width: 140rpx;
height: 46rpx;
background: #F6F6F6;
border-radius: 6rpx;
text-align: center !important;
font-weight: 500;
font-size: 28rpx;
color: #333333;
line-height: 40rpx;
text-align: left;
font-style: normal;
}
.percentage {
position: absolute;
right: 9rpx;
top: 50%;
transform: translateY(-50%);
font-weight: 500;
font-size: 26rpx;
color: #333333;
line-height: 37rpx;
text-align: left;
font-style: normal;
}
}
.fuHao {
font-weight: 500;
font-size: 34rpx;
color: #333333;
line-height: 48rpx;
text-align: left;
font-style: normal;
}
}
.uni-input-placeholder{
font-weight: 400;
font-size: 24rpx;
color: #D1CCCC;
line-height: 33rpx;
text-align: center;
font-style: normal;
}
</style>