fix:修复开场白路由跳转后页面空白
This commit is contained in:
parent
99fcfd22db
commit
a023719e5c
|
@ -1,4 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
|
<div v-if="isComponentActive" class="prologue-manage-container">
|
||||||
<el-card>
|
<el-card>
|
||||||
<el-form :model="form" label-width="120px">
|
<el-form :model="form" label-width="120px">
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
|
@ -15,7 +16,7 @@
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item :label="t('vabI18n.prologue.openingContent')">
|
<el-form-item :label="t('vabI18n.prologue.openingContent')">
|
||||||
<el-input type="textarea" v-model="form.content" rows="8"></el-input>
|
<el-input type="textarea" v-model="form.content" :rows="8"></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
|
||||||
<!-- 新增推荐问题 -->
|
<!-- 新增推荐问题 -->
|
||||||
|
@ -28,8 +29,8 @@
|
||||||
<el-table-column :label="t('vabI18n.prologue.recommendation')" prop="questionContent" />
|
<el-table-column :label="t('vabI18n.prologue.recommendation')" prop="questionContent" />
|
||||||
<el-table-column :label="t('vabI18n.prologue.action')" width="180">
|
<el-table-column :label="t('vabI18n.prologue.action')" width="180">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<el-button size="mini" @click="editRecommend(scope.row)">{{t('vabI18n.prologue.edit')}}</el-button>
|
<el-button size="small" @click="editRecommend(scope.row)">{{t('vabI18n.prologue.edit')}}</el-button>
|
||||||
<el-button size="mini" type="danger" @click="deleteRecommend(scope.row)">{{t('vabI18n.prologue.delete')}}</el-button>
|
<el-button size="small" type="danger" @click="deleteRecommend(scope.row)">{{t('vabI18n.prologue.delete')}}</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
@ -53,7 +54,7 @@
|
||||||
<!-- 编辑推荐问题弹窗 -->
|
<!-- 编辑推荐问题弹窗 -->
|
||||||
<el-dialog v-model="editdialogVisible" :title="t('vabI18n.prologue.dialog.editTitle')">
|
<el-dialog v-model="editdialogVisible" :title="t('vabI18n.prologue.dialog.editTitle')">
|
||||||
<el-form :model="currentRecommendation" label-width="120px">
|
<el-form :model="currentRecommendation" label-width="120px">
|
||||||
<el-form-item label="t('vabI18n.prologue.dialog.questionContent')">
|
<el-form-item :label="t('vabI18n.prologue.dialog.questionContent')">
|
||||||
<el-input v-model="currentRecommendation.questionContent" />
|
<el-input v-model="currentRecommendation.questionContent" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
@ -63,10 +64,11 @@
|
||||||
</span>
|
</span>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, watch, onMounted } from 'vue'
|
import { ref, watch, onMounted, onBeforeUnmount, nextTick } from 'vue'
|
||||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
import { getRemark, saveRemark, getRecommendations, editRecommendation, deleteRecommendation, addRecommendation } from '@/api/prologue'
|
import { getRemark, saveRemark, getRecommendations, editRecommendation, deleteRecommendation, addRecommendation } from '@/api/prologue'
|
||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
|
@ -75,6 +77,8 @@
|
||||||
|
|
||||||
defineOptions({
|
defineOptions({
|
||||||
name: 'prologueManage',
|
name: 'prologueManage',
|
||||||
|
// 添加这个配置确保组件在路由切换时正确处理
|
||||||
|
inheritAttrs: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
const form = ref({
|
const form = ref({
|
||||||
|
@ -98,7 +102,7 @@
|
||||||
if (res.data) {
|
if (res.data) {
|
||||||
form.value.content = res.data.content
|
form.value.content = res.data.content
|
||||||
ElMessage.success(t('vabI18n.prologue.message.loadSuccess'))
|
ElMessage.success(t('vabI18n.prologue.message.loadSuccess'))
|
||||||
await loadRecommendations() // 获取推荐问题列表
|
await safeLoadRecommendations() // 获取推荐问题列表
|
||||||
} else {
|
} else {
|
||||||
form.value.content = ''
|
form.value.content = ''
|
||||||
ElMessage.error(t('vabI18n.prologue.message.notFound'))
|
ElMessage.error(t('vabI18n.prologue.message.notFound'))
|
||||||
|
@ -125,7 +129,7 @@
|
||||||
watch(
|
watch(
|
||||||
() => form.value.chatType,
|
() => form.value.chatType,
|
||||||
() => {
|
() => {
|
||||||
load()
|
safeLoad()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -193,13 +197,69 @@
|
||||||
try {
|
try {
|
||||||
await deleteRecommendation(row.id) // 根据 id 删除推荐问题
|
await deleteRecommendation(row.id) // 根据 id 删除推荐问题
|
||||||
ElMessage.success(t('vabI18n.prologue.message.deleteSuccess'))
|
ElMessage.success(t('vabI18n.prologue.message.deleteSuccess'))
|
||||||
await loadRecommendations() // 重新加载推荐问题列表
|
await safeLoadRecommendations() // 重新加载推荐问题列表
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
ElMessage.error(t('vabI18n.prologue.message.deleteFailed'))
|
ElMessage.error(t('vabI18n.prologue.message.deleteFailed'))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 用于防止组件销毁后异步请求仍然执行
|
||||||
|
const isComponentActive = ref(true)
|
||||||
|
|
||||||
|
// 安全的异步操作包装器
|
||||||
|
const safeAsyncOperation = async (operation: () => Promise<void>) => {
|
||||||
|
if (!isComponentActive.value) return
|
||||||
|
try {
|
||||||
|
await operation()
|
||||||
|
} catch (error) {
|
||||||
|
if (isComponentActive.value) {
|
||||||
|
console.error('Async operation failed:', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改异步函数以使用安全包装器
|
||||||
|
const safeLoad = () => safeAsyncOperation(load)
|
||||||
|
const safeLoadRecommendations = () => safeAsyncOperation(loadRecommendations)
|
||||||
|
|
||||||
// 在组件加载时获取初始的开场白内容
|
// 在组件加载时获取初始的开场白内容
|
||||||
onMounted(load)
|
onMounted(() => {
|
||||||
|
nextTick(() => {
|
||||||
|
safeLoad()
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// 组件卸载前清理
|
||||||
|
onBeforeUnmount(() => {
|
||||||
|
isComponentActive.value = false
|
||||||
|
// 重置所有响应式数据
|
||||||
|
form.value = {
|
||||||
|
chatType: '1',
|
||||||
|
content: '',
|
||||||
|
}
|
||||||
|
recommendations.value = []
|
||||||
|
dialogVisible.value = false
|
||||||
|
editdialogVisible.value = false
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.prologue-manage-container {
|
||||||
|
width: 100%;
|
||||||
|
min-height: 100vh;
|
||||||
|
padding: 20px;
|
||||||
|
|
||||||
|
.el-card {
|
||||||
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.12), 0 0 6px rgba(0, 0, 0, 0.04);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dialog-footer {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.el-table {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
Loading…
Reference in New Issue