Modal弹出的模态框点击确认和取消无法关闭
来源:8-6 增加删除文档功能

明明是只幼刀
2024-02-16
点击确定和取消后,其中的代码可以正常执行,但是模态框无法自动关闭
请问老师这是什么原因呀,代码和老师的一致
暂时使用router.go(0)进行页面重新加载,等待解决
<template>
<a-layout>
<a-layout-content
:style="{ background: '#fff', padding: '24px', margin: 0, minHeight: '280px' }"
>
<a-form
layout="inline"
:model="param"
>
<a-form-item>
<a-button type="primary" @click="handleQuery()">
查询
</a-button>
</a-form-item>
<a-form-item>
<a-button type="primary" @click="add()">
新增
</a-button>
</a-form-item>
</a-form>
<a-table
:columns="columns"
:row-key="record => record.id"
:data-source="level1"
:pagination="false"
:loading="loading"
>
<template #cover="{ text: cover }">
<img v-if="cover" :src="cover" alt="avatar"/>
</template>
<template v-slot:action="{ text, record }">
<a-space size="small">
<a-button type="primary" @click="edit(record)">
编辑
</a-button>
<a-popconfirm
title="删除后不可恢复,确认删除?"
ok-text="是"
cancel-text="否"
@confirm="handleDelete(record.id)"
>
<a-button type="danger">
删除
</a-button>
</a-popconfirm>
</a-space>
</template>
</a-table>
</a-layout-content>
</a-layout>
<a-modal
title="文档表单"
v-model:visible="modalVisible"
:confirm-loading="modalLoading"
@ok="handleModalOk"
>
<a-form :model="doc" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
<a-form-item label="名称">
<a-input v-model:value="doc.name"/>
</a-form-item>
<a-form-item label="父文档">
<a-tree-select
v-model:value="doc.parent"
style="width: 100%"
:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
:tree-data="treeSelectData"
placeholder="请选择父文档"
tree-default-expand-all
:replaceFields="{title: 'name', key: 'id', value: 'id'}"
>
</a-tree-select>
</a-form-item>
<a-form-item label="排序">
<a-input v-model:value="doc.sort"/>
</a-form-item>
</a-form>
</a-modal>
</template>
<script lang="ts">
import {defineComponent, onMounted, ref, createVNode} from 'vue';
import axios from 'axios';
import {message, Modal} from 'ant-design-vue';
import {Tool} from "@/util/tool";
import {useRoute} from "vue-router";
import ExclamationCircleOutlined from "@ant-design/icons-vue/ExclamationCircleOutlined";
import router from "@/router";
export default defineComponent({
name: 'AdminDoc',
setup() {
const route = useRoute();
const param = ref();
param.value = {};
const docs = ref();
const loading = ref(false);
const columns = [
{
title: '名称',
dataIndex: 'name'
},
{
title: '父文档',
dataIndex: 'parent'
},
{
title: '排序',
dataIndex: 'sort'
},
{
title: 'Action',
key: 'action',
slots: {customRender: 'action'}
}
];
const level1 = ref();
/**
* 数据查询
**/
const handleQuery = () => {
loading.value = true;
// 如果不清空现有数据,则编辑保存重新加载数据后,再点编辑,则列表显示的还是编辑前的数据
level1.value = [];
axios.get("/doc/all").then((response) => {
loading.value = false;
const data = response.data;
if (data.success) {
docs.value = data.content;
console.log("原始数组:", docs.value);
level1.value = [];
level1.value = Tool.array2Tree(docs.value, 0);
console.log("树形结构:", level1);
} else {
message.error(data.message)
}
});
};
// -------- 表单 ---------
const treeSelectData = ref();
treeSelectData.value = [];
const doc = ref({});
const modalVisible = ref(false);
const modalLoading = ref(false);
const handleModalOk = () => {
modalLoading.value = true;
axios.post("/doc/save", doc.value).then((response) => {
modalLoading.value = false;
const data = response.data;
if (data.success) {
modalVisible.value = false;
handleQuery();
} else {
message.error(data.message)
}
});
};
/**
* 将某节点及其子孙节点全部置为disabled
*/
const setDisable = (treeSelectData: any, id: any) => {
// 遍历数组
for (const node of treeSelectData) {
// 将当前节点变为不可选
if (node.id === id) {
node.disabled = true;
// 获取子节点
const children = node.children;
// 如果子节点不为空,则将子节点遍历并递归
if (Tool.isNotEmpty(children)) {
for (const child of children) {
setDisable(children, child.id)
}
}
} else {
// 对非当前节点进行处理
const children = node.children;
if (Tool.isNotEmpty(children)) {
setDisable(children, id);
}
}
}
};
const deleteIds: Array<string> = [];
const deleteNames: Array<string> = [];
/**
* 将某节点及其子孙节点全部删除
*/
const getDeleteIds = (treeSelectData: any, id: any) => {
// 遍历数组
for (const node of treeSelectData) {
// 将当前节点id传入数组
if (node.id === id) {
deleteIds.push(node.id);
deleteNames.push(node.name);
// 获取子节点
const children = node.children;
// 如果子节点不为空,则将子节点遍历并递归
if (Tool.isNotEmpty(children)) {
for (const child of children) {
getDeleteIds(children, child.id)
}
}
} else {
// 对非当前节点进行处理
const children = node.children;
if (Tool.isNotEmpty(children)) {
getDeleteIds(children, id);
}
}
}
};
/**
* 编辑
*/
const edit = (record: any) => {
modalVisible.value = true;
doc.value = Tool.copy(record);
// 不能选择当前节点及其所有子孙节点,作为父节点,会使树断开
treeSelectData.value = Tool.copy(level1.value);
setDisable(treeSelectData.value, record.id);
// 为选择树添加一个"无"
treeSelectData.value.unshift({id: 0, name: '无'});
};
/**
* 新增
*/
const add = () => {
modalVisible.value = true;
doc.value = {
ebookId: route.query.ebookId
};
treeSelectData.value = Tool.copy(level1.value);
// 为选择树添加一个"无"
treeSelectData.value.unshift({id: 0, name: '无'});
};
const handleDelete = (id: number) => {
deleteIds.length = 0;
deleteNames.length = 0;
getDeleteIds(level1.value, id);
Modal.confirm({
title: () => '重要提醒',
icon: () => createVNode(ExclamationCircleOutlined),
content: () => '将删除: 【' + deleteNames.join(",") + "】删除后不可恢复,确认删除?",
onOk() {
axios.delete("/doc/delete/" + deleteIds.join(",")).then((response) => {
const data = response.data;
if (data.success) {
router.go(0)
}
});
},
onCancel(){
router.go(0)
}
});
};
onMounted(() => {
handleQuery();
});
return {
//docs,
level1,
doc,
columns,
loading,
param,
treeSelectData,
edit,
add,
handleDelete,
modalVisible,
modalLoading,
handleModalOk,
handleQuery,
}
}
});
</script>
<style scoped>
img {
width: 50px;
height: 50px;
}
</style>
写回答
1回答
-
甲蛙
2024-07-30
估计是版本代码不兼容,升级antdv版本试试
00
相似问题