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.
180 lines
3.1 KiB
180 lines
3.1 KiB
<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>
|
|
|