解决方法是:调用父窗口刷新数据函数后,子窗口不执行隐藏,父窗口刷新数据成功后再隐藏子窗口。回头看出的这个问题感觉自己很可笑,但是为啥子窗口执行完刷新父窗口后立即隐藏,父窗口也执行了刷新数据函数,可数据就是时不时可以刷新出来,是网络传输的问题,还是数据库更新有延迟,还是窗口隐藏导致调用父窗口刷新数据时间不够,还是异步同步的问题,等等原因就不得而知了,问题解决了就好,欢迎指导。
参考方法如下:重点看加粗部分
父窗口
<template>
<el-table :data="pageModelDataInstance.list" style="width: 100%">
<el-table-column prop="funcName" label="名称" width="200" show-overflow-tooltip />
</el-table>
<DialogInstance v-model="dialogVisible" :dialogTitle="dialogTitle" v-if="dialogVisible" :dialogTableModel="curModel"
@initFuctionmoudleList="loadDataFromServer" />
</template>
<script setup lang="ts">
//引入编辑窗体
import DialogInstance from '@/components/functionmoudlesforms/FunctionForm.vue'
//编辑窗体是否显示
const dialogVisible = ref(false);
//刷新数据
const loadDataFromServer = async () => {
//封装的从服务器端加载数据函数
await getOnePageFunctionMoudlesList(basesiteinfo, multySearchModel)
.then((res) => {
//分页处理部分
………………
//刷新数据完成后隐藏子窗口
dialogVisible.value = false;
}).catch(() => {
console.info("出错啦");
});
}
</script>
子窗口:
<template>
<el-dialog :model-value="dialogVisible" width="30%" draggable @close="onFormClose">
<el-form ref="ruleFormRef" :model="formModel" label-width="100px" style="max-width: 460px" :rules="rules">
<el-form-item label="名称" prop="funcName">
<el-input v-model="formModel.funcName" type="text" />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="onFormClose">
<span class="iconfont"></span>取消
</el-button>
<el-button type="danger" @click="onConfirmcSaveToServer(ruleFormRef)">
<span class="iconfont"></span>保存
</el-button>
</span>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
//用户主动关闭子窗口
const onFormClose = () => {
//关闭窗口
emits("update:modelValue", false);
}
//保存至服务器
function onConfirmcSaveToServer(formEl: FormInstance | undefined) {
if (!formEl) return
formEl.validate((valid) => {
if (valid) {
// saveToServer为封装好的保存函数,保存成功返回true
saveToServer().then((res) => {
if (res) {
//重置表单,否则会出现重复添加的问题
ruleFormRef.value?.resetFields();
//只刷新父窗口,不关闭子窗口
emits("initFuctionmoudleList");
}
});
} else {
return false
}
})
}
</script>