forked from angelo/web-retail-h5
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>
|