yunshangxie/tuniao-ui/components/tn-modal/tn-modal.vue

247 lines
5.5 KiB
Vue
Raw Normal View History

2023-12-25 17:56:30 +08:00
<template>
<view v-if="value" class="tn-modal-class tn-modal">
<tn-popup
v-model="value"
mode="center"
:popup="false"
:borderRadius="radius"
:width="width"
:zoom="zoom"
:safeAreaInsetBottom="safeAreaInsetBottom"
:maskCloseable="maskCloseable"
:zIndex="zIndex"
:closeBtn="showCloseBtn"
@close="close"
>
<!-- 内容 -->
<view
class="tn-modal__box"
:class="[
backgroundColorClass
]"
:style="[boxStyle]"
>
<!-- 不是自定义弹框内容 -->
<view v-if="!custom">
<view class="tn-modal__box__title" v-if="title && title !== ''">{{ title }}</view>
<view
class="tn-modal__box__content"
:class="[
fontColorClass,
contentClass
]"
:style="contentStyle"
>{{ content }}</view>
<view v-if="button && button.length" class="tn-modal__box__btn-box" :class="[button.length != 2 ? 'tn-flex-direction-column' : '']">
<block v-for="(item, index) in button" :key="index">
<tn-button
width="100%"
height="68rpx"
:fontSize="26"
:backgroundColor="item.backgroundColor || ''"
:fontColor="item.fontColor || ''"
:plain="item.plain || false"
:shape="item.shape || 'round'"
:class="[
button.length > 2 ? 'tn-margin-bottom' : ''
]"
@click="handleClick(index)"
:style="{
width: button.length != 2 ? '80%' : '46%'
}"
>
{{ item.text }}
</tn-button>
</block>
</view>
</view>
<view v-else>
<slot></slot>
</view>
</view>
</tn-popup>
</view>
</template>
<script>
import componentsColorMixin from '../../libs/mixin/components_color.js'
export default {
mixins: [componentsColorMixin],
name: 'tn-modal',
props: {
// 显示控制
value: {
type: Boolean,
default: false
},
// 弹框宽度
width: {
type: String,
default: '84%'
},
// 内边距
padding: {
type: String,
default: ''
},
// 圆角
radius: {
type: Number,
default: 12
},
// 标题
title: {
type: String,
default: ''
},
// 内容
content: {
type: String,
default: ''
},
// 按钮内容 设置参数与button组件的参数一致
// {
// text: '确定',
// backgroundColor: 'red',
// fontColor: 'white',
// plain: true,
// shape: ''
// }
button: {
type: Array,
default: () => {
return []
}
},
safeAreaInsetBottom: {
type: Boolean,
default: false
},
// 点击遮罩是否可以关闭
maskCloseable: {
type: Boolean,
default: true
},
// 是否显示右上角关闭按钮
showCloseBtn: {
type: Boolean,
default: false
},
// 放大动画
zoom: {
type: Boolean,
default: true
},
// 自定义弹框内容
custom: {
type: Boolean,
default: false
},
// 弹框的z-index
zIndex: {
type: Number,
default: 0
}
},
computed: {
boxStyle() {
let style = {}
if (this.padding) {
style.padding = this.padding
}
if (this.backgroundColorStyle) {
style.backgroundColor = this.backgroundColorStyle
}
return style
},
contentClass() {
let clazz = ''
if (this.title) {
clazz += ' tn-margin-top'
} else {
clazz += ' tn-modal__box__content--no-title'
}
return clazz
},
contentStyle() {
let style = {}
if (this.fontSize) {
style.fontSize = this.fontSize + this.fontUnit
}
if (this.fontColorStyle) {
style.color = this.fontColorStyle
}
return style
},
},
data() {
return {
}
},
methods: {
// 处理按钮点击事件
handleClick(index) {
if (!this.value) return
this.$emit("click", {
index: Number(index)
})
},
// 处理关闭事件
close() {
this.$emit("cancel")
this.$emit('input', false)
}
}
}
</script>
<style lang="scss" scoped>
.tn-modal {
&__box {
position: relative;
box-sizing: border-box;
background-color: #FFFFFF;
padding: 40rpx 64rpx;
&__title {
text-align: center;
font-size: 34rpx;
color: #333;
padding-top: 20rpx;
font-weight: bold;
}
&__content {
text-align: center;
padding-bottom: 30rpx;
color: $tn-font-color;
font-size: 28rpx;
&--no-title {
padding-bottom: 0rpx !important;
}
}
&__btn-box {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
}
&__content ~ &__btn-box {
margin-top: 30rpx;
}
}
}
</style>