From 850375158cc111ca7d4eb7b12cb4811e7a158e9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=B1=E7=AC=91=E7=9A=84=E6=AF=9B=E6=AF=9B=E8=99=AB?= <315515767@qq.com> Date: Tue, 4 Aug 2026 19:57:11 +0800 Subject: [PATCH] =?UTF-8?q?fix(settings):=20=E6=8F=90=E7=A4=BA=E8=AF=8D?= =?UTF-8?q?=E5=81=8F=E5=A5=BD=20-=20StrictMode=20=E5=8F=8C=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E7=AB=9E=E6=80=81=E4=B8=8E=E5=8A=A0=E8=BD=BD=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E9=94=99=E8=AF=AF=E6=80=81=E7=BC=BA=E5=A4=B1=20(#125)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入 useRef 请求计数器,消除 React 18 StrictMode 双请求引起的状态竞态 - 新增 loadError 状态,加载失败时展示带重试按钮的错误态 - 避免网络错误时误导性地显示「暂无可配置的提示词模板」 Co-authored-by: sikongyue <3155157671@qq.com> --- .../settings/prompt-preferences-pane.tsx | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/web/src/pages/settings/prompt-preferences-pane.tsx b/web/src/pages/settings/prompt-preferences-pane.tsx index ed0fc43b3..11d5077b4 100644 --- a/web/src/pages/settings/prompt-preferences-pane.tsx +++ b/web/src/pages/settings/prompt-preferences-pane.tsx @@ -1,6 +1,6 @@ import { Alert, App, Button, Input, Segmented, Select, Skeleton, Tabs, Tag } from "antd"; import { RotateCcw, Save, ShieldCheck, Undo2 } from "lucide-react"; -import { useEffect, useMemo, useState } from "react"; +import { useEffect, useMemo, useRef, useState } from "react"; import { PromptCodeEditor } from "@/components/prompt/prompt-code-editor"; import { @@ -28,17 +28,27 @@ export function PromptPreferencesPane() { const [rewriteContent, setRewriteContent] = useState(""); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); + const [loadError, setLoadError] = useState(""); + const requestIdRef = useRef(0); const reload = async (preferredOperation?: string) => { + const reqId = ++requestIdRef.current; setLoading(true); + setLoadError(""); try { const result = await listUserPromptPreferences(); + if (reqId !== requestIdRef.current) return; setPreferences(result.preferences); setSelectedOperation((current) => preferredOperation || current || result.preferences[0]?.definition.operation || ""); } catch (error) { - message.error(error instanceof Error ? error.message : "读取提示词偏好失败"); + if (reqId !== requestIdRef.current) return; + const msg = error instanceof Error ? error.message : "读取提示词偏好失败"; + setLoadError(msg); + message.error(msg); } finally { - setLoading(false); + if (reqId === requestIdRef.current) { + setLoading(false); + } } }; @@ -123,6 +133,14 @@ export function PromptPreferencesPane() { }; if (loading && preferences.length === 0) return ; + if (loadError && preferences.length === 0) { + return ( +
+ + +
+ ); + } if (!selected) return
暂无可配置的提示词模板
; const templateContent = selected.template?.content || "当前没有启用的平台模板";