diff --git a/apps/web/src/oj/problem/components/BasicEditor.vue b/apps/web/src/oj/problem/components/BasicEditor.vue index f830663..04dfb2d 100644 --- a/apps/web/src/oj/problem/components/BasicEditor.vue +++ b/apps/web/src/oj/problem/components/BasicEditor.vue @@ -27,7 +27,8 @@ const editorHeight = computed(() => isDesktop.value ? "calc(100vh - 133px)" : "calc(100vh - 172px)", ) -onMounted(() => { +function loadCode() { + codeStore.code.language = problemStore.supportedLanguage(codeStore.code.language) const savedCode = storage.get(storageKey.value) codeStore.setCode( savedCode || @@ -35,7 +36,12 @@ onMounted(() => { SOURCES[codeStore.code.language], ) beginEditTrace(`problem_${problem.value!._id}_contest_${contestID}`, codeStore.code.value.length) -}) +} + +onMounted(loadCode) + +// 换题时组件复用、不重新挂载,和 ProblemEditor 一样得自己重新载入 +watch(() => problem.value?._id, loadCode) const changeCode = (v: string) => { storage.set(storageKey.value, v) diff --git a/apps/web/src/oj/problem/components/EditorToolbar.vue b/apps/web/src/oj/problem/components/EditorToolbar.vue index 0a103bf..625ef84 100644 --- a/apps/web/src/oj/problem/components/EditorToolbar.vue +++ b/apps/web/src/oj/problem/components/EditorToolbar.vue @@ -185,17 +185,20 @@ const handleMenuSelect = (key: string) => { } } -const languageOptions: DropdownOption[] = languages.value.map((it) => ({ - label: () => - h(NFlex, { align: "center" }, () => [ - h(Icon, { - icon: ICON_SET[it], - width: 16, - }), - LANGUAGE_SHOW_VALUE[it], - ]), - value: it, -})) +// computed:换题时组件复用,选项得跟着新题的语言走 +const languageOptions = computed(() => + languages.value.map((it) => ({ + label: () => + h(NFlex, { align: "center" }, () => [ + h(Icon, { + icon: ICON_SET[it], + width: 16, + }), + LANGUAGE_SHOW_VALUE[it], + ]), + value: it, + })), +) const copy = async () => { const success = await copyToClipboard(codeStore.code.value) @@ -247,12 +250,7 @@ const goEdit = () => { window.open(router.resolve(url).href, "_blank") } -onMounted(() => { - if (!languages.value.includes(codeStore.code.language)) { - // 回退到题目支持的第一种语言(如 SQL 题只有 "SQL",硬编码 Python 会被后端拒绝) - codeStore.code.language = languages.value[0] ?? "Python" - } -}) +// 语言回退不在这里做:它得排在载入草稿之前,见 problem store 的 supportedLanguage