From 8f0876924f2b376d766202a2bea2ccb55369b0fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E6=B0=B8=E5=B9=B3?= Date: Sat, 5 Jul 2025 16:50:34 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E8=AE=BE=E5=A4=87=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E6=9E=84=E5=BB=BA=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nkebao/src/pages/devices/DeviceDetail.tsx | 42 +++++++++++++++++------ 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/nkebao/src/pages/devices/DeviceDetail.tsx b/nkebao/src/pages/devices/DeviceDetail.tsx index 805599ff..257c50f8 100644 --- a/nkebao/src/pages/devices/DeviceDetail.tsx +++ b/nkebao/src/pages/devices/DeviceDetail.tsx @@ -163,7 +163,8 @@ export default function DeviceDetail() { }; fetchDevice(); - }, [id, toast]); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [id]); // 获取设备关联微信账号 const fetchRelatedAccounts = async (page = 1) => { @@ -315,10 +316,19 @@ export default function DeviceDetail() { }, 100); }; - // 功能开关处理 + // 功能开关处理 - 只更新开关状态,不重新加载页面 const handleFeatureChange = async (feature: keyof Device['features'], checked: boolean) => { if (!id) return; + // 立即更新UI状态,提供即时反馈 + setDevice(prev => prev ? { + ...prev, + features: { + ...prev.features, + [feature]: checked + } + } : null); + setSavingFeatures(prev => ({ ...prev, [feature]: true })); try { @@ -328,19 +338,21 @@ export default function DeviceDetail() { }); if (response && response.code === 200) { - setDevice(prev => prev ? { - ...prev, - features: { - ...prev.features, - [feature]: checked - } - } : null); - + // 请求成功,显示成功提示 toast({ title: "设置成功", description: `${getFeatureName(feature)}已${checked ? '启用' : '禁用'}`, }); } else { + // 请求失败,回滚UI状态 + setDevice(prev => prev ? { + ...prev, + features: { + ...prev.features, + [feature]: !checked + } + } : null); + toast({ title: "设置失败", description: response.message || "请稍后重试", @@ -349,6 +361,16 @@ export default function DeviceDetail() { } } catch (error) { console.error("设置功能失败:", error); + + // 网络错误,回滚UI状态 + setDevice(prev => prev ? { + ...prev, + features: { + ...prev.features, + [feature]: !checked + } + } : null); + toast({ title: "设置失败", description: "请稍后重试",