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>
 |