当前位置: 首页 > news >正文

《60天AI学习计划启动 | Day 38: 多会话 多 Tab 同步(前端层)》

Day 38:多会话 & 多 Tab 同步(前端层)

学习目标

  • 设计 多会话模型:当前会话 + 会话列表(标题/摘要/时间)
  • 掌握 利用 localStorage + storage 事件 做多 Tab 状态同步
  • 实现 简单的会话新建 / 重命名 / 归档逻辑

核心知识点

  • 多会话数据模型

    • Session{ id, title, updatedAt, archived }
    • SessionMessagesRecord<sessionId, Message[]>
    • Store 里需要:currentSessionId + sessions[] + messagesBySession
  • 多 Tab 同步

    • 写入:每次会话/消息变化 → localStorage.setItem('ai_sessions', JSON.stringify(...))
    • 监听:window.addEventListener('storage', handler),对同一域其他 Tab 生效
    • 注意:当前 Tab 改变时也会写 localStorage,但 storage 事件不会在当前 Tab 触发

实战作业(附代码)

  • 作业 1:多会话 TS 类型
export interface Session {id: stringtitle: stringupdatedAt: numberarchived?: boolean
}export interface Message {id: stringrole: 'user' | 'assistant'content: stringcreatedAt: number
}export interface SessionState {sessions: Session[]currentSessionId: string | nullmessagesBySession: Record<string, Message[]>
}
  • 作业 2:多 Tab 同步 hook(简化版)
import { useEffect } from 'react'
import type { SessionState } from './types'const STORAGE_KEY = 'ai_chat_sessions'export function saveStateToStorage(state: SessionState) {localStorage.setItem(STORAGE_KEY, JSON.stringify(state))
}export function loadStateFromStorage(): SessionState | null {const raw = localStorage.getItem(STORAGE_KEY)if (!raw) return nulltry {return JSON.parse(raw)} catch {return null}
}export function useMultiTabSync(state: SessionState,setState: (s: SessionState) => void
) {// 初始化:加载本地数据useEffect(() => {const stored = loadStateFromStorage()if (stored) setState(stored)}, [setState])// 本 Tab 变化时写入 localStorage(可加节流)useEffect(() => {saveStateToStorage(state)}, [state])// 监听其他 Tab 的变更useEffect(() => {const handler = (e: StorageEvent) => {if (e.key !== STORAGE_KEY || !e.newValue) returntry {const next = JSON.parse(e.newValue) as SessionStatesetState(next)} catch {}}window.addEventListener('storage', handler)return () => window.removeEventListener('storage', handler)}, [setState])
}
  • 作业 3:新建 / 重命名 / 归档会话 helpers
export function createSession(title = '新对话'): Session {return { id: crypto.randomUUID(), title, updatedAt: Date.now() }
}export function renameSession(s: Session, title: string): Session {return { ...s, title, updatedAt: Date.now() }
}export function archiveSession(s: Session): Session {return { ...s, archived: true, updatedAt: Date.now() }
}

明日学习计划预告(Day 39)

  • 主题:Agent 执行过程可视化
  • 方向
    • 展示 Agent 的「思考 → 工具调用 → 观察 → 最终回答」步骤
    • 设计一个简单的“执行轨迹”时间线组件
http://www.zskr.cn/news/114982.html

相关文章:

  • 传统网页存档vs互联网档案馆:效率对比分析
  • 企业级Python环境部署实战 - 官方源的正确使用
  • Promise.js在电商网站支付流程中的实战应用
  • 2025年年终伺服压机推荐:从技术参数到服务生态的全方位横评,附5款高适配性型号清单 - 品牌推荐
  • torch.where vs numpy.where:性能对比全解析
  • 效率翻倍:一键切换工作/娱乐分辨率方案
  • 2025年无人机探测设备制造企业权威推荐榜单:无人机反制模块/无人机侦测反制设备/无人机管制设备源头厂家精选 - 品牌推荐官
  • 1小时搞定:用await快速开发天气查询CLI工具
  • LobeChat节日营销专题页内容策划
  • 2025年沥青搅拌设备源头厂家权威推荐榜单:沥青搅拌站/温拌泡沫沥青设备/沥青混凝土搅拌站源头厂家精选 - 品牌推荐官
  • 低成本打造专属声优!EmotiVoice声音克隆实测分享
  • 2025年12月电线/防火/控制电缆厂家推荐指南:五家企业实力铸就品质之选 - 深度智识库
  • 2025年高精度大理石量具品牌推荐:大理石量具角尺靠谱厂商有 - mypinpai
  • 50、Perl函数详解:MRO、多调用、数值及兼容性函数
  • 企业级Maven项目部署问题实战解析
  • GB/T 40363-2021 硬质聚氨酯泡沫塑料检测
  • 解决mapper.xml中SQL语句不提示的问题
  • 打破语音合成单调性:EmotiVoice带来情绪多样性
  • 效率对比:传统排查vsAI解决Yarn问题耗时实验
  • 语音合成个性化设置:保存常用音色模板功能
  • ESP32 FreeRTOS任务管理大全:概念、实现、优化与调试的一站式学习手册
  • 2025AAAI-DivShift: Exploring Domain-Specific Distribution Shift in Large-Scale, Volunteer-Collected
  • 信息系统项目管理师论文考情分析及评分标准
  • 创业者必看!深圳注册代办公司靠谱之选-权威盘点
  • 2025AAAI-Revelations: A Decidable Class of POMDPs with Omega-Regular Objectives
  • EmotiVoice在短视频配音中的高效应用模式
  • 2025年靠谱的国产操作系统厂家排行榜,国产操作系统服务与家 - 工业推荐榜
  • 【TMS320开发】基于TMS320F28377SPTPS的SPI通信开发实战
  • vue基于springboot的高校两校区通勤校车预约系统的设计与实现 论文
  • 2025年男孩取名机构联系方式汇总:全国知名机构官方联系通道与专业选择指南 - 品牌推荐