From 3191ca9d89348a4fa349fa243465ee9e6c247ade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Thu, 24 Sep 2026 17:26:17 +0800 Subject: [PATCH] =?UTF-8?q?3D=20=E9=9D=A2=E6=9D=BF=E7=9A=84=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E4=BB=A3=E6=AC=A1=E6=94=B9=E5=9C=A8=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E6=97=B6=E9=93=B8=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - src/components/image-editor/model3d-generation/Model3dGenerationModal.tsx:失败态下的代次刷新由渲染体里的常量改为点击时调用的 resolveSubmitDialog(),提交键不再随每次重渲染(含 StrictMode 双渲染)变化,渲染保持纯函数 --- .../model3d-generation/Model3dGenerationModal.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/image-editor/model3d-generation/Model3dGenerationModal.tsx b/src/components/image-editor/model3d-generation/Model3dGenerationModal.tsx index e3cb7f0b2..9ada94bc4 100644 --- a/src/components/image-editor/model3d-generation/Model3dGenerationModal.tsx +++ b/src/components/image-editor/model3d-generation/Model3dGenerationModal.tsx @@ -80,7 +80,9 @@ export function Model3dGenerationModal({ // 幂等键 = 代次 + 请求内容指纹,同键同请求只会拿回原来那个终态 operation。 // 所以失败态下的任何提交(主按钮或「重试」)都要开新一代,否则点下去只是重现同一次失败; // 参数一改本来就会换代号次,这里补的是「不改参数直接再点一次」这条路。 - const submitDialog = + // 代次只在点击那一刻铸:写在渲染体里会让每次重渲染(含 StrictMode 双渲染)都换一个随机值, + // 渲染结果不确定,也和「这一次点击」对不上。 + const resolveSubmitDialog = () => dialog.status === 'failed' ? refreshModel3dAttemptNonce(dialog) : dialog; // 每次都新建数组会让上面的 dismiss effect 每次渲染都重挂监听;ref 对象本身是稳定的。 @@ -131,7 +133,7 @@ export function Model3dGenerationModal({ className="image-canvas-editor__generation-submit" disabled={!canSubmit} aria-label={MODEL3D_GENERATION_SUBMIT_LABEL} - onClick={() => onSubmit(submitDialog)} + onClick={() => onSubmit(resolveSubmitDialog())} > {isGenerating ? ( '生成中' @@ -152,7 +154,7 @@ export function Model3dGenerationModal({ size="xs" shape="pill" aria-label="重试生成 3D 模型" - onClick={() => onSubmit(submitDialog)} + onClick={() => onSubmit(resolveSubmitDialog())} > 重试