You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

196 lines
3.6 KiB

<template>
<view>
<view v-if="internalVisible" class="fm-overlay"></view>
<view v-if="internalVisible" class="fm-wrap">
<view class="fm-card" :style="{ width: _width }">
<text class="fm-title">{{ _title }}</text>
<view class="fm-icon-wrap">
<image :src="imgSrcComputed" mode="aspectFit" class="fm-icon-img" />
</view>
<text class="fm-sub">{{ _subtitle }}</text>
<view class="fm-btn-wrap">
<button class="fm-btn" @click="onConfirm">{{ _buttonText }}</button>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
name: 'FeedbackModal',
props: {
title: {
type: String,
default: '提交成功'
},
subtitle: {
type: String,
default: '— 感谢您的反馈 —'
},
buttonText: {
type: String,
default: '确定'
},
status: {
type: String,
default: 'success'
},
lockScroll: {
type: Boolean,
default: true
},
width: {
type: String,
default: '600rpx'
}
},
data() {
return {
internalVisible: false,
_title: this.title,
_subtitle: this.subtitle,
_buttonText: this.buttonText,
_status: this.status,
_width: this.width,
};
},
computed: {
imgSrcComputed() {
return this._status === 'fail' ?
'/static/customer-service-platform/fail-icon.png' :
'/static/customer-service-platform/success-icon.png';
}
},
methods: {
show(options = {}) {
if (options.title) this._title = options.title;
if (options.subtitle) this._subtitle = options.subtitle;
if (options.buttonText) this._buttonText = options.buttonText;
if (options.status) this._status = options.status;
if (options.width) this._width = options.width;
if (this.lockScroll) this._lockScroll();
this.internalVisible = true;
},
hide() {
this.internalVisible = false;
if (this.lockScroll) this._unlockScroll();
},
onConfirm() {
this.hide();
this.$nextTick(() => {
this.$emit('confirm', {
status: this._status
});
});
},
//整个页面的滚动条被禁用,防止用户无法上下滚动页面
_lockScroll() {
try {
document.body.style.overflow = 'hidden';
} catch (e) {}
},
_unlockScroll() {
try {
document.body.style.overflow = '';
} catch (e) {}
}
},
beforeDestroy() {
if (this.lockScroll) this._unlockScroll();
}
};
</script>
<style scoped>
.fm-overlay {
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.35);
z-index: 999;
}
.fm-wrap {
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
padding: 40rpx;
box-sizing: border-box;
}
.fm-card {
background: #fff;
border-radius: 24rpx;
padding: 40rpx;
box-sizing: border-box;
text-align: center;
box-shadow: 0 6rpx 30rpx rgba(0, 0, 0, 0.12);
}
.fm-title {
display: block;
font-size: 48rpx;
font-weight: 700;
color: #333333;
margin-bottom: 40rpx;
}
.fm-icon-wrap {
width: 200rpx;
height: 200rpx;
margin: 0 auto 40rpx;
display: flex;
align-items: center;
justify-content: center;
}
.fm-icon-img {
width: 100%;
height: 100%;
}
.fm-sub {
display: block;
color: #666666;
font-size: 32rpx;
margin-bottom: 40rpx;
font-weight: 500;
}
.fm-btn-wrap {
display: flex;
justify-content: center;
}
.fm-btn {
width: 220rpx;
height: 60rpx;
border-radius: 32rpx;
background: #000;
color: #ffffff;
font-weight: 700;
font-size: 32rpx;
font-style: normal;
border: none;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20rpx;
}
</style>