You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
1.8 KiB
Vue
93 lines
1.8 KiB
Vue
<template>
|
|
<view class="bottom-action-bar">
|
|
<view class="action-row">
|
|
<view
|
|
v-for="(btn, index) in normalizedButtons"
|
|
:key="index"
|
|
class="action-btn"
|
|
:class="btn.type === 'primary' ? 'btn-primary' : 'btn-default'"
|
|
@click="handleClick(btn, index)"
|
|
>
|
|
<text class="btn-text" :class="btn.type === 'primary' ? 'text-primary' : 'text-default'">{{ btn.text }}</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { computed } from 'vue'
|
|
|
|
const props = defineProps({
|
|
buttons: {
|
|
type: Array,
|
|
default: () => []
|
|
}
|
|
})
|
|
|
|
const emit = defineEmits(['action'])
|
|
|
|
const normalizedButtons = computed(() => {
|
|
if (!Array.isArray(props.buttons) || props.buttons.length === 0) {
|
|
return [{ text: '返回', type: 'default', key: 'back' }]
|
|
}
|
|
return props.buttons.map((b) => ({
|
|
text: b && b.text ? b.text : '按钮',
|
|
type: b && b.type === 'primary' ? 'primary' : 'default',
|
|
key: b && b.key ? b.key : ''
|
|
}))
|
|
})
|
|
|
|
function handleClick(btn, index) {
|
|
emit('action', { ...btn, index })
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.bottom-action-bar {
|
|
position: fixed;
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
background: #ffffff;
|
|
box-shadow: 0 -6rpx 24rpx rgba(0, 0, 0, 0.08);
|
|
padding: 20rpx 24rpx calc(20rpx + env(safe-area-inset-bottom));
|
|
z-index: 90;
|
|
}
|
|
|
|
.action-row {
|
|
display: flex;
|
|
gap: 20rpx;
|
|
}
|
|
|
|
.action-btn {
|
|
flex: 1;
|
|
height: 88rpx;
|
|
border-radius: 16rpx;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
|
|
.btn-default {
|
|
background: #ffffff;
|
|
border: 2rpx solid #dcdfe6;
|
|
}
|
|
|
|
.btn-primary {
|
|
background: linear-gradient(135deg, #1a3a5c 0%, #2d5a87 100%);
|
|
}
|
|
|
|
.btn-text {
|
|
font-size: 30rpx;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.text-default {
|
|
color: #303133;
|
|
}
|
|
|
|
.text-primary {
|
|
color: #ffffff;
|
|
}
|
|
</style>
|