181 lines
3.1 KiB
Vue
181 lines
3.1 KiB
Vue
<template>
|
|
<view class="uni-numbox">
|
|
<view class="uni-numbox-minus"
|
|
@click="_calcValue('subtract')"
|
|
>
|
|
<text class="mix-icon icon--jianhao" :class="minDisabled?'uni-numbox-disabled': ''" ></text>
|
|
</view>
|
|
<input
|
|
class="uni-numbox-value"
|
|
type="number"
|
|
:disabled="inputDisabled"
|
|
:value="inputValue"
|
|
@blur="_onBlur"
|
|
>
|
|
|
|
<view
|
|
class="uni-numbox-plus"
|
|
@click="_calcValue('add')"
|
|
>
|
|
<text class="mix-icon icon-jia2" :class="maxDisabled?'uni-numbox-disabled': ''" ></text>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
<script>
|
|
/**
|
|
* index 当前行下标
|
|
* value 默认值
|
|
* min 最小值
|
|
* max 最大值
|
|
* step 步进值
|
|
* disabled 禁用
|
|
*/
|
|
export default {
|
|
name: 'uni-number-box',
|
|
props: {
|
|
index: {
|
|
type: Number,
|
|
default: 0
|
|
},
|
|
value: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
min: {
|
|
type: Number,
|
|
default: -Infinity
|
|
},
|
|
max: {
|
|
type: Number,
|
|
default: 99
|
|
},
|
|
step: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
inputDisabled: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
inputValue: this.value,
|
|
}
|
|
},
|
|
created(){
|
|
|
|
},
|
|
computed: {
|
|
maxDisabled(){
|
|
return this.inputValue >= this.max;
|
|
},
|
|
minDisabled(){
|
|
return this.inputValue <= this.min;
|
|
},
|
|
},
|
|
watch: {
|
|
inputValue(number) {
|
|
const data = {
|
|
number: number,
|
|
index: this.index
|
|
}
|
|
this.$emit('eventChange', data);
|
|
},
|
|
},
|
|
methods: {
|
|
_calcValue(type) {
|
|
let value = this.inputValue;
|
|
let newValue = 0;
|
|
let step = this.step;
|
|
|
|
if(type === 'subtract'){
|
|
newValue = value - step;
|
|
|
|
if(newValue < this.min){
|
|
newValue = this.min
|
|
if(this.min > 1){
|
|
this.$api.msg(this.limit_message);
|
|
}
|
|
}
|
|
}else if(type === 'add'){
|
|
newValue = value + step;
|
|
|
|
if(newValue > this.max){
|
|
newValue = this.max
|
|
}
|
|
}
|
|
if(newValue === value){
|
|
return;
|
|
}
|
|
this.inputValue = newValue;
|
|
},
|
|
_onBlur(event) {
|
|
let value = event.detail.value;
|
|
let constValue = value;
|
|
if (!value) {
|
|
this.inputValue = 0;
|
|
return
|
|
}
|
|
value = +value;
|
|
if (value > this.max) {
|
|
value = this.max;
|
|
} else if (value < this.min) {
|
|
value = this.min
|
|
}
|
|
|
|
if(constValue != value){
|
|
this.inputValue = constValue;
|
|
this.$nextTick(()=>{
|
|
this.inputValue = value
|
|
})
|
|
}else{
|
|
this.inputValue = value
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
<style>
|
|
.uni-numbox {
|
|
display: flex;
|
|
justify-content: flex-start;
|
|
flex-direction: row;
|
|
align-items: center;
|
|
height: 50rpx;
|
|
}
|
|
|
|
.uni-numbox-minus,
|
|
.uni-numbox-plus {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
width: 50rpx;
|
|
height: 100%;
|
|
line-height: 1;
|
|
background-color: #f7f7f7;
|
|
}
|
|
.uni-numbox-minus .mix-icon,
|
|
.uni-numbox-plus .mix-icon{
|
|
font-size: 32rpx;
|
|
color: #333;
|
|
}
|
|
|
|
.uni-numbox-value {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
background-color: #fff;
|
|
width: 60rpx;
|
|
height: 50rpx;
|
|
min-height: 50rpx;
|
|
text-align: center;
|
|
font-size: 28rpx;
|
|
color: #333;
|
|
}
|
|
|
|
.uni-numbox-disabled.mix-icon {
|
|
color: #C0C4CC;
|
|
}
|
|
</style>
|