From e2133165b0cd89d81d0d75908571f06c70325c24 Mon Sep 17 00:00:00 2001 From: zwt13703 Date: Mon, 6 Jul 2026 18:41:12 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=BC=96=E8=BE=91=E5=9B=9E=E6=98=BE?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20-=20setFieldsValue=20=E6=94=B9=E4=B8=BA=20?= =?UTF-8?q?useEffect=20=E5=9C=A8=20Modal=20=E6=89=93=E5=BC=80=E5=90=8E?= =?UTF-8?q?=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - destroyOnClose 导致 Form 在 Modal 关闭时销毁,setFieldsValue 提前调用无效 - 改为 useEffect 监听 modalOpen,Modal 打开后延迟设置表单值 --- web/src/pages/ModelList.tsx | 23 +++++++++++++++-------- web/src/pages/TemplateEditor.tsx | 31 +++++++++++++++++++------------ 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/web/src/pages/ModelList.tsx b/web/src/pages/ModelList.tsx index 14de364..b6f02d3 100644 --- a/web/src/pages/ModelList.tsx +++ b/web/src/pages/ModelList.tsx @@ -1,7 +1,7 @@ import { useEffect, useState, useCallback } from "react"; import { Table, Button, Modal, Form, Input, Select, Switch, - Space, message, Popconfirm, Tag, Tooltip, + Space, message, Popconfirm, Tag, } from "antd"; import { PlusOutlined, EditOutlined, DeleteOutlined } from "@ant-design/icons"; import type { AIModel } from "../types"; @@ -38,21 +38,28 @@ export default function ModelList() { const handleCreate = () => { setEditingModel(null); - form.resetFields(); - form.setFieldsValue({ provider: "openai", is_enabled: true, extra_params: "{}" }); setModalOpen(true); }; const handleEdit = (model: AIModel) => { setEditingModel(model); - form.setFieldsValue({ - ...model, - extra_params: JSON.stringify(model.extra_params, null, 2), - api_key: "", - }); setModalOpen(true); }; + useEffect(() => { + if (!modalOpen) return; + if (editingModel) { + form.setFieldsValue({ + ...editingModel, + extra_params: JSON.stringify(editingModel.extra_params, null, 2), + api_key: "", + }); + } else { + form.resetFields(); + form.setFieldsValue({ provider: "openai", is_enabled: true, extra_params: "{}" }); + } + }, [modalOpen, editingModel]); + const handleSubmit = async () => { try { const values = await form.validateFields(); diff --git a/web/src/pages/TemplateEditor.tsx b/web/src/pages/TemplateEditor.tsx index ffc3744..7c2e10f 100644 --- a/web/src/pages/TemplateEditor.tsx +++ b/web/src/pages/TemplateEditor.tsx @@ -114,26 +114,33 @@ export default function TemplateEditor() { const handleCreatePoint = () => { setEditingPoint(null); - pointForm.resetFields(); - if (selectionRef.current) { - pointForm.setFieldsValue({ - prompt: `根据上下文生成关于「${selectionRef.current.text.slice(0, 20)}...」的内容`, - }); - } setPointModalOpen(true); }; const handleEditPoint = (point: GenerationPoint) => { setEditingPoint(point); - pointForm.setFieldsValue({ - prompt: point.prompt, - model_id: point.model_id, - need_ref_file: point.need_ref_file, - remark: point.remark, - }); setPointModalOpen(true); }; + useEffect(() => { + if (!pointModalOpen) return; + if (editingPoint) { + pointForm.setFieldsValue({ + prompt: editingPoint.prompt, + model_id: editingPoint.model_id, + need_ref_file: editingPoint.need_ref_file, + remark: editingPoint.remark, + }); + } else { + pointForm.resetFields(); + if (selectionRef.current) { + pointForm.setFieldsValue({ + prompt: `根据上下文生成关于「${selectionRef.current.text.slice(0, 20)}...」的内容`, + }); + } + } + }, [pointModalOpen]); + const handlePointSubmit = async () => { if (!id) return; try {