247 lines
5.5 KiB
Vue
247 lines
5.5 KiB
Vue
|
<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>
|