mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	
		
			
	
	
		
			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> |