状态管理层用于集中管理应用的状态,让多个组件共享和同步数据。
假设没有状态管理,组件之间需要这样传递数据:
组件A (首页)
↓ props 传递
组件B (侧边栏)
↓ emit 事件
组件C (聊天容器)
↓ props 传递
组件D (输入框)
问题:
┌─────────────────────────────────┐
│ 状态管理层 (Pinia Store) │
│ ┌───────────────────────────┐ │
│ │ taskStore │ │
│ │ - currentTask │ │
│ │ - setTask() │ │
│ └───────────────────────────┘ │
│ ┌───────────────────────────┐ │
│ │ memoryStore │ │
│ │ - selectMemoryId │ │
│ └───────────────────────────┘ │
└─────────────────────────────────┘
↑ ↑ ↑
│ │ │
组件A 组件B 组件C
所有组件直接访问同一个状态源,无需层层传递。
用途:管理当前执行的任务状态
``28:50:ui-vue3/src/stores/task.ts
export const useTaskStore = defineStore('task', () => {
const currentTask = ref<TaskPayload | null>(null)
const taskToInput = ref<string>('')
const hasVisitedHome = ref(false)
// Set new task
const setTask = (prompt: string) => {
console.log('[TaskStore] setTask called with prompt:', prompt)
// Don't create tasks with empty prompts
if (!prompt.trim()) {
console.warn('[TaskStore] Empty prompt provided, not creating task')
return
}
const newTask = {
prompt,
timestamp: Date.now(),
processed: false,
}
currentTask.value = newTask
console.log('[TaskStore] Task set, currentTask.value:', currentTask.value)
}
``
20:32:ui-vue3/src/stores/namespace.ts
export const usenameSpaceStore = defineStore('namespace', () => {
const namespace = ref<string>('default')
function setCurrentNs(value: string) {
namespace.value = value
}
const namespaces = ref<Array<{ name: string; id: string; host?: string }>>([])
function setNamespaces(datasource: Array<{ name: string; id: string }>) {
namespaces.value = datasource
}
return { namespace, namespaces, setCurrentNs, setNamespaces }
})
使用场景:
- 首页设置任务 → 直接执行页面接收并执行
- 侧边栏生成计划 → 任务状态更新
- 多个组件需要知道当前是否有运行中的任务
#### 2. 命名空间管理(Namespace Store)
用途:管理当前选中的命名空间
29:52:ui-vue3/src/stores/memory.ts
export class MemoryStore {
// Basic state
isCollapsed = false
selectMemoryId = ''
loadMessages = () => {}
intervalId: number | undefined = undefined
toggleSidebar() {
this.isCollapsed = !this.isCollapsed
if (this.isCollapsed) {
this.loadMessages()
this.intervalId = window.setInterval(() => {
this.loadMessages()
}, 3000)
} else {
clearInterval(this.intervalId)
}
}
selectMemory(memoryId: string) {
this.toggleSidebar()
this.selectMemoryId = memoryId
}
使用场景:
- 配置页面切换命名空间 → 所有页面自动更新
- API 调用需要知道当前命名空间
- 多个组件需要显示当前命名空间
#### 3. 记忆管理(Memory Store)
用途:管理对话记忆状态
typescript
// 所有任务相关的状态都在这里
const taskStore = useTaskStore()
// 任何组件都可以访问
taskStore.currentTask // 当前任务
taskStore.setTask() // 设置任务
taskStore.hasRunningTask() // 检查是否有运行中的任务
使用场景:
- 记忆侧边栏的展开/折叠状态
- 当前选中的记忆 ID
- 自动刷新消息的定时器
### 三、状态管理的核心功能
#### 1. 集中存储(Centralized Storage)
所有状态集中在一个地方,便于管理:
typescript
// 组件A:设置任务
taskStore.setTask('分析日志')
// 组件B:自动接收到更新(无需手动刷新)
watch(() => taskStore.currentTask, (newTask) => {
console.log('任务已更新:', newTask)
})
#### 2. 响应式更新(Reactive Updates)
状态改变时,所有使用该状态的组件自动更新:
typescript
// 首页组件
const taskStore = useTaskStore()
taskStore.setTask('新任务')
// 直接执行页面组件(自动接收)
watch(() => taskStore.currentTask, (task) => {
if (task && !task.processed) {
// 自动执行任务
executeTask(task.prompt)
}
})
#### 3. 跨组件通信(Cross-Component Communication)
不同组件之间可以轻松共享状态:
95:100:ui-vue3/src/stores/task.ts
// Set that home page has been visited
const markHomeVisited = () => {
hasVisitedHome.value = true
// Save to localStorage
localStorage.setItem('hasVisitedHome', 'true')
}
#### 4. 状态持久化(State Persistence)
可以结合 localStorage 实现状态持久化:
typescript
// 1. 首页组件 (home/index.vue)
const taskStore = useTaskStore()
function handleSend() {
// 设置任务到 store
taskStore.setTask('分析系统日志')
// 跳转到直接执行页面
router.push('/direct')
}
// 2. 直接执行页面 (direct/index.vue)
const taskStore = useTaskStore()
// 监听任务变化
watch(
() => taskStore.currentTask,
(newTask) => {
if (newTask && !newTask.processed && newTask.prompt.trim()) {
// 自动执行任务
executeTask(newTask.prompt)
// 标记为已处理
taskStore.markTaskAsProcessed()
}
}
)
### 四、实际使用示例
#### 场景:从首页跳转到直接执行页面并执行任务
优势:
| 方案 | 适用场景 | 缺点 |
|---|---|---|
| Props/Events | 父子组件通信 | 深层传递困难 |
| Event Bus | 简单事件通信 | 难以追踪,容易混乱 |
| 状态管理 (Pinia) | 复杂应用,多组件共享状态 | 需要学习成本 |
| localStorage | 持久化数据 | 不是响应式的 |
状态管理层的作用: