chat-pc/src/components/common/customModal.vue

135 lines
2.9 KiB
Vue
Raw Normal View History

<template>
<xNModal v-model:show="show" v-bind="$attrs">
<template #header>
<div class="custom-modal-header">
<div class="header-content">
<template v-if="$slots.header">
<slot name="header"></slot>
</template>
<template v-else>
{{ title }}
</template>
<div class="custom-close-btn" v-if="customCloseBtn">
<img src="@/assets/image/icon/close-btn-grey.png" alt="" @click="handleCloseModal"/>
</div>
</div>
</div>
</template>
<slot name="content"></slot>
<template #footer>
<div class="custom-modal-btns">
<customBtn
color="#C7C7C9"
style="width: 161px; height: 34px;"
@click="handleCancel"
v-if="actionBtns.cancelBtn"
>取消</customBtn
>
<customBtn
color="#46299D"
style="width: 161px; height: 34px;"
@click="handleConfirm"
:loading="state.confirmBtnLoading"
v-if="actionBtns.confirmBtn"
>确定</customBtn
>
</div>
</template>
</xNModal>
</template>
<script setup>
import { reactive, computed } from 'vue'
import xNModal from '@/components/x-naive-ui/x-n-modal/index.vue'
import customBtn from '@/components/common/customBtn.vue'
const props = defineProps({
show: {
// 是否显示模态框
type: Boolean,
default: false
},
title: {
// 模态框标题
type: String,
default: ''
},
actionBtns: {
// 操作按钮
type: Object,
default: () => ({})
},
customCloseBtn: {
// 是否显示自定义关闭按钮
type: Boolean,
default: false
}
})
const emit = defineEmits(['update:show', 'cancel', 'confirm'])
const show = computed({
get: () => props.show,
set: (val) => emit('update:show', val)
})
const handleCancel = () => {
show.value = false
emit('cancel')
}
const handleConfirm = () => {
state.confirmBtnLoading = true
emit('confirm', closeLoading)
}
const closeLoading = () => {
state.confirmBtnLoading = false
}
const state = reactive({
confirmBtnLoading: false // 确定按钮loading
})
const handleCloseModal = () => {
show.value = false
}
</script>
<style scoped lang="less">
.custom-modal-header {
border-bottom: 1px solid #e5e5e5;
margin: 0 12px;
.header-content {
padding: 0 0 15px;
text-align: center;
color: #1f2225;
font-size: 20px;
font-weight: 600;
line-height: 28px;
position: relative;
.custom-close-btn {
position: absolute;
right: 0;
top: 0;
cursor: pointer;
img {
width: 30px;
height: 30px;
}
}
}
}
.custom-modal-btns {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
gap: 10px;
padding: 0 0 50px;
}
</style>