将dialog文件内容单独管理,减少主文件的代码量
在plugins路径下添加dialog.ts
一、dialog.ts代码
import { h, render } from 'vue';
function createDialog(component: any, options: any) {
return new Promise((resolve, reject) => {
const mountNode = document.createElement('div');
document.body.appendChild(mountNode);
const vNode = h(component, {
...options,
// 注意: vue子组件emit回调事件名称必须以on开头
onSubmit: (data) => {
resolve(data);
document.body.removeChild(mountNode);
},
onCancel: (data) => {
reject(data);
document.body.removeChild(mountNode);
},
});
render(vNode, mountNode);
});
}
export default createDialog;
二、在main.ts引入
// 引入函数式弹窗
import Dialog from '~/plugins/Dialog';
const app = createApp(App);
// 全局方法挂载
app.config.globalProperties.$dialog = Dialog;
三、在文件中使用$dialog
import processingResultsDilog from './dialog/processingResults.vue';
function openHandleDialog(row) {
proxy
.$dialog(processingResultsDilog, {
title: '新增弹框',
data: row,
})
.then((res) => {
// submit
console.log(res);
})
.catch((error) => {
// cancel 回调
console.log(error);
});
}
四、processingResultsDilog文件内容
<template>
<el-dialog
v-model="dialogVisible" :title="title" width="35%"
>
<el-form ref="formRef" :model="form" >
<el-form-item label="是否:" prop="falseAlarm">
<el-radio-group v-model="form.falseAlarm">
<el-radio :value="1">
是
</el-radio>
<el-radio :value="0">
否
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="原因:" prop="reason">
<el-input v-model="form.reason" :rows="4" type="textarea" placeholder="请输入原因" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="handleSubmit">保存</el-button>
<el-button @click="handleCancel">取消</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { reactive, toRefs } from 'vue';
import { ElButton, ElDialog, ElRadio } from 'element-plus';
const props = withDefaults(
defineProps<{
title?: string; // 标题
data?: any; // 内容
}>(),
{},
);
const emits = defineEmits<{ submit: [any]; cancel: [any]; }>();
const state = reactive({
dialogVisible: true,
});
const { dialogVisible } = toRefs(state);
const form = ref({
reason: '',
falseAlarm: 0,
});
/** submit */
const handleSubmit = () => {
emits('submit', form.value);
// 关闭弹窗
dialogVisible.value = false;
};
/** cancel */
const handleCancel = () => {
// 回调
// emits('cancel', { action: 'cancel', msg: 'cancel back' });
// 关闭弹窗
dialogVisible.value = false;
};
const formRef = ref();
</script>