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.

470 lines
12 KiB

2 years ago
<template name="show-modal">
<view>
<u-modal v-model="show" :title-style="{color: 'red'}" :title="title" :showTitle="false"
:showConfirmButton="false" ref="modal">
<view class="slot-content">
<slot name="icon">
<image class="icon" :src="icon" />
</slot>
<slot name="content">
<rich-text class="content" :nodes="content">
</rich-text>
</slot>
<view class='split_line'></view>
2 years ago
<slot name="button">
<view class="uni-flex uni-row u-col-center space-between" style="width: 100%;height: 48px;">
<view v-if="showCancelButton" class="cance_button" @tap="cancelClose">
<text :style="{'color':cancelColor}">{{ cancelText }}</text>
</view>
<u-line direction="col" length="100%"></u-line>
<view v-if="showConfirmButton" class="confirm_button" @tap="confirmClose">
<text :style="{'color':confirmColor}">{{confirmText}}</text>
<text v-if="showConfirmCountdown">({{seconds}}s关闭)</text>
</view>
</view>
</slot>
</view>
</u-modal>
</view>
</template>
<script setup lang="ts">
2 years ago
/**
* modal 模态框
* @description 弹出模态框常用于消息提示消息确认在当前页面内完成特定的交互操作
* */
import {
ref,
getCurrentInstance
} from 'vue'
const timer = ref(null)
const show = ref(false) // 是否显示
const iconType = ref('消息')
const icon = ref('../../static/icons/error-circle.svg')
const title = ref('')
const content = ref('') // 提示内容
const cancelText = ref('取消') // 取消按钮的文字
const confirmText = ref('确定') // 确认按钮文字
const showCancel = ref(true) // 是否显示取消按钮,默认为 true
const confirmColor = ref('#007aff') // 确定按钮颜色
const cancelColor = ref(null) // 取消按钮颜色
const showConfirmButton = ref(true) // 是否显示确认按钮
const showConfirmCountdown = ref(true) // 是否显示确定倒计时
const showCancelButton = ref(true) // 是否显示取消按钮
const showClose = ref(false)
const confirm = ref(false) //为 true 时,表示用户点击了确定按钮
const cancel = ref(false) //为 true 时,表示用户点击了取消
const isDisabled = ref(true) //为 true 时,表示用户可以点击,反之则不可以
const seconds = ref(0)
const success = () => {
2 years ago
}
const open = () => {
show.value = true;
isDisabled.value = true;
}
const close = () => {
show.value = false
isDisabled.value = false;
}
const confirmClose = () => {
if (!isDisabled.value) return
isDisabled.value = false
// console.log('确定点击')
if (show.value) {
show.value = false;
clearInterval(timer.value) //清空timer
success({
// cancel: false,
confirm: true,
});
}
}
const cancelClose = () => {
if (!isDisabled.value) return
isDisabled.value = false
clearInterval(timer.value) //清空timer
show.value = false
success({
// cancel: true,
confirm: false,
});
}
// 打开消息弹框(确定+倒计时)
const showMessage = (mContent, callback) => {
showConfirmCountdownModal("消息", mContent, callback);
}
// 打开成功弹框(确定+倒计时)
const showSuccessMessage = (mContent, callback) => {
showConfirmCountdownModal("成功", mContent, callback);
}
// 打开失败弹框(确定)
const showErrorMessage = (mContent, callback) => {
console.log(333)
showConfirmModal("失败", mContent, callback);
}
2 years ago
// 显示崩溃消息(无确定)
const showBreakMessage = (mContent, callback) => {
showNoButtonModal("失败", mContent, callback);
}
// 打开疑问弹框(取消+确定)
const showQuestionMessage = (mContent, callback) => {
showSelectModal("疑问", mContent, callback);
}
// 打开警告弹框(确定+倒计时)
const showWarningMessage = (mContent, callback) => {
showConfirmCountdownModal("警告", mContent, callback);
}
// 打开失败弹框(确定+倒计时)
const showConfirmCountdownFailModal = (mContent, callback) => {
showConfirmCountdownModal("失败", mContent, callback);
}
// 打开消息弹框(确定)
const showConfirmMessageModal = (mContent, callback) => {
showConfirmModal("消息", mContent, callback);
}
// 打开成功弹框(确定)
const showConfirmSuccessModall = (mContent, callback) => {
showConfirmModal("成功", mContent, callback);
}
// 打开警告弹框(确定)
const showConfirmWarningModal = (mContent, callback) => {
showConfirmModal("警告", mContent, callback);
}
// 打开疑问弹框(确定)
const showConfirmQuestionModal = (mContent, callback) => {
showConfirmModal("疑问", mContent, callback);
}
// 初始化弹框并打开(确定)
const showNoButtonModal = (mIconType, mContent, callback) => {
showModal({
iconType: mIconType,
content: mContent,
showConfirmButton: false,
showCancelButton: false,
success: function(res) {
if (callback != undefined) {
if (res.confirm == true) {
callback(true);
} else {
callback(false);
2 years ago
}
}
}
});
}
// 初始化弹框并打开(确定)
const showConfirmModal = (mIconType, mContent, callback) => {
console.log(222)
showModal({
iconType: mIconType,
content: mContent,
showCancelButton: false,
success: function(res) {
if (callback != undefined) {
if (res.confirm == true) {
callback(true);
} else {
callback(false);
}
2 years ago
}
}
});
}
2 years ago
// 打开消息弹框(取消+确定)
const showSelectMessageModal = (mContent, callback) => {
showSelectModal("消息", mContent, callback);
}
2 years ago
// 打开成功弹框(取消+确定)
const showSelectSuccessModal = (mContent, callback) => {
showSelectModal("成功", mContent, callback);
}
2 years ago
// 打开失败弹框(取消+确定)
const showSelectFailModal = (mContent, callback) => {
showSelectModal("失败", mContent, callback);
}
2 years ago
// 打开警告弹框(取消+确定)
const showSelectWarningModal = (mContent, callback) => {
showSelectModal("警告", mContent, callback);
}
2 years ago
// 初始化弹框并打开(取消+确定)
const showSelectModal = (mIconType, mContent, callback) => {
showModal({
iconType: mIconType,
content: mContent,
success: function(res) {
if (callback != undefined) {
if (res.confirm == true) {
callback(true);
console.log('用户点击确定')
} else {
callback(false);
console.log('用户点击取消')
}
2 years ago
}
}
});
}
// 打开疑问弹框(确定+倒计时)
const showConfirmCountdownQuestionModal = (mContent, callback) => {
showConfirmCountdownModal("疑问", mContent, callback);
}
// 初始化弹框并打开(确定+倒计时)
const showConfirmCountdownModal = (mIconType, mContent, callback) => {
showModal({
iconType: mIconType,
content: mContent,
showCancelButton: false,
showConfirmCountdown: true,
success: function(res) {
if (callback != undefined) {
if (res.confirm == true) {
callback(true);
} else {
callback(false);
2 years ago
}
}
}
});
}
2 years ago
// 打开消息弹框(取消+确定+倒计时)
const showSelectCountdownMessageModal = (mContent, callback) => {
showSelectCountdownModal("消息", mContent, callback);
}
2 years ago
// 打开成功弹框(取消+确定+倒计时)
const showSelectCountdownSuccessModal = (mContent, callback) => {
showSelectCountdownModal("成功", mContent, callback);
}
// 打开失败弹框(取消+确定+倒计时)
const showSelectCountdownFailModal = (mContent, callback) => {
showSelectCountdownModal("失败", mContent, callback);
}
// 打开警告弹框(取消+确定+倒计时)
const showSelectCountdownWarningModal = (mContent, callback) => {
showSelectCountdownModal("警告", mContent, callback);
}
// 打开疑问弹框(取消+确定+倒计时)
const showSelectCountdownQuestionModal = (mContent, callback) => {
showSelectCountdownModal("疑问", mContent, callback);
}
// 初始化弹框并打开(取消+确定+倒计时)
const showSelectCountdownModal = (mIconType, mContent, callback) => {
showModal({
iconType: mIconType,
content: mContent,
showConfirmCountdown: true,
success: function(res) {
if (callback != undefined) {
if (res.confirm == true) {
callback(true);
console.log('用户点击确定')
} else {
callback(false);
console.log('用户点击取消')
}
}
}
});
}
2 years ago
// 初始化弹框并打开
const showModal = (data) => {
if (data.iconType) {
iconType.value = data.iconType
switch (data.iconType) {
case '消息':
icon.value = '/static/icons/error-circle.svg';
break;
case '成功':
icon.value = '/static/icons/checkmark-circle.svg';
break;
case '失败':
icon.value = '/static/icons/close-circle.svg';
break;
case '警告':
icon.value = '/static/icons/warning.svg';
break;
case '疑问':
icon.value = '/static/icons/question-circle.svg';
break;
default:
break;
}
}
// image
if (data.title) {
title.value = data.title
}
if (data.content) {
content.value = data.content
} else {
content.value = ''
}
if (data.cancelText) {
cancelText.value = data.cancelText
} else {
cancelText.value = '取消'
}
if (data.confirmText) {
confirmText.value = data.confirmText
} else {
confirmText.value = '确定'
}
if (data.showCancel === false || data.showCancel === true) {
showCancel.value = data.showCancel
} else {
showCancel.value = true
}
if (data.confirmColor) {
confirmColor.value = data.confirmColor
} else {
confirmColor.value = '#007aff'
}
if (data.cancelColor) {
cancelColor.value = data.cancelColor
} else {
cancelColor.value = '#666F83'
}
if (data.showConfirmButton === false || data.showConfirmButton === true) {
showConfirmButton.value = data.showConfirmButton
} else {
showConfirmButton.value = true
}
if (data.showConfirmCountdown === false || data.showConfirmCountdown === true) {
showConfirmCountdown.value = data.showConfirmCountdown
} else {
showConfirmCountdown.value = false
}
if (data.showCancelButton === false || data.showCancelButton === true) {
showCancelButton.value = data.showCancelButton
} else {
showCancelButton.value = true
}
if (data.success) {
success = data.success
} else {
success = () => {}
}
setTimeout(res => {
open();
}, 500)
if (showConfirmCountdown.value) {
startTimer();
}
2 years ago
}
2 years ago
const startTimer = () => {
seconds.value = 3;
clearInterval(timer.value)
timer.value = setInterval(() => {
seconds.value--
// console.log("倒计时时间", this.seconds);
if (seconds.value <= 0) {
timeUp()
return
}
}, 1000)
}
const timeUp = () => {
// clearInterval(this.timer)
console.log('时间到')
confirmClose();
2 years ago
}
defineExpose({ showErrorMessage }) // 提供 open 方法,用于打开弹窗
2 years ago
</script>
<style lang="scss" scoped>
.slot-content {
font-size: 36rpx;
display: flex; //弹性布局
flex-direction: column; //垂直排列
align-items: center; //子元素居中
// background-image: url()
}
.icon {
width: 70rpx;
height: 70rpx;
opacity: 1; //透明度
margin-top: 16px;
}
.title {
font-size: 35rpx;
}
.content {
width: 100%;
margin-top: 16px;
margin-bottom: 16px;
margin-left: 8px;
margin-right: 8px;
font-size: 32rpx;
text-align: center;
}
.cance_button {
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
font-size: 32rpx;
display: flex;
justify-content: center;
align-items: center;
}
.confirm_button {
width: 100%;
margin-top: 10px;
margin-bottom: 10px;
font-size: 32rpx;
display: flex;
justify-content: center;
align-items: center;
}
.confirm_text {
// color: $uni-color-primary;
}
.def_text {
color: $uni-color-primary;
}
</style>