# UI组件体系 **Referenced Files in This Document ** - [DesktopContainer.vue](file://src/ui/desktop-container/DesktopContainer.vue) - [AppIcon.vue](file://src/ui/desktop-container/AppIcon.vue) - [IDesktopAppIcon.ts](file://src/ui/types/IDesktopAppIcon.ts) - [IGridTemplateParams.ts](file://src/ui/types/IGridTemplateParams.ts) - [App.vue](file://src/ui/App.vue) - [useDesktopContainerInit.ts](file://src/ui/desktop-container/useDesktopContainerInit.ts) ## 目录 1. [简介](#简介) 2. [核心数据模型](#核心数据模型) 3. [主容器布局机制](#主容器布局机制) 4. [可拖拽图标实现](#可拖拽图标实现) 5. [组件层级与数据流](#组件层级与数据流) 6. [模板使用示例](#模板使用示例) 7. [自定义扩展建议](#自定义扩展建议) ## 简介 本文档深入解析Vue桌面应用的UI组件结构与交互逻辑。重点阐述`DesktopContainer.vue`作为主容器的动态网格布局机制,以及`AppIcon.vue`如何实现可拖拽的应用图标功能。通过分析`IDesktopAppIcon`和`IGridTemplateParams`接口定义,说明图标数据模型和网格参数的设计原理。同时解释从根组件`App.vue`到子组件`DesktopContainer`再到`AppIcon`的父子关系及数据传递方式,并提供实际使用示例与扩展建议。 ## 核心数据模型 ### 桌面应用图标接口 (IDesktopAppIcon) 该接口定义了桌面图标的元数据结构,包含名称、图标资源路径、启动路径及其在网格中的位置坐标。 ```typescript export interface IDesktopAppIcon { name: string; icon: string; path: string; x: number; y: number; } ``` **字段说明:** - `name`: 图标显示名称 - `icon`: 图标资源路径 - `path`: 应用启动路径 - `x`: 在网格布局中的列索引(从1开始) - `y`: 在网格布局中的行索引(从1开始) 此接口用于统一管理所有桌面图标的配置信息,并支持持久化存储至`localStorage`。 ### 网格模板参数接口 (IGridTemplateParams) 该接口定义了网格布局的核心计算参数,支持响应式调整。 ```typescript export interface IGridTemplateParams { readonly cellExpectWidth: number readonly cellExpectHeight: number cellRealWidth: number cellRealHeight: number gapX: number gapY: number colCount: number rowCount: number } ``` **字段说明:** - `cellExpectWidth/Height`: 单元格预设宽高 - `cellRealWidth/Height`: 实际渲染时的单元格宽高 - `gapX/Y`: 列/行间距 - `colCount/rowCount`: 当前容器可容纳的总行列数 这些参数由`ResizeObserver`监听容器尺寸变化后动态计算得出,确保布局自适应。 **Section sources** - [IDesktopAppIcon.ts](file://src/ui/types/IDesktopAppIcon.ts#L3-L14) - [IGridTemplateParams.ts](file://src/ui/types/IGridTemplateParams.ts#L3-L20) ## 主容器布局机制 `DesktopContainer.vue`组件负责构建整个桌面的网格布局系统。其核心是通过组合式API `useDesktopContainerInit` 初始化并维护网格状态。 ### 响应式网格生成 组件利用CSS Grid布局特性,通过计算属性`gridStyle`动态生成`grid-template-columns`和`grid-template-rows`样式规则: ```css gridTemplateColumns: `repeat(${gridTemplate.colCount}, minmax(${gridTemplate.cellExpectWidth}px, 1fr))` ``` ### 容器尺寸监听 使用`ResizeObserver` API实时监听`.desktop-icons-container`容器的尺寸变化,重新计算: - 可容纳的行列数量 (`colCount`, `rowCount`) - 单元格实际尺寸 (`cellRealWidth`, `cellRealHeight`) ### 图标初始化与持久化 首次加载时从`localStorage`读取历史图标位置信息,结合应用列表进行映射初始化。当图标位置变更时自动同步回本地存储。 ### 超出边界处理 当窗口缩放导致图标超出可视区域时,`rearrangeIcons`函数会智能重排图标: - 优先放置于原始位置 - 若冲突则寻找最近空位 - 实在无法容纳则暂存于`exceedApp`数组 ```mermaid flowchart TD Start([组件挂载]) --> Observe["创建ResizeObserver"] Observe --> InitGrid["初始化网格参数"] InitGrid --> LoadStorage["从localStorage加载图标位置"] LoadStorage --> MapIcons["映射应用信息与图标"] MapIcons --> Render["渲染AppIcon组件"] Resize["容器尺寸变化"] --> Recalculate["重新计算行列数"] Recalculate --> Rearrange["调用rearrangeIcons重排"] Rearrange --> UpdateState["更新appIconsRef状态"] UpdateState --> SyncStorage["同步至localStorage"] ``` **Diagram sources ** - [DesktopContainer.vue](file://src/ui/desktop-container/DesktopContainer.vue#L1-L23) - [useDesktopContainerInit.ts](file://src/ui/desktop-container/useDesktopContainerInit.ts#L14-L94) **Section sources** - [DesktopContainer.vue](file://src/ui/desktop-container/DesktopContainer.vue#L1-L23) - [useDesktopContainerInit.ts](file://src/ui/desktop-container/useDesktopContainerInit.ts#L14-L94) ## 可拖拽图标实现 `AppIcon.vue`组件实现了完整的拖拽交互逻辑,允许用户自由调整图标位置。 ### 拖拽事件绑定 在模板中为图标容器启用原生HTML5拖拽API: ```html