154 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
		
		
			
		
	
	
			154 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Vue
		
	
	
	
|  | <template> | ||
|  |   <view class="quick-recharge-panel"> | ||
|  |     <view class="panel-title">请选择充值金额</view> | ||
|  |     <view class="amount-grid"> | ||
|  |       <view | ||
|  |         v-for="(amount, index) in amounts" | ||
|  |         :key="index" | ||
|  |         class="amount-item" | ||
|  |         :class="{ selected: selectedIndex === index }" | ||
|  |         @click="selectAmount(amount, index)" | ||
|  |       > | ||
|  |         <view class="amount-value"> | ||
|  |           <text class="amount-number">{{ formatAmount(amount) }}</text> | ||
|  |         </view> | ||
|  |       </view> | ||
|  |     </view> | ||
|  |   </view> | ||
|  | </template> | ||
|  | 
 | ||
|  | <script> | ||
|  | export default { | ||
|  |   name: 'QuickRechargePanel', | ||
|  |   props: { | ||
|  |     // 预设金额数组
 | ||
|  |     amounts: { | ||
|  |       type: Array, | ||
|  |       default: () => [100, 200, 500, 1000, 2000, 5000], | ||
|  |     }, | ||
|  |     // 货币符号
 | ||
|  |     currencySymbol: { | ||
|  |       type: String, | ||
|  |       default: '', | ||
|  |     }, | ||
|  |     // 默认选中的索引
 | ||
|  |     defaultSelected: { | ||
|  |       type: Number, | ||
|  |       default: -1, | ||
|  |     }, | ||
|  |   }, | ||
|  |   data() { | ||
|  |     return { | ||
|  |       selectedIndex: this.defaultSelected, | ||
|  |     } | ||
|  |   }, | ||
|  |   methods: { | ||
|  |     selectAmount(amount, index) { | ||
|  |       this.selectedIndex = index | ||
|  |       this.$emit('amount-selected', { | ||
|  |         amount, | ||
|  |         index, | ||
|  |       }) | ||
|  |     }, | ||
|  |     // 清空选中状态
 | ||
|  |     clear() { | ||
|  |       this.selectedIndex = -1 | ||
|  |     }, | ||
|  |     // 格式化金额显示千分位
 | ||
|  |     formatAmount(amount) { | ||
|  |       return amount.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',') | ||
|  |     }, | ||
|  |   }, | ||
|  | } | ||
|  | </script> | ||
|  | 
 | ||
|  | <style lang="scss" scoped> | ||
|  | .quick-recharge-panel { | ||
|  |   margin-top: 20rpx; | ||
|  |   padding: 20rpx; | ||
|  |   background: #fff; | ||
|  |   border-radius: 20rpx; | ||
|  |   box-shadow: 0px 2px 20rpx 0px rgba(204, 204, 204, 0.3); | ||
|  | } | ||
|  | 
 | ||
|  | .panel-title { | ||
|  |   font-size: 28rpx; | ||
|  |   font-weight: 600; | ||
|  |   color: #333333; | ||
|  |   margin-bottom: 30rpx; | ||
|  |   text-align: center; | ||
|  | } | ||
|  | 
 | ||
|  | .amount-grid { | ||
|  |   display: grid; | ||
|  |   grid-template-columns: repeat(3, 1fr); | ||
|  |   gap: 20rpx; | ||
|  | } | ||
|  | 
 | ||
|  | .amount-item { | ||
|  |   position: relative; | ||
|  |   padding: 24rpx 10rpx; | ||
|  |   background: #f8f9fa; | ||
|  |   border-radius: 16rpx; | ||
|  |   text-align: center; | ||
|  |   transition: all 0.3s ease; | ||
|  |   cursor: pointer; | ||
|  |   border: 2rpx solid transparent; | ||
|  | 
 | ||
|  |   &:hover { | ||
|  |     transform: translateY(-2rpx); | ||
|  |     box-shadow: 0px 4px 20rpx 0px rgba(0, 91, 172, 0.15); | ||
|  |   } | ||
|  | 
 | ||
|  |   &.selected { | ||
|  |     background: linear-gradient(135deg, #005bac 0%, #0070d4 100%); | ||
|  |     color: #fff; | ||
|  |     border-color: #005bac; | ||
|  |     box-shadow: 0px 4px 20rpx 0px rgba(0, 91, 172, 0.3); | ||
|  | 
 | ||
|  |     .amount-value { | ||
|  |       color: #fff; | ||
|  |     } | ||
|  |   } | ||
|  | 
 | ||
|  |   &:active { | ||
|  |     transform: translateY(0); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | .amount-value { | ||
|  |   display: flex; | ||
|  |   align-items: center; | ||
|  |   justify-content: center; | ||
|  |   font-weight: 600; | ||
|  |   color: #333333; | ||
|  | } | ||
|  | 
 | ||
|  | .currency-symbol { | ||
|  |   font-size: 24rpx; | ||
|  |   margin-right: 4rpx; | ||
|  |   opacity: 0.8; | ||
|  | } | ||
|  | 
 | ||
|  | .amount-number { | ||
|  |   font-size: 52rpx; | ||
|  |   font-weight: 700; | ||
|  |   letter-spacing: 2rpx; | ||
|  | } | ||
|  | 
 | ||
|  | // 响应式设计
 | ||
|  | @media (max-width: 375px) { | ||
|  |   .amount-grid { | ||
|  |     grid-template-columns: repeat(3, 1fr); | ||
|  |   } | ||
|  | 
 | ||
|  |   .amount-item { | ||
|  |     padding: 25rpx 15rpx; | ||
|  |   } | ||
|  | 
 | ||
|  |   .amount-number { | ||
|  |     font-size: 40rpx; | ||
|  |   } | ||
|  | } | ||
|  | </style> |