1
0
mirror of https://github.com/zclzone/vue-naive-admin.git synced 2026-01-22 23:50:22 +08:00
Files
vue-naive-admin/src/components/me/modal/index.vue
2024-06-06 18:05:36 +08:00

192 lines
4.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!--------------------------------
- @Author: Ronnie Zhang
- @LastEditor: Ronnie Zhang
- @LastEditTime: 2024/01/13 17:41:38
- @Email: zclzone@outlook.com
- Copyright © 2023 Ronnie Zhang(大脸怪) | https://isme.top
--------------------------------->
<template>
<n-modal
v-model:show="show"
class="modal-box"
:style="{ width: modalOptions.width, ...modalOptions.modalStyle }"
:preset="undefined"
size="huge"
:bordered="false"
@after-leave="onAfterLeave"
>
<n-card :style="modalOptions.contentStyle" :closable="modalOptions.closable" @close="close()">
<template #header>
<header class="modal-header">
{{ modalOptions.title }}
</header>
</template>
<slot />
<!-- 底部按钮 -->
<template #footer>
<slot v-if="$slots.footer" name="footer" />
<footer v-else-if="modalOptions.showFooter" class="flex justify-end">
<n-button v-if="modalOptions.showCancel" @click="handleCancel()">
{{ modalOptions.cancelText }}
</n-button>
<n-button
v-if="modalOptions.showOk"
type="primary"
:loading="modalOptions.okLoading"
class="ml-20"
@click="handleOk()"
>
{{ modalOptions.okText }}
</n-button>
</footer>
</template>
</n-card>
</n-modal>
</template>
<script setup>
import { initDrag } from './utils'
const props = defineProps({
width: {
type: String,
default: '800px',
},
title: {
type: String,
default: '',
},
closable: {
type: Boolean,
default: true,
},
cancelText: {
type: String,
default: '取消',
},
okText: {
type: String,
default: '确定',
},
showFooter: {
type: Boolean,
default: true,
},
showCancel: {
type: Boolean,
default: true,
},
showOk: {
type: Boolean,
default: true,
},
modalStyle: {
type: Object,
default: () => {},
},
contentStyle: {
type: Object,
default: () => {},
},
onOk: {
type: Function,
default: () => {},
},
onCancel: {
type: Function,
default: () => {},
},
})
// 声明一个show变量用于控制模态框的显示与隐藏
const show = ref(false)
// 声明一个modalOptions变量用于存储模态框的配置信息
const modalOptions = ref({})
const okLoading = computed({
get() {
return !!modalOptions.value?.okLoading
},
set(v) {
if (modalOptions.value) {
modalOptions.value.okLoading = v
}
},
})
// 打开模态框
async function open(options = {}) {
// 将props和options合并赋值给modalOptions
modalOptions.value = { ...props, ...options }
// 将show的值设置为true
show.value = true
await nextTick()
initDrag(
Array.prototype.at.call(document.querySelectorAll('.modal-header'), -1),
Array.prototype.at.call(document.querySelectorAll('.modal-box'), -1),
)
}
// 定义一个close函数用于关闭模态框
function close() {
show.value = false
}
// 定义一个handleOk函数用于处理模态框确定操作
async function handleOk(data) {
// 如果modalOptions中没有onOk函数则直接关闭模态框
if (typeof modalOptions.value.onOk !== 'function') {
return close()
}
try {
// 调用onOk函数传入data参数
const res = await modalOptions.value.onOk(data)
// 如果onOk函数的返回值不为false则关闭模态框
res !== false && close()
}
catch (error) {
okLoading.value = false
console.error(error)
}
}
// 定义一个handleCancel函数用于处理模态框取消操作
async function handleCancel(data) {
// 如果modalOptions中没有onCancel函数则直接关闭模态框
if (typeof modalOptions.value.onCancel !== 'function') {
return close()
}
try {
// 调用onCancel函数传入data参数
const res = await modalOptions.value.onCancel(data)
// 如果onCancel函数的返回值不为false则关闭模态框
res !== false && close()
}
catch (error) {
okLoading.value = false
console.error(error)
}
}
async function onAfterLeave() {
await nextTick()
initDrag(
Array.prototype.at.call(document.querySelectorAll('.modal-header'), -1),
Array.prototype.at.call(document.querySelectorAll('.modal-box'), -1),
)
}
// 定义一个defineExpose函数用于暴露open、close、handleOk、handleCancel函数
defineExpose({
open,
close,
handleOk,
handleCancel,
okLoading,
options: modalOptions,
})
</script>