From 4ac8522dab1218747093b56b36a3be2780d388dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E5=9B=BD=E9=94=8B?= <18508478357@163.com> Date: Mon, 2 Feb 2026 17:53:54 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(sidebar):=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=96=AD=E5=BC=80=E8=BF=9E=E6=8E=A5=E5=90=8E=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E9=87=8D=E8=BF=9E=E5=8F=8A=E7=8A=B6=E6=80=81=E6=AE=8B?= =?UTF-8?q?=E7=95=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 递归清除断开连接/关闭数据库时所有子节点的 loadedKeys 和 connectionStates - 解决 Ant Design Tree 因状态残留导致不再触发 loadData 的问题 - DataGrid: 优化 ResizeObserver 逻辑,引入 requestAnimationFrame 解决标签页切换高度塌陷 - DataGrid: 为每个表格实例生成唯一 ID 以隔离 CSS 样式冲突 - CSS: 强制禁止侧边栏文字选中,优化右键菜单触发区域 --- frontend/src/components/DataGrid.tsx | 36 +++++++++++++++++--------- frontend/src/components/DataViewer.tsx | 2 ++ frontend/src/components/Sidebar.tsx | 18 +++++++++---- internal/app/methods_db.go | 25 +----------------- 4 files changed, 40 insertions(+), 41 deletions(-) diff --git a/frontend/src/components/DataGrid.tsx b/frontend/src/components/DataGrid.tsx index 80d9433..49458a5 100644 --- a/frontend/src/components/DataGrid.tsx +++ b/frontend/src/components/DataGrid.tsx @@ -5,6 +5,7 @@ import { ReloadOutlined, ImportOutlined, ExportOutlined, DownOutlined, PlusOutli import { Resizable } from 'react-resizable'; import { ImportData, ExportTable, ExportData, ApplyChanges } from '../../wailsjs/go/app/App'; import { useStore } from '../store'; +import { v4 as uuidv4 } from 'uuid'; import 'react-resizable/css/styles.css'; // --- Helper: Format Value --- @@ -214,6 +215,7 @@ const DataGrid: React.FC = ({ const addSqlLog = useStore(state => state.addSqlLog); const [form] = Form.useForm(); const [modal, contextHolder] = Modal.useModal(); + const gridId = useMemo(() => `grid-${uuidv4()}`, []); // Helper to export specific data const exportData = async (rows: any[], format: string) => { @@ -234,16 +236,26 @@ const DataGrid: React.FC = ({ useEffect(() => { if (!containerRef.current) return; + + let rafId: number; const resizeObserver = new ResizeObserver(entries => { - for (let entry of entries) { - // Subtract header height (~40px) - // Ensure minimum height to prevent collapse loop - const h = Math.max(100, entry.contentRect.height - 42); - setTableHeight(h); - } + rafId = requestAnimationFrame(() => { + for (let entry of entries) { + // Use boundingClientRect for more accurate render size (including padding if any) + const height = entry.contentRect.height; + if (height < 50) return; + // Subtract header (~42px) and a buffer + const h = Math.max(100, height - 42); + setTableHeight(h); + } + }); }); + resizeObserver.observe(containerRef.current); - return () => resizeObserver.disconnect(); + return () => { + resizeObserver.disconnect(); + cancelAnimationFrame(rafId); + }; }, []); const [selectedRowKeys, setSelectedRowKeys] = useState([]); @@ -685,7 +697,7 @@ const DataGrid: React.FC = ({ const totalWidth = columns.reduce((sum, col) => sum + (col.width as number || 200), 0); return ( -
+
{/* Toolbar */}
{onReload &&
)} -
+
{contextHolder}
@@ -794,9 +806,9 @@ const DataGrid: React.FC = ({ )}