本文档介绍了如何在 Screenshot-to-Code 应用程序中使用 Zustand stores 来管理状态。该应用程序采用结构化的方法进行状态管理,将不同的关注点分离到处理应用程序不同状态方面的不同 stores 中。有关跟踪已生成代码更改的版本历史记录系统的信息,请参阅历史和版本控制。有关选择和编辑系统的详细信息,请参阅选择和编辑系统。
Screenshot-to-Code 应用程序使用轻量级状态管理库 Zustand 来管理其状态。状态被划分为两个主要 stores:
useAppStore) - 管理应用程序范围的状态,例如当前应用程序状态、更新说明和选择/编辑模式。useProjectStore) - 管理项目特定的状态,包括参考图像、提交历史、代码变体和执行控制台。来源:frontend/src/store/app-store.ts1-31 frontend/src/store/project-store.ts1-149 frontend/src/App.tsx17-18
App Store(useAppStore)管理影响应用程序整体行为和外观的应用程序范围内的状态。
| 属性 | 类型 | 描述 |
|---|---|---|
appState | AppState 枚举 | 应用程序的当前状态(INITIAL、CODING、CODE_READY) |
updateInstruction | 字符串 | 用于更新已生成代码的当前说明 |
inSelectAndEditMode | 布尔值 | 是否启用了选择和编辑模式 |
| 方法 | 描述 |
|---|---|
setAppState | 更新应用程序的当前状态 |
setUpdateInstruction | 设置更新说明文本 |
toggleInSelectAndEditMode | 切换选择和编辑模式 |
disableInSelectAndEditMode | 禁用选择和编辑模式 |
来源:frontend/src/store/app-store.ts1-31 frontend/src/types.ts22-26
Project Store(useProjectStore)管理项目特定的状态,包括代码生成和历史记录。
| 属性 | 类型 | 描述 |
|---|---|---|
inputMode | "image" | "video" | 当前的输入模式 |
isImportedFromCode | 布尔值 | 项目是否从代码导入 |
referenceImages | string[] | 参考图片 URL 数组 |
commits | Record<string, Commit> | 提交哈希到提交对象的映射 |
head | CommitHash | null | 当前提交的哈希 |
executionConsoles | { [key: number]: string[] } | 每个变体的控制台输出 |
| 方法 | 描述 |
|---|---|
addCommit | 将新提交添加到 store |
removeCommit | 从 store 中移除提交 |
appendCommitCode | 将代码附加到特定提交的特定变体 |
setCommitCode | 设置特定提交的特定变体的代码 |
updateSelectedVariantIndex | 更新提交的选定变体索引 |
setHead | 设置当前提交哈希 |
appendExecutionConsole | 向执行控制台添加一行 |
来源:frontend/src/store/project-store.ts1-149 frontend/src/components/commits/types.ts1-37
以下图表说明了状态如何在应用程序的 stores 和组件之间流动。
来源:frontend/src/App.tsx17-57 frontend/src/components/sidebar/Sidebar.tsx1-34 frontend/src/components/variants/Variants.tsx1-5 frontend/src/components/preview/PreviewPane.tsx12-26
应用程序通过其不同状态遵循特定的状态转换流程。
来源:frontend/src/types.ts22-26 frontend/src/App.tsx170-228 frontend/src/components/sidebar/Sidebar.tsx1-34 frontend/src/components/variants/Variants.tsx1-5 frontend/src/components/preview/PreviewPane.tsx12-26
该应用程序使用类似 git 的提交系统来跟踪已生成代码的更改。每次代码生成或更新都会创建一个新的提交。
| 提交类型 | 描述 |
|---|---|
ai_create | 从屏幕截图生成初始代码 |
ai_edit | 根据用户说明更新代码 |
code_create | 用户导入的代码 |
来源:frontend/src/components/commits/types.ts1-37 frontend/src/components/commits/utils.ts1-32
以下图表说明了代码生成过程中状态的管理方式。
来源:frontend/src/App.tsx169-228 frontend/src/App.tsx231-296
应用程序中的不同组件以特定方式消耗来自 stores 的状态。
App 组件是协调整个应用程序的主要组件。它
useAppStore 和 useProjectStore 消耗状态appState 渲染不同的 UI来源:frontend/src/App.tsx27-57 frontend/src/App.tsx338-394
Sidebar 组件根据应用程序状态显示各种控件和信息。
CODING 状态下:显示加载器、执行控制台和代码预览。CODE_READY 状态下:显示更新说明输入框、更新按钮、重新生成按钮和选择/编辑切换器。来源:frontend/src/components/sidebar/Sidebar.tsx23-175
Variants 组件允许用户在不同的已生成代码变体之间进行选择。
useProjectStore 消耗当前的提交和变体来源:frontend/src/components/variants/Variants.tsx1-42
PreviewPane 组件以不同格式显示已生成的代码。
useProjectStore 消耗当前代码来源:frontend/src/components/preview/PreviewPane.tsx12-97
Screenshot-to-Code 中的状态管理系统实现了关注点清晰分离,App Store 负责处理应用全局状态,Project Store 负责管理项目特定状态。这种组织方式使得跟踪生成代码的变化、管理变体以及在代码生成和更新过程中提供流畅的用户体验变得更加容易。