From e18286c70e63b7e38f5a84e7569079eec0c67aca Mon Sep 17 00:00:00 2001 From: icarus Date: Fri, 1 Aug 2025 18:36:33 +0800 Subject: [PATCH] =?UTF-8?q?refactor(ModelList):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=A8=A1=E5=9E=8B=E5=88=97=E8=A1=A8=E7=9A=84=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E5=92=8C=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用startTransition优化折叠/展开性能 - 重构数据结构,将单个模型渲染改为批量渲染 - 改进组头和模型项的样式和布局 --- .../components/ModelList/ManageModelsList.tsx | 153 +++++++++++------- 1 file changed, 95 insertions(+), 58 deletions(-) diff --git a/src/renderer/src/components/ModelList/ManageModelsList.tsx b/src/renderer/src/components/ModelList/ManageModelsList.tsx index 1100f6575b..01daf6230f 100644 --- a/src/renderer/src/components/ModelList/ManageModelsList.tsx +++ b/src/renderer/src/components/ModelList/ManageModelsList.tsx @@ -10,7 +10,7 @@ import { Model, Provider } from '@renderer/types' import { Button, Flex, Tooltip } from 'antd' import { Avatar } from 'antd' import { ChevronRight } from 'lucide-react' -import React, { memo, useCallback, useMemo, useState } from 'react' +import React, { memo, startTransition, useCallback, useMemo, useState } from 'react' import { useTranslation } from 'react-i18next' import styled from 'styled-components' @@ -23,12 +23,12 @@ interface GroupRowData { models: Model[] } -interface ModelRowData { - type: 'model' - model: Model +interface ModelsRowData { + type: 'models' + models: Model[] } -type RowData = GroupRowData | ModelRowData +type RowData = GroupRowData | ModelsRowData interface ManageModelsListProps { modelGroups: Record @@ -42,14 +42,16 @@ const ManageModelsList: React.FC = ({ modelGroups, provid const [collapsedGroups, setCollapsedGroups] = useState(new Set()) const handleGroupToggle = useCallback((groupName: string) => { - setCollapsedGroups((prev) => { - const newSet = new Set(prev) - if (newSet.has(groupName)) { - newSet.delete(groupName) // 如果已折叠,则展开 - } else { - newSet.add(groupName) // 如果已展开,则折叠 - } - return newSet + startTransition(() => { + setCollapsedGroups((prev) => { + const newSet = new Set(prev) + if (newSet.has(groupName)) { + newSet.delete(groupName) // 如果已折叠,则展开 + } else { + newSet.add(groupName) // 如果已展开,则折叠 + } + return newSet + }) }) }, []) @@ -62,9 +64,7 @@ const ManageModelsList: React.FC = ({ modelGroups, provid // 只添加非空组 rows.push({ type: 'group', groupName, models }) if (!collapsedGroups.has(groupName)) { - models.forEach((model) => { - rows.push({ type: 'model', model }) - }) + rows.push({ type: 'models', models }) } } }) @@ -132,37 +132,44 @@ const ManageModelsList: React.FC = ({ modelGroups, provid overscan={5} scrollerStyle={{ paddingRight: '10px' - }} - itemContainerStyle={{ - paddingBottom: '8px' }}> {(row) => { if (row.type === 'group') { const isCollapsed = collapsedGroups.has(row.groupName) return ( - handleGroupToggle(row.groupName)}> - - + handleGroupToggle(row.groupName)}> + + + {row.groupName} + + {row.models.length} + + + {renderGroupTools(row.models)} + + + ) + } else { + return ( + + {row.models.map((model) => ( + - {row.groupName} - - {row.models.length} - - - {renderGroupTools(row.models)} - + ))} + ) } - - return ( - - ) }} ) @@ -180,35 +187,65 @@ const ModelListItem: React.FC = memo(({ model, provider, onA const isAdded = useMemo(() => isModelInProvider(provider, model.id), [provider, model.id]) return ( - {model?.name?.[0]?.toUpperCase()}, - name: , - extra: model.description && , - ext: '.model', - actions: isAdded ? ( -