v3.17.40 重构阶段3(第一批) · Vue 去 window 数据镜像
v3.17.40 重构阶段 3(第一批)· Vue 去 window 数据镜像
依据 docs/重构计划-2026-09-11.md 阶段 3 执行(第一批)。
| 步骤 | 改动 |
|---|---|
| S3.1a | todoStore:初始状态不再取 window.allTodos(改 ref([]),数据由 loadTodos() 经原生桥加载);isDone() 改查自身 todos;deleteTodo()/updateTodo() 改为先更新自身状态再发布到 window(过渡期兼容) |
| S3.1b | reminderStore:reminders/reminderRecords 初始为空;refreshFromWindow() / refreshReminderList() / refreshReminderHistory() 增加类型守卫,不再把 window 当数据源 |
| S3.2a | TodoModal:农历换算改为 import { lunarToSolar } from '../utils.js';修复隐患——文件内原有同名本地包装函数,直接 import 同名会造成自我递归,改为 import 原名 + 本地薄封装 lunarDateToSolar |
原则:Vue 不再读 window 镜像;仍保留写(经典层未下线,属过渡期兼容,阶段 4 一并移除)。
验证(agent-browser 实测)
window.allReminders仍被 store 加载后发布(4 条),过渡期兼容未破坏- 打卡页:喝水 8 杯、提醒相关元素 24、待办行 4 → 列表渲染正常
- 日历页:Vue 网格 35 格(+ 隐藏经典 35 格);记账页占比条 4 段;总览时间线 5 行
- 全流程
window.onerror= 0
顺序修订(重要)
执行中发现 S3.1c 反向依赖 S4.1:window.allData 由经典层 calendar.js loadAllData() 产出,只有先把数据服务迁到 Vue 侧才能去掉读取。故 S3.1c + S3.2b + S3.3 与 S4.1 合并推进(详见计划文档 §9)。
下一步(阶段 3 第二批 / 阶段 4 起点)
src/lib/dataService.js(迁移 loadAllData/refreshAllData)→ 去掉 calendarStore/StatsPage 对 window.allData 的读取 → CalendarView/StatsPage 直连 holidays → src/lib/bridge.js 统一 calendarAPI → exportStatsAsImage 迁移 → 删除 .app 死壳与经典渲染层 → 收窄 shims.js。